Zalando API endpoint
Returns a Zalando country storefront's live top-level category navigation, department by department. This is the discovery source for zalando-category's category parameter — category slugs are market-specific (each storefront uses its own local-language slug), so there is no fixed value space to hardcode; this endpoint returns the live values instead. market is required (there is no default storefront) and accepts 25 country storefronts — see zalando-markets for the full current list with domains. department optionally restricts the response to one of women, men, or kids; omitting it returns all three. Scope note: only the top-level nav tabs (e.g. Clothing, Shoes, Sports) are returned, not each tab's own hover-revealed mega-menu of sub-categories.
/zalando/categoriesReturns a Zalando country storefront's live top-level category navigation, department by department, scraped directly from that department's own storefront nav tab bar (e.g. Clothing, Shoes, Sports). This is the discovery source for zalando-category's category parameter — category slugs are market-specific (each storefront uses its own local-language slug), so there is no fixed value space to hardcode; this endpoint asks the upstream live instead, the same way zalando-search/zalando-category/zalando-suggest already do.
market is required — there is no default storefront. market accepts at, be, ch, cz, de, dk, ee, es, fi, fr, gb, hr, hu, ie, it, lt, lu, lv, nl, no, pl, ro, se, si, sk (see zalando-markets for the full reference list with domains). department is optional and restricts the response to one of women, men, kids; omitting it fetches and returns all three.
Scope: only the top-level nav tabs are returned, not each tab's own hover-revealed mega-menu of sub-categories (e.g. Clothing's own "Dresses", "Jeans", "Knitwear" panel), which is not available. zalando-category still accepts any category slug you find elsewhere (a product's own url field, or the site's own mega-menu) — this endpoint just provides a live starting set per market/department rather than requiring you to read it off the site by hand.
Each category entry's category value is exactly what zalando-category's category parameter expects. A handful of nav-bar entries that are campaign/filtered links rather than real category pages (e.g. a "Smart Prices" tab pointing at /women/?price_to=50, or a "Basics" tab carrying a ?camp=... tracking parameter) are excluded rather than guessed at, since they don't resolve to a plain category slug.
| Field | In the sample | Value in the sample |
|---|---|---|
| market | Has a value | “de” |
| department | Has a value | “women” |
| count | Has a value | 12 |
| source_urls | Has a value | 1 entry |
| categories | Has a value | 12 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| market | string | Yes | Zalando country storefront Allowed values: at, be, ch, cz, de, dk, ee, es, fi, fr, gb, hr, hu, ie, it, lt, lu, lv, nl, no, pl, ro, se, si, sk. | at | |
| department | string | No | Restrict to one Zalando shopping department. Omit to return all three. Allowed values: women, men, kids. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/zalando/categories?market=at&department=women" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"market": "de",
"count": 11,
"source_urls": [
"https://en.zalando.de/women-home/"
],
"fetched_at": "2026-09-16T12:00:00Z",
"categories": [
{
"department": "women",
"name": "Clothing",
"category": "womens-clothing",
"url": "https://en.zalando.de/womens-clothing/"
},
{
"department": "women",
"name": "Shoes",
"category": "womens-shoes",
"url": "https://en.zalando.de/womens-shoes/"
},
{
"department": "women",
"name": "Sports",
"category": "sports-range",
"url": "https://en.zalando.de/sports-range/"
}
]
}
}Request schema
No body schema
Response schema
#/definitions/zalando.categoriesResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | zalando.CategoriesResponse | No | ||||
| data.categories | array | No | ||||
| data.categories[].category | string | No | womens-clothing | |||
| data.categories[].department | string | No | women | |||
| data.categories[].name | string | No | Clothing | |||
| data.categories[].url | string | No | https://en.zalando.de/womens-clothing/ | |||
| data.count | integer | No | 11 | |||
| data.department | string | No | women | |||
| data.fetched_at | string | No | ||||
| data.market | string | No | de | |||
| data.source_urls | array | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/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/zalando/categories?market=at&department=women" \
-H "x-api-key: $CRAWLORA_API_KEY"