Chewy API endpoint
Returns the full set of refinement options (facets) a Chewy category or keyword search can be narrowed by -- brand, sub-category, lifestage, food form, breed size, special diet, health feature, flavor, ingredient, packaging type, price band, customer rating, and whichever other dimensions that listing exposes -- with each option's product count. No products are returned, so this is a much smaller call than chewy_category/chewy_search when only the option set is wanted. The Brand dimension is effectively Chewy's brand directory for the requested listing: each brand option carries its product count and, where Chewy publishes one, its own chewy.com/brands/<slug>-<id> landing-page slug in seo_hvf_slug. Exactly one of group_id or q is required. Every facets[].value paired with one of that facet's options[].value is a ready-to-use filter key:value pair for this endpoint, chewy_category, and chewy_search alike; passing filter here narrows the listing first, so the returned counts describe the already-narrowed result set. A group_id Chewy does not recognize returns a 404 rather than an empty option set.
/chewy/facetsReturns the full set of refinement options (facets) a Chewy category or keyword search can be narrowed by, with each option's product count and no products attached. Sourced from chewy.com's own client-side plp/api/facets JSON API -- not DOM scraping.
Because it carries no product grid, this is a much smaller call than /chewy/category or /chewy/search when only the option set is wanted (roughly 5x smaller upstream payload for the same category).
Query parameters:
group_id -- Chewy's own numeric category id, the trailing id segment of a chewy.com/b/<slug>-<id> browse URL, e.g. 294 for /b/dry-food-294.q -- free-text search keywords to return refinement options for, e.g. salmon dog food. At most 200 characters.group_id or q is required; passing both, or neither, is a 400.filter -- optional, repeatable, up to 10 values. Each value is "key:value" -- pair a facets[].value (e.g. "brand_facet", "price_d") with one of that facet's options[].value (e.g. "ACANA", "1"). Multiple filter values combine as AND. Applying a filter narrows the listing first, so the returned option counts describe the already-narrowed result set.Notable response behavior:
Brand dimension (facets[].value == "brand_facet") is effectively Chewy's brand directory for the requested listing -- every brand carrying at least one matching product, with its product count. A top-level department returns thousands of brands (e.g. group_id=288, Dog, returns over 3,000).options[].seo_hvf_slug, present on brand options Chewy publishes a landing page for, is that brand's own chewy.com/brands/<slug>-<id> page slug (e.g. acana-dry-dog-food) -- Chewy's canonical brand name for URL purposes. It is scoped to the listing being refined (ACANA is acana-dry-dog-food under group_id=294 but acana-dog-food under its parent 332), and Chewy publishes one for far fewer brands at department level than at sub-category level. options[].url_slug is the equivalent for a sub-category option.options[].id is Chewy's own internal id for the option, omitted where upstream has none (the synthetic Category, Price and Customer Rating dimensions).facets[].value paired with one of that facet's options[].value is a ready-to-use filter key:value pair for this endpoint, /chewy/category, and /chewy/search alike. When facets[].value is "categoryId", each options[].value is also a ready-to-use group_id.total is the number of products the requested listing matches (after any filter is applied). count is the number of facet dimensions returned.group_id Chewy does not recognize returns a 404 rather than an empty option set. A q that matches nothing returns 200 with an empty facets array and total of 0.| Field | Filled in, of 12 checked | Values in the sample |
|---|---|---|
| name | 12 | “Category” and 11 other values |
| value | 12 | “categoryId” and 11 other values |
| count | 12 | 1 to 174, median 6 |
| options | 12 | median 6 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| group_id | string | No | Chewy's numeric category id, e.g. \ | 294 | |
| q | string | No | Free-text search keywords to return refinement options for, e.g. \ | salmon dog food | |
| filter | array<string> | No | Repeatable, up to 10. Each value is \ | brand_facet:ACANA | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/chewy/facets?q=coffee" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"group_id": "294",
"total": 2208,
"count": 2,
"facets": [
{
"name": "Category",
"value": "categoryId",
"count": 1,
"options": [
{
"name": "Health Condition",
"display_label": "Health Condition Dry Dog Food",
"value": "132958",
"url_slug": "science-backed-formulas",
"product_count": 752
}
]
},
{
"name": "Brand",
"value": "brand_facet",
"count": 2,
"options": [
{
"id": "507405",
"name": "ACANA",
"display_label": "ACANA",
"value": "ACANA",
"seo_hvf_slug": "acana-dry-dog-food",
"product_count": 93
},
{
"id": "330132",
"name": "Purina Pro Plan",
"display_label": "Purina Pro Plan",
"value": "Purina Pro Plan",
"seo_hvf_slug": "Purina-Pro-Plan-Dry-Dog-Food",
"product_count": 142
}
]
}
],
"source_url": "https://www.chewy.com/plp/api/facets?catalogId=1004&groupId=294",
"fetched_at": "2026-09-05T10:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/chewy.facetsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | chewy.FacetsResponse | No | ||||
| data.count | integer | No | 12 | |||
| data.facets | array | No | ||||
| data.facets[].count | integer | No | 322 | |||
| data.facets[].name | string | No | Brand | |||
| data.facets[].options | array | No | ||||
| data.facets[].options[].display_label | string | No | ACANA | |||
| data.facets[].options[].id | string | No | 507405 | |||
| data.facets[].options[].name | string | No | ACANA | |||
| data.facets[].options[].product_count | integer | No | 93 | |||
| data.facets[].options[].seo_hvf_slug | string | No | acana-dry-dog-food | |||
| data.facets[].options[].url_slug | string | No | dry-food | |||
| data.facets[].options[].value | string | No | ACANA | |||
| data.facets[].value | string | No | brand_facet | |||
| data.fetched_at | string | No | ||||
| data.group_id | string | No | 294 | |||
| data.query | string | No | salmon dog food | |||
| data.source_url | string | No | ||||
| data.total | integer | No | 2208 | |||
| 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/facets?q=coffee" \
-H "x-api-key: $CRAWLORA_API_KEY"