H&M API: prijzen, kleuren en maten van hm.com/nl als JSON
Deze API leest de Nederlandse webshop van H&M (www2.hm.com/nl_nl) zoals een klant hem ziet: naam, prijs in euro, de oorspronkelijke prijs zolang een artikel is afgeprijsd, elke kleur als apart artikel en per maat of die nog te bestellen is. Dit is geen officiële H&M-koppeling: leveranciers, merkpartners en affiliates die bestellingen of productfeeds met H&M willen uitwisselen, hebben hier niets aan. Er worden alleen openbare winkelgegevens gelezen, op het moment dat je de aanroep doet. De markt kies je met `country`. Laat je die weg, dan antwoordt de Amerikaanse winkel, met dollarprijzen en een ander assortiment.
Endpoints
| endpoint | Wat je terugkrijgt | Verplicht |
|---|---|---|
| search | Zoeken op een trefwoord zoals een klant het intypt ('spijkerbroek dames'). Per product: artikelcode, naam, prijs, de reguliere prijs als het artikel is afgeprijsd, kortingspercentage, ledenprijs apart, alle kleuren, maten met een voorraadvlag, labels en beschikbaarheid. Sorteren op nieuwste of prijs; filteren op afdeling, kleur, materiaal en uitverkoop. Tot 72 per pagina. | query |
| product/detail | Het volledige artikel op artikelcode, productcode of url: naam, categorie en kruimelpad, omschrijving, prijs met reguliere prijs en korting, ledenprijs apart, elke maat met 'op voorraad' en 'bijna uitverkocht', samenstelling per onderdeel, duurzamere materialen, wasvoorschrift, lengte en maat van het model, beoordeling met de reviews die op de pagina staan, en elke andere kleur met een eigen prijs en eigen maten. | article_code |
| category | Alle producten van één categoriepagina (bijvoorbeeld /dames/shop-by-product/jeans.html), met dezelfde regels, sortering en paginering als search. | allemaal optioneel |
| search/suggest | De suggesties uit het zoekvak van H&M. Bij 'spijkerbr' waren dat spijkerbroek, spijkerbroek dames, spijkerbroek jongens, spijkerbroek heren en spijkerbroek meisjes. | query |
| product/availability | Voor elke kleur van één product: welke maten te bestellen zijn en welke H&M als bijna uitverkocht markeert. Een lichte aanroep, bedoeld om de voorraad in de gaten te houden. | article_code |
Elke aanroep kost credits. Mislukte en geblokkeerde aanroepen zijn gratis.
Werkend voorbeeld
De kleurfilter werkt met de Nederlandse waarde uit `filters_available`: `zwart_000000` gaf 140 spijkerbroeken, het Engelse `black_000000` gaf 0 resultaten zonder foutmelding. Bovenaan staat een Bootcut Regular Jeans voor € 15,99 in plaats van € 29,99 (47% korting), maar alleen nog in maat 32 en 34; 8 van de 10 maten waren uitverkocht. Wie de goedkoopste broek zoekt, kijkt dus ook naar `sizes_in_stock`.
curl -X POST https://api.reefapi.com/hm/v1/search \
-H "x-api-key: JOUW_API_SLEUTEL" \
-H "content-type: application/json" \
-d '{"query": "spijkerbroek dames", "country": "nl", "color": "zwart_000000", "sort": "price_asc", "page_size": 36}'{
"ok": true,
"data": {
"results": [
{
"article_code": "1316050003",
"product_code": "1316050",
"name": "Bootcut Regular Jeans",
"brand": "H&M",
"url": "https://www2.hm.com/nl_nl/productpage.1316050003.html",
"price": 15.99,
"regular_price": 29.99,
"on_sale": true,
"discount_percent": 47,
"member_price": null,
"price_formatted": "€ 15,99",
"currency": "EUR",
"color_name": "Zwart",
"color_count": 4,
"sizes": [
{ "size_code": "001", "label": "32", "in_stock": true },
{ "size_code": "002", "label": "34", "in_stock": true },
{ "size_code": "003", "label": "36", "in_stock": false },
...
],
"sizes_in_stock": 2,
"main_category": "ladies_jeans_bootcut",
...
},
{
"article_code": "1239854001",
"name": "Flared Low Jeans",
"price": 15.99,
"regular_price": 24.99,
"on_sale": true,
"discount_percent": 36,
"color_name": "Zwart/washed out",
"sizes_in_stock": 1,
...
},
...
],
"count": 36,
"total_results": 140,
"total_pages": 4,
"has_more": true,
"sort_applied": "price_asc",
"filters_applied": { "color": "zwart_000000" },
"locale": "nl_nl",
"currency": "EUR"
},
"meta": { "record_count": 36, "charged_credits": 1, "cache_hit": false, "mode": "live" }
}Een H&M-scraper die nooit een foutmelding geeft en toch verkeerd telt
Een productpagina van H&M kent drie prijzen: de gewone prijs, de rode prijs voor iedereen en de gele ledenprijs. Neem je simpelweg de laagste, dan sla je een ledenprijs op als winkelprijs. Toen we de engine bouwden, hebben we dat op de Franse site nageteld: bij de zoekopdracht 'jean' zou het 15 van de 36 rijen een prijs geven die alleen leden betalen. Hier staat de ledenprijs altijd in `member_price` en nooit in `price`.
Blader je voorbij de laatste pagina, dan geeft H&M geen lege lijst terug maar opnieuw pagina 1 (of een andere bestaande pagina). Een scraper die doorgaat tot er niets meer komt, stopt dus nooit en slaat dezelfde broeken telkens opnieuw op. De engine vergelijkt de gevraagde met de teruggegeven pagina en meldt `page_out_of_range`. Ook een artikelcode die niet bestaat geeft op de site geen 404: je krijgt HTTP 200 met de homepage.
In de ruwe zoekdata staat bij elke maat een getal, maar dat is een code en geen aantal: 2 betekent te bestellen, 0 niet. Over 144 rijen telden we 888 keer een 2 en 62 keer een 0, en geen enkele 1. Wie dat getal als stuks leest, denkt dat er van elke maat precies twee op voorraad zijn. Hier is het `in_stock` waar of onwaar, en de productpagina voegt `few_left` toe als H&M aangeeft dat er nog maar weinig zijn.
En dan het prijsverschil tussen kleuren. Elke kleur is bij H&M een eigen artikel met een eigen prijs. De Wide High Waist Jeans had op 26 oktober 37 kleurvarianten: 25 voor € 29,99 en 12 afgeprijsd, van € 14,99 tot € 23,99. Wie alleen het artikel uit de zoekresultaten bewaart (1222670054, € 29,99), mist dat twaalf andere kleuren van dezelfde broek goedkoper waren.
Meer documentatie in het Nederlands
Grenzen en eerlijke kanttekeningen
- H&M heeft deze API niet gemaakt of goedgekeurd, en wij werken niet samen met H&M.
- `sale_only` werkt op hm.com/nl op dit moment niet. Op 26 oktober 2026 gaf `sale_only: true` drie keer 0 resultaten ('spijkerbroek dames', 'jas', en spijkerbroek dames in zwart), terwijl in dezelfde zwarte lijst 12 van de eerste 36 rijen een rode prijs hadden. H&M's eigen telling noemde alle 140 'niet in de uitverkoop'. Filter daarom zelf op `on_sale`. Zo'n lege aanroep slaagt technisch en kost dus 1 credit.
- Filterwaarden zijn per markt in de taal van die markt: kleuren als `zwart_000000` of `blauw_0000ff`, materialen als `Katoen`. Een Engelse waarde geeft geen fout, maar 0 resultaten. Haal de geldige waarden eerst uit `filters_available` van een gewone zoekopdracht.
- Productnamen zijn op hm.com/nl grotendeels Engels ('Wide High Waist Jeans', 'Bootcut Regular Jeans'), met hier en daar een Nederlandse ('Broek met barrel-pijpen'). Kleurnamen, omschrijving, kruimelpad en wasvoorschrift zijn wel Nederlands, en Nederlandse zoekwoorden werken: 'spijkerbroek dames' gaf 1.019 resultaten.
- `product/availability` geeft maatcodes ('002') zonder maatlabel; welke maat dat is (34, 36…) staat in `product/detail` onder `sizes`. Voor de Wide High Waist Jeans gaf availability 11 kleuren terug, terwijl product/detail er 37 noemt.
- Voorraad is ja of nee per maat, geen aantal, en voorraad per winkel publiceert H&M niet. Van de reviews krijg je alleen de (hooguit 10) reviews die op de productpagina staan (`reviews_sample`); de Wide High Waist Jeans had er 688.
- Land van productie (`country_of_production`) bleef leeg bij de Nederlandse jeans. In onze metingen publiceert H&M dat alleen op de Franse site.
- search, search/suggest en product/availability kosten 1 credit per aanroep, product/detail en category 2.