Kroger API endpoint
Returns Kroger's full product-browse category taxonomy: every slug/category_id pair kroger-search and kroger-category accept, each with its department and full breadcrumb. This is how to discover valid slug/category_id values -- previously the only way was to already have one from a search response's facet group. Sourced from Kroger's own site navigation menu; covers every category a shopper can browse to from Kroger's site menu (321 at time of writing across 7 departments). Takes no parameters.
/kroger/categoriesReturns Kroger's full product-browse category taxonomy: how to discover
slug/category_id pairs for kroger-search and
kroger-category, not the products within a category.
Previously the only way to learn a valid category_id/slug was to already
have one from a search response's facet group; this closes that gap. Sourced
from Kroger's own site navigation menu (the same JSON Kroger's frontend
renders its department/category dropdown from).
Requires the x-api-key header. Takes no parameters.
Notable response behavior:
categories[] is a flat list — every leaf category a shopper can browse
to from Kroger's own site menu. 321 entries across 7 departments (Fresh,
Grocery, Beer/Wine/Liquor, Health/Beauty/Baby, Cleaning/Household,
Home/Electronics/Toys, Pet) at time of writing.category_id and slug are directly usable as
kroger-category's own category_id and slug query parameters.department is a convenience field equal to breadcrumb[0].breadcrumb is the full department > aisle > category path. Kroger's own
menu sometimes repeats a level's name at the next level down (e.g. "Fresh
Fruit & Vegetables" as both an aisle group and its own sole subgroup); that
repetition is collapsed so the breadcrumb reads cleanly without losing a
real hierarchy level.departments lists the top-level departments that contributed at least
one category, in Kroger's own menu order. Kroger's site menu carries 12
top-level entries in total; the other 5 ("Popular", "Seasonal Favorites",
"Our Brands", "Gift Cards", "Explore More") are marketing shortcuts with no
category-browse links and are correctly excluded rather than padding the
list with unusable entries.category_id can legitimately appear more than once, cross-listed
under different departments with a different display slug (e.g. Kroger's
own menu lists id 05017 as both "Bacon & Breakfast Sausage" under
Fresh > Meat and under Grocery > Breakfast). Both entries are kept — neither
is a duplicate to collapse away.category_id values coarser than any entry returned here — the originally-shipped kroger-category example (slug=pet, category_id=27) is a top-level department id, one level up from every leaf id this endpoint enumerates (Kroger's own menu links to a /d/pet-supplies landing page for "Shop All Pet" instead of a /pl/ category id). That coarser department-id space is not enumerated by this endpoint. Every slug/category_id pair this endpoint does return works with kroger-category.| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/kroger/categories" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"count": 321,
"departments": [
"Fresh",
"Grocery",
"Beer, Wine & Liquor",
"Health, Beauty & Baby",
"Cleaning & Household",
"Home, Electronics & Toys",
"Pet"
],
"categories": [
{
"category_id": "06111",
"slug": "fresh-fruit",
"name": "Fresh Fruit",
"department": "Fresh",
"breadcrumb": [
"Fresh",
"Fresh Fruit & Vegetables",
"Fresh Fruit"
],
"url": "https://www.kroger.com/pl/fresh-fruit/06111"
}
],
"source_url": "https://www.kroger.com/atlas/v1/dynamic-experience/v1/amp-experiences/navigation/1.0.0/site-menu-v2"
}
}Request schema
No body schema
Response schema
#/definitions/kroger.categoriesResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | kroger.CategoriesResponse | No | ||||
| data.categories | array | No | ||||
| data.categories[].breadcrumb | array | No | Breadcrumb is the full department > aisle > category path, deduplicated where Kroger's own menu repeats a level's name at the next level down. | |||
| data.categories[].category_id | string | No | ||||
| data.categories[].department | string | No | Department is the top-level department this category rolls up under (Breadcrumb[0]), included as a convenience field for grouping/filtering without parsing Breadcrumb. | |||
| data.categories[].name | string | No | ||||
| data.categories[].slug | string | No | ||||
| data.categories[].url | string | No | URL is the canonical kroger.com category-browse page URL. | |||
| data.count | integer | No | ||||
| data.departments | array | No | Departments lists the top-level departments that contributed at least one category below, in Kroger's own menu order. | |||
| data.source_url | string | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 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/kroger/categories" \
-H "x-api-key: $CRAWLORA_API_KEY"