H&M API endpoint
Returns H&M's own storefront category navigation, department by department: every direct nav item and subcategory currently shown in the site's own menu, with its display name and storefront URL. Where this build has separately verified the value against hm-listing's own category_id parameter, that id is included too; category_id is omitted for entries not yet verified rather than guessed, since the visible category label is confirmed NOT a reliable way to derive H&M's real listing category ids for every category. department, when given, filters the result to one department.
/hm/categoriesQuery parameters:
department (optional): filter the result to one storefront department. Allowed values: women, men, kids, home, beauty.Notable response behavior:
section is the nav group it lives under (e.g. "Clothing", "Accessories", "Shoes"), and is empty for a department's own direct nav item (e.g. "New in").category_id, when present, is the value to pass as hm-listing's own category_id query parameter. It is included only where separately verified against hm-listing's upstream, and is omitted -- not guessed -- for every other live nav entry, since the visible category label is confirmed not to reliably derive H&M's real listing category id for every category (for example, "T-shirts & Tops" resolves to men_tshirtstanks, not a slug built from the label).section for its own children.category_id enrichment is a periodically-refreshed reference table, so a brand-new category may appear with a name and URL before its category_id has been separately verified.source_url reflects which of two sources served the request (https://app2.hm.com/... or https://www2.hm.com/...). Both produce the same response shape.| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| department | string | No | Filter to one storefront department Allowed values: women, men, kids, home, beauty. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/hm/categories?department=women" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://app2.hm.com/content/hmonline/en_us/apis/navigation/v5/nav-data.json",
"fetched_at": "2026-08-15T08:00:00Z",
"categories": [
{
"department": "women",
"section": "",
"name": "New in",
"url": "https://www2.hm.com/en_us/ladies/new-arrivals.html"
},
{
"department": "women",
"section": "Clothing",
"name": "Dresses",
"url": "https://www2.hm.com/en_us/ladies/shop-by-product/dresses.html",
"category_id": "ladies_dresses"
}
]
}
}Request schema
No body schema
Response schema
#/definitions/hm.categoriesResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | hm.CategoriesResponse | No | ||||
| data.categories | array | No | ||||
| data.categories[].category_id | string | No | ||||
| data.categories[].department | string | No | ||||
| data.categories[].name | string | No | ||||
| data.categories[].section | string | No | ||||
| data.categories[].url | string | No | ||||
| data.fetched_at | string | No | ||||
| data.source_url | string | 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/hm/categories?department=women" \
-H "x-api-key: $CRAWLORA_API_KEY"