H&M API endpoint
Returns one H&M product's full detail: every purchasable color grouped with its own per-size price and live availability, plus an aggregate rating and real customer reviews (author label, date, body, rating, and any fit-feedback tags the reviewer left, such as "True to Size") when the product has any. This data is not available from hm-listing or hm-search, which only carry one representative price and a per-color stock count. product_id is the numeric id from a listing/search result's id field or its url field's productpage.<id>.html segment. An unrecognized product_id returns 404.
/hm/product/{product_id}product_id is required and is the numeric id from a listing/search result's id field, or the digits in a product-page URL's productpage.<id>.html segment (e.g. 1268470004).
Notable response behavior:
colors groups every purchasable color of the base product, with each color's sizes[] carrying its own real per-SKU price and live availability -- unlike listing/search, which only carry one representative price and a per-color stock count for the whole product.colors[0] entry with an empty name.rating is present only when the product has at least one review; a product with none omits it entirely rather than sending a zero value. Responses can come from either of two sources depending on upstream availability; one of them never carries rating/review data, so its absence does not always mean the product genuinely has none.reviews[].author is a plain display label (e.g. "Verified Buyer"), not a personal name -- H&M does not expose reviewer names through this data.reviews[].dimensions[], when present, is fit feedback the reviewer left alongside their review text (e.g. {"label":"True to Size","value":"True to Size"}) -- not every review carries this.availability values are normalized from schema.org's full URL form (e.g. https://schema.org/InStock) down to the bare name (e.g. InStock, OutOfStock).product_id returns 404. A non-numeric or missing product_id returns 400 before any upstream request is made.| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| product_id (path) | string | Yes | Numeric H&M product id, from a listing/search result's id field | 1268470004 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/hm/product/1268470004" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"product_id": "1268470004",
"name": "Finn Relaxed Fit Jeans",
"description": "Relaxed-fit jeans in washed cotton denim.",
"brand": "H&M",
"material": "Cotton",
"pattern": "Solid-color",
"gender": "male",
"url": "https://www2.hm.com/en_us/productpage.1268470004.html",
"source_url": "https://www2.hm.com/en_us/productpage.1268470004.html",
"fetched_at": "2026-08-10T08:00:00Z",
"rating": {
"value": 5,
"count": 10
},
"reviews": [
{
"author": "Verified Buyer",
"date": "2025-10-31",
"body": "Great fit, true to size.",
"rating": 5,
"dimensions": [
{
"label": "True to Size",
"value": "True to Size"
}
]
}
],
"colors": [
{
"name": "Dark denim blue",
"image_url": "https://image.hm.com/assets/hm/...jpg",
"sizes": [
{
"sku": "1268470001008",
"size": "1½-2Y",
"price": 19.99,
"currency": "USD",
"availability": "OutOfStock",
"url": "https://www2.hm.com/en_us/productpage.1268470001.html"
}
]
}
]
}
}Request schema
No body schema
Response schema
#/definitions/hm.productDetailResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | hm.ProductDetailResponse | No | ||||
| data.brand | string | No | ||||
| data.colors | array | No | ||||
| data.colors[].image_url | string | No | ||||
| data.colors[].name | string | No | ||||
| data.colors[].sizes | array | No | ||||
| data.colors[].sizes[].availability | string | No | ||||
| data.colors[].sizes[].currency | string | No | ||||
| data.colors[].sizes[].price | number | No | ||||
| data.colors[].sizes[].size | string | No | ||||
| data.colors[].sizes[].sku | string | No | ||||
| data.colors[].sizes[].url | string | No | ||||
| data.description | string | No | ||||
| data.fetched_at | string | No | ||||
| data.gender | string | No | ||||
| data.material | string | No | ||||
| data.name | string | No | ||||
| data.pattern | string | No | ||||
| data.product_id | string | No | ||||
| data.rating | hm.ProductDetailRating | No | ||||
| data.rating.count | integer | No | ||||
| data.rating.value | number | No | ||||
| data.reviews | array | No | ||||
| data.reviews[].author | string | No | ||||
| data.reviews[].body | string | No | ||||
| data.reviews[].date | string | No | ||||
| data.reviews[].dimensions | array | No | ||||
| data.reviews[].dimensions[].label | string | No | ||||
| data.reviews[].dimensions[].value | string | No | ||||
| data.reviews[].rating | number | No | ||||
| data.source_url | string | No | ||||
| data.url | string | No | ||||
| 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/hm/product/1268470004" \
-H "x-api-key: $CRAWLORA_API_KEY"