H&M API Scraper avatar

H&M API Scraper

Pricing

from $1.69 / 1,000 listing results

Go to Apify Store
H&M API Scraper

H&M API Scraper

Scrapes H&M product search results (PLP) and product detail (PDP) data via the mobile app's backend APIs.

Pricing

from $1.69 / 1,000 listing results

Rating

0.0

(0)

Developer

R.L.

R.L.

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Security

Limited permissions

Share

What does H&M API Scraper do?

H&M API Scraper extracts product data directly from the backend APIs used by the official H&M Android app, instead of rendering and scraping HTML pages. Give it one or more search terms and it returns the full product-listing-page (PLP) result set for each — product names, prices, availability, color swatches, sizes/stock, images, and URLs — and, optionally, the deeper product-detail-page (PDP) data for every product found (description, material composition, price validity dates, and category tree).

Because this Actor talks to the app's JSON APIs, it's fast and doesn't need a browser. Run it on demand, on a schedule, or wire it into your pipeline via the Apify API or integrations (Make, Zapier, n8n, Google Sheets, and more).

Why use H&M API Scraper?

  • Price and stock monitoring — track H&M prices, discounts, and per-size stock levels for competitor or catalog research.
  • Catalog enrichment — pull material composition, category trees, and product codes to enrich an internal product database.
  • Market research — sample search results across locales (en_us, en_gb, de_de, ...) to compare regional pricing and assortment.

How to use H&M API Scraper

  1. Open the Actor's Input tab.
  2. Add one or more Search queries (e.g. jeans, summer dress).
  3. Optionally set a Locale, cap the number of items per query, and choose whether to fetch full product details (PDP).
  4. Click Start and download the results from the Dataset tab once the run finishes.

Input

FieldTypeDescription
searchQueriesarray of stringsSearch terms to run against the PLP (search) API.
localestringLocale for search results, e.g. en_us, en_gb, de_de. Controls language/currency.
maxItemsPerQueryintegerMax products to collect per query. 0 = unlimited (all pages).
fetchProductDetailsbooleanAlso fetch PDP data (description, materials, category tree) for each product.
marketstringMarket code for the PDP endpoint. Leave it at hm-us — that is the only value H&M accepts, and anything else answers "Invalid baseStore or locale" for every product. Measured 2026-11-08: hm-de enriched 0 of 5 products where hm-us enriched 5 of 5. A run with an unsupported market now skips the detail requests, delivers the listing data and says so in its status message, rather than silently returning listing-only rows.
pdpLangstringLanguage code for PDP responses, e.g. en, de.
proxyConfigurationobjectOptional proxy configuration.

See the Input tab for the full JSON schema.

Output

Each dataset item is a flat object combining the PLP product and, if enabled, its matching PDP data — no nested plp/pdp wrapper objects:

{
"searchQuery": "jeans",
"locale": "en_us",
"productId": "1353272001",
"productName": "Slim Jeans",
"brandName": "H&M",
"price": 29.99,
"formattedPrice": "$29.99",
"priceType": "whitePrice",
"isOnSale": false,
"originalPrice": null,
"formattedOriginalPrice": null,
"discountPercent": null,
"stockState": "Available",
"inStock": true,
"colors": ["Denim blue"],
"articleIds": ["1353272001"],
"sizes": ["S", "M", "L"],
"imageUrl": "https://image.hm.com/assets/hm/...jpg",
"productUrl": "https://www2.hm.com/en_us/productpage.1353272001.html",
"pdpCode": "1353272001",
"pdpName": "Slim Jeans",
"description": "...",
"currency": "USD",
"priceValidFrom": "2026-02-03T23:00:00+00:00",
"priceValidTo": "2999-12-31T23:00:00+00:00",
"mainCategory": "Jeans",
"supercategories": ["Clothing", "Jeans"],
"fits": ["Slim fit"],
"baseProductCode": "1353272_group_001",
"ancestorProductCode": "1353272"
}

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel from the Dataset tab.

Main output fields

FieldSourceDescription
productIdPLPProduct/article code, also used to fetch PDP data.
productName / brandNamePLPProduct display name and brand.
price / formattedPricePLPThe price a buyer is shown right now, raw and formatted. On a discounted product this is the sale price.
priceTypePLPH&M's own name for which price that is: redPrice on a sale, whitePrice at full price. Read this rather than inferring from the numbers.
isOnSalePLPTrue when the listing carries a reduced price.
originalPrice / formattedOriginalPricePLPThe pre-discount price. null at full price, because the white price is the current price then.
discountPercentPLPH&M's own discount label, verbatim and as a string, e.g. "-60%". null at full price.
stockState / inStockPLPAvailability.
colors / articleIdsPLPColor variants and their per-color article ids.
sizesPLPSizes currently in stock.
imageUrl / imageUrlsPLPMain product image and gallery images.
productUrlPLPLink to the product page.
descriptionPDPFull product description.
currencyPLPISO code for price, derived from locale.
priceValidFrom / priceValidToPDPValidity window of the US price. The detail endpoint only answers for hm-us, so these date the US price even on a non-US locale and do not date the price column above — measured 2026-11-08, identically 2025-12-07 on an en_us row at 34.99 USD and a de_de row at 29.99 EUR for the same product. It is the only validity window the endpoint offers.
mainCategory / supercategoriesPDPCategory tree. H&M is inconsistent in mainCategory: mostly a display name (Loose, Wide), occasionally an internal slug (kids_boys_clothing_jeans) — 2 of 20 rows measured. Normalise before grouping on it.
baseProductCode / ancestorProductCodePDPLinks color variants of the same garment together.

Pricing

This Actor uses pay-per-event billing. The current rate for each event is on the Actor's Pricing tab, which is generated from the live configuration — this page deliberately does not repeat the figures, so there is no second copy to drift out of date.

What you are charged for:

  • PLP result — one charge per row delivered. A row is one colourway, not one garment: the same style in black and in dark brown is two rows. Measured over a 100-row jeans run, the listing returned 1.92 colourways per style (100 rows across 52 styles), so a run of N rows covers rather fewer than N distinct garments. Each row lists its siblings in colors / articleIds if you want to roll them up.
  • PDP result — a surcharge on top of the PLP charge, added only when fetchProductDetails is on and the detail request actually returned something. A row whose detail request failed is delivered without the surcharge, so you are never charged for an enrichment you did not get.

Leaving fetchProductDetails off is therefore the cheaper mode, and skips one request per product (see Tips below).

Tips

  • Leave fetchProductDetails off if you only need listing-level data (price, name, stock) — this roughly halves the number of requests.
  • maxItemsPerQuery: 0 collects every page for a query; set a cap for quick sampling runs.
  • Only market: "hm-us" is confirmed to reliably resolve product codes on the PDP endpoint; other market codes may return an "Invalid baseStore or locale" error.

Did you find this useful?

Rate this actor on Apify! Your feedback helps other users find it and helps us keep improving it.

FAQ, disclaimers, and support

This Actor calls publicly reachable JSON endpoints used by H&M's own mobile app. It is intended for research and legitimate data-collection use; you're responsible for complying with H&M's Terms of Service and applicable law in your jurisdiction. Endpoint behavior may change without notice. Found a bug or need a custom variant? Open an issue on the Actor's Issues tab.