H&M API: produkter, priser och storlekar från H&M Sverige i JSON
API:et läser H&M:s svenska webbutik (www2.hm.com/sv_se) utan inloggning och svarar i JSON: produktnamn, pris i kronor, ordinarie pris när ett reapris gäller, medlemspris i ett eget fält, färger, vilka storlekar som går att beställa, materialsammansättning och betyg. Det är inte en integration för H&M:s leverantörer eller partner och har ingen åtkomst till kundkonton eller beställningar; det som läses är det kunden ser i butiken på nätet. Den svenska butiken nås med `"country": "se"`, som behöver skickas med varje gång. Den som vill bygga en egen prisbevakning (H&M price tracker) klarar sig oftast med två anrop: `search` för priset på hela listan och `product/availability` för att se när en storlek tar slut.
Endpoints
| endpoint | Vad som kommer tillbaka | Obligatoriska |
|---|---|---|
| search | Fritextsökning med svenska sökord. Varje rad är en produkt i en färg: priset kunden betalar, ordinarie pris och rabatt i procent när reapris gäller, medlemspris separat, prisets text som H&M skriver den ('439,20 kr.'), färger och storlekar med lagerflagga. Sortering på nyheter eller pris; filter på avdelning, färg, material och rea, med de id:n som `filters_available` själv listar. Upp till 72 produkter per sida. | query |
| product/detail | Hela artikeln utifrån en 10-siffrig artikelkod, en 7-siffrig produktkod eller en URL: beskrivning, materialsammansättning per del av plagget (yttertyg, vaddering, foder), andel återvunnet material, skötselråd, modellens längd och storlek, varje storlek med lagerstatus och 'få kvar', betyg med antal recensioner och alla övriga färger med egna priser och storlekar. | article_code |
| category | Hela innehållet på en kategorisida (en avdelning, en produkttyp, reasidan), sorterat och uppdelat i sidor, med samma rader som sökningen. Kategorins adress står i `breadcrumb` på varje produkt. | alla valfria |
| search/suggest | Förslagen som H&M:s sökruta visar för det kunden har skrivit. | query |
| product/availability | Lagerstatus per storlek, live, för alla färger av en produkt i ett litet anrop: vilka storlekar som går att beställa och vilka H&M markerar med få kvar. | article_code |
Varje anrop debiteras i krediter. Misslyckade och blockerade anrop är gratis.
Fungerande exempel
Alla tolv raderna hade reapris den 25 oktober, samtliga 20 % under ordinarie pris, därav ören som i 439,20 kr. `price` är vad kunden betalar nu och `regular_price` priset före rabatten. Medlemspris fanns inte på någon rad (`member_price: null`). Samma jacka i en annan färg (1345670005, Mörk mullvad) är en egen rad med eget artikelnummer, så spara priser per `article_code` och inte per produktnamn.
curl -X POST https://api.reefapi.com/hm/v1/search \
-H "x-api-key: DIN_NYCKEL" \
-H "content-type: application/json" \
-d '{"query": "jacka", "country": "se", "page_size": 12}'{
"ok": true,
"data": {
"results": [
{
"article_code": "1345670001",
"product_code": "1345670",
"name": "Oversized jacka i pile",
"brand": "H&M",
"url": "https://www2.hm.com/sv_se/productpage.1345670001.html",
"price": 439.2,
"regular_price": 549,
"on_sale": true,
"discount_percent": 20,
"member_price": null,
"price_formatted": "439,20 kr.",
"currency": "SEK",
"color_name": "Mörkbrun",
"color_count": 4,
"sizes": [
{ "size_code": "002", "label": "XS", "in_stock": true },
{ "size_code": "003", "label": "S", "in_stock": true },
"..."
],
"sizes_in_stock": 6,
"main_category": "ladies_jacketscoats_jackets"
},
{
"article_code": "1243210001",
"name": "Träningsjacka SoftMove™ med dragkedja",
"brand": "H&M Move",
"price": 279.2,
"regular_price": 349,
"discount_percent": 20,
"color_count": 26,
"...": "..."
}
],
"count": 12,
"total_results": 2128,
"total_pages": 178,
"has_more": true,
"locale": "sv_se",
"currency": "SEK"
},
"meta": { "country": "se", "record_count": 12, "charged_credits": 1, "cache_hit": false, "mode": "live" }
}En egen H&M-scraper: tre fällor vi har mätt
H&M lägger upp till tre priser på samma rad: ordinarie pris, reapris som gäller alla och medlemspris för H&M-medlemmar. Den som tar det lägsta talet får fel pris. När motorn byggdes gav den svenska sökningen på 'klänning' en artikel med 149 kr i pris och 109 kr i medlemspris; en skrapa som sparar 109 kr redovisar ett pris som den som inte är medlem aldrig betalar. Här ligger medlemspriset i `member_price` och påverkar aldrig `price`.
Reafiltret betyder inte 'nedsatt pris'. Den 25 oktober hade alla 72 träffar på 'jacka' ett reapris, men `sale_only: true`, som följer H&M:s egen reamarkering, gav bara 4 produkter (H&M:s räkning i `filters_available` var också 4 av 2 128): tre från Monki och en från Weekday, ingen av dem bland de 72. Den som bygger en reabevakning på filtret missar nästan allt; läs `on_sale` och `discount_percent` på raderna i stället.
Produktkoden går inte heller att använda som adress. En produktsida med det 7-siffriga numret svarar med HTTP 500 hos H&M, och bara den 10-siffriga artikelkoden (produkt + färg) öppnar en sida. Ger du `product/detail` en 7-siffrig kod slås den här upp till produktens förvalda färg först.
Gemensamt för alla tre är att inget av dem ger ett felmeddelande. Skriptet går vidare och sparar medlemspris som hyllpris, missar alla 72 nedsatta jackor från första sidan eller får ett HTTP 500 som ser ut som ett tillfälligt fel hos H&M.
Gränser och ärliga noteringar
- Inget officiellt H&M-API: H&M har varken tagit fram eller godkänt tjänsten, och vi har inget avtal eller samarbete med företaget.
- Standardmarknaden är `us`. Glömmer du `country` svarar H&M:s amerikanska butik, med dollarpriser och engelska produktnamn.
- Medlemspris kommer bara när H&M har ett på varan i Sverige. Den 25 oktober hade ingen av de 72 raderna på 'jacka' något medlemspris, och fältet kom som null.
- `sale_only` ger det H&M själv märker som rea, inte alla nedsatta varor (se ovan). Nedsatta priser känns igen på `regular_price` och `discount_percent`.
- Sökningen visar även andra märken som säljs på hm.com/se: bland 72 träffar på 'jacka' fanns Weekday och ARKET, och reafiltret gav Monki. Alla hade `external_brand: false`, så filtrera på `brand` om du bara vill ha H&M.
- Lagret är en flagga per storlek (`in_stock`, `few_left`), inget antal, och gäller webbutiken. Lagersaldo per varuhus ingår inte.
- EAN publiceras inte, bara H&M:s egna storlekskoder (`size_code`). `reviews_sample` innehåller högst 10 recensioner, de som produktsidan själv visar.
- `product/detail` läser hela produktsidan (1,8 MB i vårt test) och kostar 2 krediter; sökningen kostar 1. Priserna hämtas från hm.com/se vid varje anrop och mellanlagras inte.