Chewy API endpoint
Returns one page of a Chewy product's customer questions, each with its answers (text, author, date, staff flag, helpful count). chewy_product embeds only the first 20 questions with no way to page past them; this endpoint reaches the whole set. id is the numeric id from any chewy.com PDP URL, and questions are shared across a product's variants, so any variant's id returns the same set. Each question reports answers_total alongside its answers array, so a caller can tell when answers were truncated by answer_limit. Chewy offers no sort or filter on questions, so this endpoint deliberately exposes paging only.
/chewy/product-questions/chewy/product embeds only the first 20 questions with no way to page past
them. This endpoint reaches the whole set (142 on part number 767806).
Query parameters:
id -- required. The numeric id from a chewy.com PDP URL, e.g. 767806
from https://www.chewy.com/<any-slug>/dp/767806. Questions are shared
across a product's variants, so any variant's id returns the same set.page -- optional, 1-based, defaults to 1.limit -- optional, 1 to 50, defaults to 20.answer_limit -- optional, 1 to 20, defaults to 10. How many answers
to return per question.Notable response behavior:
answers_total alongside its answers array, so a
caller can tell when answers were truncated by answer_limit.questions[].answers[] has submitted_by/submitted_at
and the question itself does not.questions array with
has_next_page: false.404; a non-numeric id or an
out-of-range limit/answer_limit returns a 400.| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| id | 20 | |
| text | 20 | |
| answers_total | 6 | 1 to 4, median 1 |
| answers | 6 | median 1 entry |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| id | string | Yes | The numeric id from a chewy.com PDP URL, e.g. \ | 767806 | |
| page | integer | No | Page number, 1-based (default 1). | 1 | |
| limit | integer | No | Questions per page, 1 to 50 (default 20). | 20 | |
| answer_limit | integer | No | Answers to return per question, 1 to 20 (default 10). Each question also reports answers_total. | 10 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/chewy/product-questions?id=767806&page=1&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"part_number": "67742",
"total": 142,
"page": 1,
"page_size": 20,
"count": 20,
"has_next_page": true,
"questions": [
{
"id": "…",
"text": "What is the difference between small breed and adult?",
"answers_total": 3,
"answers": [
{
"text": "Small breed has smaller kibble size and more calories.",
"submitted_by": "Elizabeth",
"submitted_at": "2026-07-02T18:41:00Z",
"helpful_count": 1
}
]
}
],
"source_url": "https://www.chewy.com/api/pdp/graphql",
"fetched_at": "2026-09-07T04:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/chewy.questionsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | chewy.QuestionsResponse | No | ||||
| data.count | integer | No | ||||
| data.fetched_at | string | No | ||||
| data.has_next_page | boolean | No | ||||
| data.page | integer | No | 1 | |||
| data.page_size | integer | No | 20 | |||
| data.part_number | string | No | 67742 | |||
| data.questions | array | No | ||||
| data.questions[].answers | array | No | ||||
| data.questions[].answers[].helpful_count | integer | No | ||||
| data.questions[].answers[].id | string | No | ||||
| data.questions[].answers[].is_staff | boolean | No | ||||
| data.questions[].answers[].submitted_at | string | No | ||||
| data.questions[].answers[].submitted_by | string | No | ||||
| data.questions[].answers[].text | string | No | ||||
| data.questions[].answers_total | integer | No | AnswersTotal is how many answers the question has upstream, which can exceed len(Answers) when a caller limits them. Only chewy_questions selects it; chewy_product leaves it zero and omitempty hides it, so that endpoint's payload is unchanged. | |||
| data.questions[].id | string | No | ||||
| data.questions[].is_staff_answered | boolean | No | ||||
| data.questions[].text | string | No | ||||
| data.source_url | string | No | ||||
| data.total | integer | No | 142 | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/chewy/product-questions?id=767806&page=1&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"