API

H&M API: zboží, ceny v Kč a velikosti z českého e-shopu H&M v JSON

Veřejné API ke svému katalogu H&M vývojářům nenabízí. Tohle rozhraní čte český e-shop H&M (www2.hm.com/cs_cz) tak, jak ho vidí nakupující: český název zboží, cenu v korunách, při slevě i původní cenu, členskou cenu H&M jako samostatné číslo, všechny barvy, velikosti skladem, složení materiálů, pokyny k praní a hodnocení. Pro Česko se ke každému volání přidává `"country": "cz"`; hledá se česky, tedy „zimní bunda“, ne „winter jacket“. Dodavatelům, franšízovým partnerům ani členům H&M s vlastním účtem neposlouží: nic neobjednává, k žádnému účtu se nepřihlašuje a do H&M nic neposílá. Čte jen veřejný katalog.

Endpointy

endpointCo se vracíPovinné
searchHledání podle slova: cena, původní cena a sleva v procentech, pokud běží akce, členská cena zvlášť, barvy, velikosti s příznakem skladem, značka a kategorie. Řazení podle novinek nebo ceny, filtry oddělení, barvy a materiálu, 36 řádků na stránku (až 72).query
product/detailCelý artikl podle kódu nebo adresy: popis, ceny, složení po částech oděvu (vrchový materiál, vatování, podšívka), recyklované materiály, pokyny k praní, každá velikost se stavem skladem a „posledních pár kusů“, hodnocení a počet recenzí a všechny ostatní barvy téhož výrobku s vlastními cenami a velikostmi.article_code
categoryVšechny výrobky jedné stránky kategorie (oddělení, typ zboží, výprodej); každý řádek má stejná pole jako výsledek hledání. Stránkování a řazení jako na webu.vše volitelné
search/suggestNávrhy z vyhledávacího pole H&M pro rozepsané slovo, v češtině.query
product/availabilityAktuální dostupnost velikostí pro všechny barvy jednoho výrobku: co se dá objednat a co H&M označuje jako poslední kusy. Malé volání vhodné na hlídání skladu.article_code

Každé volání se účtuje v kreditech. Neúspěšná a blokovaná volání jsou zdarma.

Funkční příklad

„zimní bunda“ dala 458 výsledků; na první stránce 36 řádků, většinou dětské bundy, a ve slevě jen jedna: vatovaná bunda 1170400013 za 229 Kč místo 399 Kč (−43 %). Sleva patří barvě, ne výrobku: každá barva má vlastní `article_code` (výrobek 1170400 + kód barvy) a ostatní barvy skladem stály 399 Kč. Pozor i na počet barev: řádek z hledání uvádí `color_count: 6` a v `colors` bylo právě šest barev, které byly skladem, kdežto `product/detail` vrátil všech 12 variant včetně vyprodaných; mezi nimi byla i druhá barva za 229 Kč, už bez jediné velikosti skladem.

Požadavek
curl -X POST https://api.reefapi.com/hm/v1/search \
  -H "x-api-key: VAS_API_KLIC" \
  -H "content-type: application/json" \
  -d '{"query": "zimní bunda", "country": "cz"}'
Odpověď (zkrácená)
{
  "ok": true,
  "data": {
    "results": [
      {
        "article_code": "1262219011",
        "product_code": "1262219",
        "name": "Vodoodpudivá vatovaná bunda",
        "brand": "H&M",
        "url": "https://www2.hm.com/cs_cz/productpage.1262219011.html",
        "price": 629.0,
        "regular_price": null,
        "on_sale": false,
        "member_price": null,
        "price_formatted": "629 Kč",
        "currency": "CZK",
        "color_name": "Bílá/květiny",
        "color_count": 5,
        "sizes_in_stock": 5,
        "main_category": "kids_girls_clothing_jacketscoats_jackets"
      },
      ...
      {
        "article_code": "1170400013",
        "product_code": "1170400",
        "name": "Vodoodpudivá vatovaná bunda",
        "brand": "H&M",
        "price": 229.0,
        "regular_price": 399.0,
        "on_sale": true,
        "discount_percent": 43,
        "member_price": null,
        "price_formatted": "229 Kč",
        "currency": "CZK",
        "color_name": "Námořnická modř",
        "color_count": 6,
        "sizes": [
          { "size_code": "006", "label": "92 (1½-2Y)", "in_stock": true },
          { "size_code": "007", "label": "98/104 (2-4Y)", "in_stock": false },
          ...
        ],
        "sizes_in_stock": 2,
        "main_category": "kids_boys_clothing_jacketscoats_jackets"
      },
      ...
    ],
    "count": 36,
    "total_results": 458,
    "total_pages": 13,
    "has_more": true,
    "matched_query": null,
    "related_searches": ["bunda"],
    "country": "cz",
    "language": "cs",
    "locale": "cs_cz",
    "currency": "CZK"
  },
  "meta": { "record_count": 36, "country": "cz", "charged_credits": 1, "cache_hit": false, "mode": "live" }
}

