Kroger API endpoint
Use Crawlora's Kroger category API to extract supported public Kroger data as structured JSON. This page includes request parameters, cURL examples, response schema, error behavior, credit cost, and a Playground link for testing before integration.
/kroger/categoryBrowses a Kroger product category and returns normalized product cards plus facet groups, in the same shape as kroger-search. slug and category_id together identify the category (e.g. "pet" and "27" for kroger.com/pl/pet/27). Served from Kroger's own search JSON API using category_id as a taxonomy filter, with real upstream pagination; it falls back to parsing the rendered category page if that path is unavailable, and the source field reports which path answered. Facet filters and sort apply to the JSON path only: when any of them is set, a JSON-path failure returns an error rather than silently falling back to unfiltered results. Developers commonly use this endpoint for data enrichment, monitoring, research dashboards, internal automation, and agent-native workflows that need repeatable structured public web data. Authentication uses the documented Crawlora headers, and usage is metered with the credit cost shown on this page.
Request parameters are generated from the active endpoint catalog. Required values must be sent before Crawlora can call the upstream public web data source.
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| slug | string | Yes | Category URL slug segment | ||
| category_id | string | Yes | Category numeric taxonomy id | ||
| page | integer | No | One-based result page Minimum: 1. | ||
| sort | string | No | Result order. One of: relevance, name_asc, popularity_desc Allowed values: relevance, name_asc, popularity_desc | ||
| brands | string | No | Comma-separated brand names to filter by, taken verbatim from a previous response's facets | ||
| nutrition | string | No | Comma-separated nutrition/dietary facet values | ||
| flavor | string | No | Comma-separated flavor facet values | ||
| scent | string | No | Comma-separated scent facet values | ||
| savings | string | No | Comma-separated savings facet values | ||
| more_options | string | No | Comma-separated more-options facet values | ||
| price_min | number | No | 0 | Lower bound of the price filter; defaults to 0 | |
| price_max | number | No | Upper bound of the price filter; required to filter on price | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/kroger/category?page=1&sort=relevance" \ -H "x-api-key: $CRAWLORA_API_KEY"
Send your scraping API key in the x-api-key header. Use the console API Keys page to rotate or select the active key.
Endpoint usage is metered in credits. The plan prices, included credits, limits, and overage rates below match the active backend billing configuration.
| Plan | Price | Included credits | Daily cap | Rate limit | Overage |
|---|---|---|---|---|---|
| Free | $0/mo | 2,000 | 500 daily credits | 5/min | No overage |
| Starter | $9/mo | 20,000 | 5,000 daily credits | 15/min | $0.75/1,000 overage credits when enabled |
| Growth | $29/mo | 100,000 | 25,000 daily credits | 45/min | $0.45/1,000 overage credits when enabled |
| Pro | $79/mo | 400,000 | No daily cap | 120/min | $0.30/1,000 overage credits |
| Business | $199/mo | 1,200,000 | No daily cap | 300/min | $0.20/1,000 overage credits |
| Enterprise | $499/mo | 5,000,000 | No daily cap | 1,000/min | $0.12/1,000 overage credits |
This endpoint is executed through Crawlora's managed scraping infrastructure.
Some targets require real browser execution because the data is loaded through JavaScript, dynamic rendering, or interaction-like browser behavior.
For supported endpoints, Crawlora can route requests through a managed browser cluster. This allows Crawlora to execute JavaScript, load dynamic content, apply browser-level request behavior, and normalize the rendered result into JSON.
You do not need to operate your own Playwright, Puppeteer, Chrome, proxy, queue, or retry infrastructure.
- **Filters and sort apply to the `json_api` path only.** When any of them is set and that path fails, the request returns an error instead of falling back to the rendered page — the HTML path cannot honor these filters, so returning its unfiltered results would be wrong. Unfiltered requests still fall back as before. - Each result's `upc` is usable directly as the `upc` query parameter to [`/kroger/product`](kroger-product.md). - `total_count` is Kroger's own count of matching products on the `json_api` path. On the `html` fallback it reflects only what that page reported as loaded. - `source`, `has_more`, `facets`, `brand` and `stock_level` behave exactly as documented for [`/kroger/search`](kroger-search.md) — the two endpoints share one implementation, with `category_id` sent as a taxonomy filter instead of a keyword query. - **Pagination is real on the `json_api` path**; on the `html` fallback it remains best-effort. - A missing `slug` or `category_id` returns `400` before any upstream request is made. Example response: ```json { "code": 200, "msg": "OK", "data": { "slug": "mushrooms", "category_id": "0611200686", "page": 1, "total_count": 28, "products": [ { "upc": "0001111091487", "url": "https://www.kroger.com/p/sliced-white-mushrooms/0001111091487", "title": "Sliced White Mushrooms", "image_url": "https://www.kroger.com/product/images/medium/front/0001111091487", "price": 2.39, "currency": "USD", "size": "8 oz", "snap_ebt_eligible": true, "low_stock": false } ] } } ```
Crawlora does not silently return bad data when the upstream page cannot be used.
| Status | Common failure case |
|---|---|
| 400 | Invalid input or missing required parameter |
| 429 | Plan or endpoint rate limit exceeded |
| 500 | Internal execution error |
| 502 | Upstream platform failed, returned unusable HTML, or served a challenge page that could not be resolved |
When possible, Crawlora returns structured error context so your integration can retry, back off, or inspect the request.
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
{
"code": 200,
"msg": "OK",
"data": {
"slug": "mushrooms",
"category_id": "0611200686",
"page": 1,
"total_count": 28,
"products": [
{
"upc": "0001111091487",
"url": "https://www.kroger.com/p/sliced-white-mushrooms/0001111091487",
"title": "Sliced White Mushrooms",
"image_url": "https://www.kroger.com/product/images/medium/front/0001111091487",
"price": 2.39,
"currency": "USD",
"size": "8 oz",
"snap_ebt_eligible": true,
"low_stock": false
}
]
}
}Request schema
No body schema
Response schema
#/definitions/kroger.categoryResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | kroger.CategoryResponse | No | ||||
| data.category_id | string | No | ||||
| data.facets | array | No | ||||
| data.facets[].group | string | No | ||||
| data.facets[].values | array | No | ||||
| data.facets[].values[].count | integer | No | ||||
| data.facets[].values[].name | string | No | ||||
| data.facets[].values[].slug | string | No | ||||
| data.has_more | boolean | No | HasMore, Source and Facets carry the same meaning as on SearchResponse -- see that type and Search's doc comment. | |||
| data.page | integer | No | ||||
| data.products | array | No | ||||
| data.products[].brand | string | No | Brand and StockLevel are populated by the JSON-API path only (the HTML result cards carry neither); both are omitted when the HTML fallback served the response. See Search's doc comment. | |||
| data.products[].currency | string | No | ||||
| data.products[].image_url | string | No | ||||
| data.products[].low_stock | boolean | No | ||||
| data.products[].original_price | number | No | ||||
| data.products[].price | number | No | ||||
| data.products[].size | string | No | ||||
| data.products[].snap_ebt_eligible | boolean | No | ||||
| data.products[].stock_level | string | No | ||||
| data.products[].title | string | No | ||||
| data.products[].unit_price | string | No | ||||
| data.products[].upc | string | No | ||||
| data.products[].url | string | No | ||||
| data.slug | string | No | ||||
| data.source | string | No | ||||
| data.total_count | integer | No | ||||
| msg | string | No | OK |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/kroger/category?page=1&sort=relevance" \
-H "x-api-key: $CRAWLORA_API_KEY"Crawlora is designed for responsible structured public web data workflows. Customers are responsible for using Crawlora in compliance with applicable laws, third-party rights, target-platform rules, and Crawlora terms.
Read Crawlora terms