API

H&M API: produse, prețuri și mărimi de pe H&M România în JSON

H&M nu oferă un API public pentru dezvoltatori. Interfața de aici citește magazinul online H&M România așa cum îl vede orice client — denumire, preț în lei, reducere, culori, mărimi disponibile și compoziție — și returnează totul în format JSON. Nu este o integrare pentru furnizori sau parteneri H&M și nu are acces la vreun cont de client: este partea cumpărătorului, catalogul public.

Endpointuri

endpointCe returneazăObligatorii
searchCăutare după cuvânt, în limba română: prețul plătit, prețul dinaintea reducerii, prețul pentru membri separat, culori și mărimi disponibile. Sortare după noutăți sau preț, filtre de departament, culoare și material.query
product/detailArticolul complet după cod sau URL: descriere, compoziție pe părți ale produsului, materiale reciclate, instrucțiuni de îngrijire, fiecare mărime cu disponibilitatea ei și marcajul „puține bucăți”, nota din recenzii și toate celelalte culori cu prețurile lor.article_code
categoryToate produsele unei pagini de categorie (un departament, un tip de produs, pagina de reduceri), paginate și sortate.toate opționale
search/suggestSugestiile din caseta de căutare H&M pentru ce a tastat clientul.query
product/availabilityDisponibilitatea pe mărimi, live, pentru toate culorile unui produs: ce se poate comanda și ce H&M marchează cu puține bucăți rămase.article_code

Fiecare apel se taxează în credite. Apelurile eșuate și blocate sunt gratuite.

Exemplu funcțional

La un produs redus, price este ce plătește oricine acum, regular_price prețul dinainte, iar member_price (prețul pentru membri) e un câmp separat, null când nu există. Cine ia un singur „preț” amestecă cele trei și compară lucruri diferite.

Cerere
curl -X POST https://api.reefapi.com/hm/v1/product/detail \
  -H "x-api-key: CHEIA_TA" \
  -H "content-type: application/json" \
  -d '{"article_code": "1325446002", "country": "ro"}'
Răspuns (prescurtat)
{
  "ok": true,
  "data": {
    "product": {
      "article_code": "1325446002",
      "name": "Jachetă scurtă din denim",
      "price": 114.99,
      "regular_price": 189.99,
      "discount_percent": 39,
      "member_price": null,
      "currency": "RON",
      "composition": [{ "materials": [{ "name": "Bumbac", "percent": 81 }, { "name": "Poliester", "percent": 18 }, { "name": "Elastan", "percent": 1 }] }],
      "sizes": [
        { "label": "XXS", "in_stock": true, "few_left": true },
        { "label": "XS", "in_stock": false, "few_left": false },
        ...
      ],
      "rating": 5.0,
      "review_count": 1
    }
  },
  "meta": { "record_count": 1, "cache_hit": false, "mode": "live" }
}

Scraper pentru H&M: ce nu se vede din prima

La H&M, accesul la pagina de produs nu depinde de IP — nici proxy-urile rezidențiale nu ajută — ci de felul în care se prezintă clientul. E o regulă pe care H&M o poate schimba oricând, iar atunci un scraper se oprește de pe o zi pe alta, fără ca în codul lui să se fi schimbat ceva.

Apoi sunt răspunsurile care par corecte. Un produs care nu mai există nu întoarce 404, ci pagina principală a magazinului, cu cod 200. O pagină de rezultate de după ultima întoarce tot prima pagină. Aici produsul inexistent vine ca NOT_FOUND, iar pagina prea mare ca listă goală cu page_out_of_range.

Pentru o extragere unică de prețuri, un script propriu ajunge și e mai ieftin. Când urmărești reducerile în fiecare zi, costul real e să afli la timp că ceva s-a stricat.

Limite și note oneste

  • Nu este API-ul oficial H&M și nu avem niciun parteneriat cu H&M.
  • Filtrul sale_only nu funcționează pe piața ro: la „rochie” și „geacă” a întors 0 rezultate, deși căutarea simplă conținea produse reduse (pe piața gb același filtru funcționează). Produsele reduse se recunosc după regular_price și discount_percent.
  • H&M corectează singur căutarea: „geacă de iarnă” a devenit „gheată de iarnă” și a întors ghete, iar „geaca de iarna” (fără diacritice) a întors 0 rezultate. Verifică matched_query; un cuvânt simplu ca „geacă” sau „rochie” merge mai sigur decât o expresie.
  • Stocul pe mărimi este un indicator (in_stock, few_left), nu un număr de bucăți.
  • product/detail include cel mult 10 recenzii, cele afișate pe pagină (reviews_sample), nu lista completă.
  • Piața implicită este us: fără country: "ro", cererea ajunge la magazinul H&M din SUA, cu prețuri în dolari.
  • Nu păstrăm copii în cache: fiecare apel citește din nou magazinul H&M.