Vlastní scraper na hm.com: co se ukázalo při stavbě

Každý řádek ve výsledcích H&M nese seznam cen, ne jednu cenu: běžnou, akční pro všechny a členskou. Na českém trhu to při stavbě enginu ukázaly šaty 1342450007: 379 Kč běžně, 299 Kč pro členy. Kdo vezme nejnižší číslo ze seznamu, uloží jako cenu na regálu tu, kterou zaplatí jen člen; na francouzském trhu by se to u dotazu „jean“ stalo v 15 řádcích z 36. Proto je tady `price` cena pro každého a `member_price` samostatné pole.

Sedmimístný kód výrobku z adresy není stránka: `productpage.1357224.html` vrátil HTTP 500. Stránku má jen desetimístný kód artiklu (výrobek + barva); engine sedmimístný kód nejdřív dohledá ve vyhledávání. A pole se skladem nenese počet kusů, ale kód stavu: ve 144 změřených řádcích se hodnota 1 neobjevila ani jednou. Proto tu je jen `in_stock` a příznak posledních kusů.

Některé parametry H&M přijme a mlčky nepoužije: s `categoryId` zůstal počet výsledků stejný (2003 = 2003), s `priceRange=10-20` také, a filtr velikosti vrátil nulu. Skript tak vypadá, že filtruje, a nefiltruje. Engine nabízí jen filtry, u kterých se při stavbě změřilo, že výsledky opravdu mění; na českém trhu ale `sale_only` teď vrací nulu, viz omezení níže.

Ceny se v H&M liší barvu od barvy a u každé můžou platit tři různá čísla. Kdo je chce porovnávat déle než pár dní, potřebuje u každého uloženého řádku vědět, kterou z těch tří cen má a ke které barvě patří.

Omezení a poctivé poznámky

  • Nejde o službu H&M: rozhraní je neoficiální, H&M ho nevydalo a s firmou nemáme partnerskou smlouvu.
  • Bez `"country": "cz"` jde dotaz na americký e-shop H&M s cenami v dolarech.
  • Filtr `sale_only` na českém trhu nefunguje: 27. 10. vrátil u „zimní bunda“, „bunda“ i „šaty“ 0 výsledků, přestože běžné hledání „zimní bunda“ zlevněnou bundu obsahovalo. Takové volání skončí jako úspěšné a 1 kredit se za něj strhne. Zlevněné zboží proto hledejte bez filtru a poznáte ho podle `on_sale`, `regular_price` a `discount_percent`.
  • Hledání vrací i zboží dalších značek skupiny H&M: u „lněná košile“ bylo z 36 řádků 16 COS, 13 H&M, 4 ARKET a 3 & Other Stories. Kdo chce jen H&M, filtruje podle pole `brand`.
  • Členská cena se objeví jen tam, kde ji H&M u zboží vypíše; v našich dotazech z 27. 10. („lněná košile“, „zimní bunda“, 72 řádků) nebyla ani jedna.
  • Sklad je jen příznak (`in_stock`, `few_left`), ne počet kusů. `product/detail` obsahuje nejvýš 10 recenzí, které jsou přímo na stránce zboží (`reviews_sample`), ne celý seznam.
  • Ne každé pole je vždy vyplněné: u bundy z příkladu přišel `breadcrumb` prázdný a `country_of_production` null. Poznámka o dopravě (`delivery_note`) je text H&M („poplatek za dopravu od 39 Kč do 80 Kč“), ne spočítaná cena dopravy.
  • Za `search`, `search/suggest` a `product/availability` se platí 1 kredit, za `product/detail` a `category` 2 kredity (u kategorie za každou stránku).