To get H&M prices by country, find the article's 10-digit code once with Scavio's H&M search, then call POST /api/v1/hm/search with that code and each country. Article codes are the same in every market, so each call returns that market's price, regular price, sale price, member price and online stock by size in its own currency, for 1 credit, in any of 47 countries. For many articles at once, POST /api/v1/hm/category prices up to 72 per market in one 1-credit call.
An H&M price depends on three things: the article, the market and the day. H&M sells online in 62 markets, each with its own currency, markdowns and member prices, and it shows no price history, so anyone comparing or tracking prices has to read every market and keep the readings. H&M publishes no public API for this; its integration portals are for business partners and sit behind a sign-in. Every response below is a trimmed capture from Scavio's H&M API on November 15, 2026, between 18:43 and 18:57 UTC. Prices are numbers in the market's currency: 349 with "currency": "DKK" is 349 kr. Images are cut from every sample.
Step 1: Search H&M and get the article code
curl -s https://api.scavio.dev/api/v1/hm/search \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "scuba hoodie", "country": "us", "page_size": 5}'The US store returned 36 results. The third:
{
"query": "scuba hoodie",
"count": 5,
"total": 36,
"page": 1,
"page_size": 5,
"total_pages": 8,
"sort": "relevance",
"on_sale_count": 1,
"price_range": { "min": 31.99, "max": 49.99 },
"country": "us",
"language": "en",
"currency": "USD",
"locale": "en_us",
"store": "us",
"items": [
{
"article_code": "1329256001",
"product_code": "1329256",
"title": "Loose-Fit Scuba Hoodie",
"brand": "H&M",
"url": "https://www2.hm.com/en_us/productpage.1329256001.html",
"price": 49.99,
"regular_price": 49.99,
"sale_price": null,
"member_price": 41.99,
"discount_percent": null,
"prior_price": null,
"currency": "USD",
"color": "Black",
"colors": [
{ "article_code": "1329256001", "name": "Black", "hex": "#272627" },
{ "article_code": "1329256006", "name": "Dark brown", "hex": "#4A312C" },
{ "article_code": "1329256002", "name": "Gray melange", "hex": "#A5A5A5" },
{ "article_code": "1329256007", "name": "Dark blue", "hex": "#2B2C32" }
],
"sizes": [
{ "size_code": "1329256001001", "label": "XS", "in_stock": true },
{ "size_code": "1329256001002", "label": "S", "in_stock": true },
{ "size_code": "1329256001007", "label": "3XL", "in_stock": false }
],
"in_stock": true,
"coming_soon": false,
"new_arrival": false,
"markers": [],
"category": "men_hoodiessweatshirts_hoodies"
}
]
}article_code is 10 digits: the 7-digit product_code and a 3-digit colour. Each colour is its own article, listed in colors; we follow the grey one, 1329256002. Search takes page_size up to 72, four sorts (relevance, newest, price_asc, price_desc), a department, on_sale and the market's own facet values for color, size, material, fit and product_type. price is what a non-member pays now, member_price the member price H&M displays (Scavio does not log in), and sizes[].in_stock is online stock. It answered in 1.2 seconds. 1 credit.
Step 2: Look up the same code in another market
curl -s https://api.scavio.dev/api/v1/hm/search \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "1329256002", "country": "dk"}'{
"query": "1329256002",
"count": 1,
"total": 1,
"country": "dk",
"language": "da",
"currency": "DKK",
"locale": "da_dk",
"store": "dk",
"items": [
{
"article_code": "1329256002",
"product_code": "1329256",
"title": "Hoodie i scuba Loose Fit",
"url": "https://www2.hm.com/da_dk/productpage.1329256002.html",
"price": 349,
"regular_price": 349,
"sale_price": null,
"member_price": null,
"discount_percent": null,
"prior_price": null,
"currency": "DKK",
"color": "Gråmeleret",
"in_stock": true,
"category": "men_hoodiessweatshirts_hoodies"
}
]
}One code, one result, in Danish and in kroner, with the same item fields as Step 1 (colours and 7 sizes trimmed here; XS and 3XL were out of stock online). An article the market does not sell returns zero results. Titles, colours and facet values come back in the market's language; pass language where a market has several (Canada en or fr, Switzerland de, fr or it, Belgium nl or fr, Finland fi or sv, Hong Kong, Macau and Taiwan zh or en). 1 credit.
Step 3: Read the article in every market
One call per country. The 47 country values: us, ca, mx, gb, ie, de, at, ch, fr, be, nl, it, es, pt, se, fi, dk, no, pl, cz, sk, hu, ro, bg, gr, rs, tr, ua, il, hk, mo, tw, jp, kr, in, my, ph, sg, vn, au, and hr, cy, ee, lv, lt, lu and si, which share H&M's English EUR store (the answer says "store": "eu", and all seven return the same prices, so read one of them).
import requests
API = "https://api.scavio.dev/api/v1/hm"
HEADERS = {"Authorization": "Bearer YOUR_SCAVIO_API_KEY"}
STORES = ["us", "ca", "mx", "gb", "ie", "de", "at", "ch", "fr", "be", "nl", "it", "es", "pt",
"se", "fi", "dk", "no", "pl", "cz", "sk", "hu", "ro", "bg", "gr", "rs", "tr", "ua",
"il", "hk", "mo", "tw", "jp", "kr", "in", "my", "ph", "sg", "vn", "au", "hr"]
code = "1329256002"
for country in STORES: # one request at a time, 1 credit each
d = requests.post(f"{API}/search", headers=HEADERS, timeout=60,
json={"query": code, "country": country}).json()["data"]
for it in d["items"]:
if it["article_code"] == code:
print(country, it["currency"], it["regular_price"], it["sale_price"], it["member_price"])That is 41 credits for one article in every store. The grey scuba hoodie was in all 41 on November 15. Here is a selection, read from the category grids of Step 7 the same hour (a code lookup returns the same fields: Denmark's 349 kr matched), with US dollars at the ECB rates of November 13:
| Store | Regular price | Sale or member price | In USD |
|---|---|---|---|
| Philippines | PHP 1,990 | - | $31.18 |
| India | Rs 2,999 | - | $31.82 |
| Japan | ¥5,499 | - | $34.37 |
| Canada | C$59.99 | member C$50.99 | $42.07 |
| Poland | 174.99 zł | sale 139.99 zł | $43.84 |
| Germany, France, Spain and 11 more euro stores | €39.99 | member €31.99 in Slovakia, Bulgaria and Greece | $44.20 |
| Sweden | 449 kr | - | $44.68 |
| Mexico | MX$899 | sale MX$629 | $48.35 |
| United States | $49.99 | member $41.99 | $49.99 |
| United Kingdom | £37.99 | - | $50.25 |
| Denmark | 349 kr | - | $51.60 |
| Norway | 499 kr | - | $52.18 |
| Switzerland | CHF 49.95 | - | $59.58 |
| Israel | ₪229 | - | $71.32 |
Serbia (RSD 4,599, member RSD 3,699), Ukraine (UAH 1,999, sale UAH 1,599), Taiwan (NT$1,499) and Vietnam (999,000 VND) returned prices too; the ECB publishes no rate for their currencies.
Step 4: Read the product for member price, sizes and reviews
curl -s https://api.scavio.dev/api/v1/hm/product \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"article_code": "1329256002", "country": "us"}'{
"article_code": "1329256002",
"product_code": "1329256",
"title": "Loose-Fit Scuba Hoodie",
"category": "Hoodies",
"category_code": "men_hoodiessweatshirts_hoodies",
"url": "https://www2.hm.com/en_us/productpage.1329256002.html",
"color": "Gray melange",
"price": 49.99,
"regular_price": 49.99,
"sale_price": null,
"member_price": 41.99,
"discount_percent": null,
"price_disclosure": null,
"currency": "USD",
"composition": [
{
"part": "Shell",
"materials": [
{ "name": "Polyester", "percent": 70 },
{ "name": "Rayon", "percent": 24 },
{ "name": "Spandex", "percent": 6 }
]
}
],
"attributes": {
"fit": ["Relaxed fit"],
"length": ["Regular length"],
"sleeve_length": ["Long sleeve"]
},
"colors": [
{ "article_code": "1329256001", "name": "Black", "price": 49.99, "member_price": 41.99 },
{ "article_code": "1329256002", "name": "Gray melange", "price": 49.99, "member_price": 41.99 }
],
"sizes": [
{ "size_code": "1329256002001", "label": "XS", "in_stock": true, "few_left": false },
{ "size_code": "1329256002002", "label": "S", "in_stock": true, "few_left": false },
{ "size_code": "1329256002007", "label": "3XL", "in_stock": false, "few_left": false }
],
"sold_in_stores": true,
"rating": { "average": 4.1, "count": 14 },
"reviews": [],
"country": "us"
}Product adds the description, composition, care, fit attributes, breadcrumbs, images, every colourway's prices (4 here) and price_disclosure, a note such as "Sale price in effect for 90+ days" where H&M shows one. reviews holds the latest reviews H&M shows on the page, up to 10, each with rating, text, date and fit feedback (True to Size, Length), without reviewer names; this article showed a 4.1 rating from 14 and no review text. There is no endpoint for the full review list. Product is not served in Macau, Taiwan or the shared EU store. It took 27.7 seconds, so set a long timeout. 2 credits.
Step 5: Check online stock by size
curl -s https://api.scavio.dev/api/v1/hm/stock \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"article_code": "1329256002", "country": "gb"}'{
"product_code": "1329256",
"article_code": "1329256002",
"title": "Loose Fit Scuba hoodie",
"colors": [
{
"article_code": "1329256002",
"name": "Grey marl",
"sizes": [
{ "size_code": "1329256002001", "label": "XS", "in_stock": false, "few_left": false },
{ "size_code": "1329256002002", "label": "S", "in_stock": true, "few_left": false },
{ "size_code": "1329256002003", "label": "M", "in_stock": true, "few_left": false }
]
}
],
"sizes_total": 45,
"sizes_in_stock": 15,
"country": "gb",
"currency": "GBP"
}Stock returns every colour of the product (six in the UK, including short-length sizes such as XS/S), and sizes_in_stock / sizes_total across them: 15 of 45 in the UK, with black, grey and one of the two browns in stock from S to XXL and the rest sold out online. It is online stock; H&M publishes no per-size stock for a store. few_left is H&M's low-stock flag, null in Macau, Taiwan and the shared EU store. It answered in 1.6 seconds. 1 credit.
Step 6: Convert with one dated exchange rate
The API never converts. Pick one dated reference rate and say which; we used the ECB euro reference rates of November 13, 2026, the latest on November 15:
import re, urllib.request
xml = urllib.request.urlopen("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml").read().decode()
date = re.search(r"time='([\d-]+)'", xml).group(1)
per_eur = {c: float(r) for c, r in re.findall(r"currency='(\w+)' rate='([\d.]+)'", xml)}
per_eur["EUR"] = 1.0
def to_usd(amount, currency):
return amount / per_eur[currency] * per_eur["USD"]
print(date, round(to_usd(349, "DKK"), 2)) # 2026-11-13 51.6The ECB publishes no rate for the Serbian dinar, Ukrainian hryvnia, Taiwan dollar or Vietnamese dong, so leave those four markets out of a converted comparison or take their rates from another dated source. Macau prices come back in Hong Kong dollars. EU, UK, Swiss and Nordic prices include VAT; US and Canadian prices exclude sales tax.
Step 7: Price whole categories at 72 articles per call
Looking up codes one by one costs 1 credit per article per market. If your list is a category, read the grid instead: category ids are the same in every market, and each article in the grid carries the same price fields as search.
curl -s https://api.scavio.dev/api/v1/hm/category \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"category": "men_hoodiessweatshirts_hoodies", "country": "de", "page_size": 72}'Germany returned 72 of 73 men's hoodies, from €19.99 ("price_range": {"min": 19.99, "max": 129}), among them the Loose Fit Hoodie, article 0970819001, "Hoodie in Loose Fit" at €19.99; the US grid listed the same article at $24.99 with a $21.99 member price. items[].category gives the id of any article's category, and a category answers everything H&M files under that id, which can be more than the curated page on the site (3,440 women's dresses under ladies_dresses in the UK). We read five category ids in 41 stores, 205 calls in ten minutes, to compare 44 articles across markets; the best H&M country price APIs has the result. Deals returns a department's markdown grid (it can be empty between sales) and new arrivals the newest items, in the same shape. 1 credit each.
Step 8: Poll daily through Black Friday and keep your own history
H&M's US Black Friday page says the sale starts at hm.com on November 26 and in stores on November 27. Nothing in a response tells you yesterday's price, so store every reading:
import csv, datetime, requests
API = "https://api.scavio.dev/api/v1/hm"
HEADERS = {"Authorization": "Bearer YOUR_SCAVIO_API_KEY"}
CATEGORIES = ["men_hoodiessweatshirts_hoodies", "ladies_jeans_straight", "kids_clothing_jeans_loose"]
STORES = ["us", "gb", "de", "fr", "se", "dk", "no", "pl", "mx", "jp"]
now = datetime.datetime.now(datetime.timezone.utc).isoformat(timespec="seconds")
with open("hm_prices.csv", "a", newline="") as f:
w = csv.writer(f)
for country in STORES:
for category in CATEGORIES: # one request at a time, 1 credit each
r = requests.post(f"{API}/category", headers=HEADERS, timeout=60,
json={"category": category, "country": country, "page_size": 72})
if r.status_code != 200:
continue # failed upstream calls are not charged; retry later
d = r.json()["data"]
for it in d["items"]:
in_stock = sum(1 for s in it["sizes"] if s["in_stock"])
w.writerow([now, country, d["currency"], category, it["article_code"], it["price"],
it["regular_price"], it["sale_price"], it["member_price"],
it["discount_percent"], it["prior_price"], in_stock, len(it["sizes"])])Run it once a day from November 26 to November 30 (cron or any scheduler). Three categories in ten stores is 30 credits a reading and 150 for the five days, $0.15 on the Growth plan. Keep regular_price, sale_price and prior_price apart: discount_percent is measured against prior_price where an EU store shows one (a Polish polo top at 89.99 zł was "18% off" its 109.99 zł prior price, with a regular price of 147.99 zł), so recompute the markdown you want from the raw fields.
What it costs per 1,000 articles per market per day: 1,000 credits ($1.00) if you look up each code with search; about 14 credits ($0.014) if your 1,000 articles are whole category grids of 72. Use product (2 credits) and stock (1 credit) only for articles where you need sizes, composition or reviews.
All H&M endpoints
| Endpoint | What it returns | Markets | Credits |
|---|---|---|---|
| search | Keyword or article-code search with prices, sizes and facets | 47 | 1 |
| product | One article with composition, every colour's prices, sizes, rating and up to 10 latest reviews | 38 | 2 |
| stock | Online stock per size for every colour | 47 | 1 |
| stores | Stores with address, opening hours and departments | 46 | 1 |
| category | A category grid by H&M's category id | 47 | 1 |
| deals | A department's markdown grid | 47 | 1 |
| new-arrivals | A department's new arrivals | 47 | 1 |
| suggestions | Search suggestions in the market's language | 47 | 1 |
| production | Countries of production, suppliers and factory cities | 47 | 1 |
Not available: price history, per-size store stock, the full review list, member-only checkout prices, and the sibling brands COS, Weekday, & Other Stories, Monki and ARKET. Markets H&M runs on a separate site (the UAE, Egypt, Indonesia, Thailand, Brazil, China) and those without an H&M online store answer 400 before anything is charged.
Getting started
- Sign up and copy your API key; you get 50 free credits, no card.
- Run Step 1 with your own query, or try search, category and stock in the playground.
- Save the article codes you care about; they work in every market.
- Read your categories or codes in each market you need, once a day, and store the rows.
- Agents can call the same endpoints through the MCP server.
Try the H&M API free: 50 credits price one article in all 41 stores and leave 9 to spare.
Reference: H&M API overview · search docs · category docs · product docs · stock docs · best H&M country price APIs · is H&M more expensive in Denmark? · how to get IKEA prices by country · how to get Nintendo eShop prices by country
Frequently asked questions
Is the H&M article number the same in every country?
Yes. An H&M article code is 10 digits, a 7-digit product code plus a 3-digit colour, and it is the same in every market: 1329256002, a grey Loose-Fit Scuba Hoodie, is 1329256002 in the US, Denmark and Japan. You find it in the product link (productpage.1329256002.html) or in any search result, and searching it in another market returns that market's price.
Can you see H&M member prices without logging in?
H&M shows a member price next to many articles on its public pages, and Scavio returns it as member_price, the price as H&M displays it; it does not log in, so it never returns member-only checkout prices or account offers. On November 15, 2026, 38 of 39 articles we priced in the US had a member price, a median 20% below the regular price.
Can I check H&M stock by size in a specific store?
No. H&M publishes online stock per size, which Scavio's stock and product endpoints return as in_stock and few_left for each size and colour, but it does not publish per-size stock for a store. A store code passed to search narrows results to that store's assortment, which is not the same as stock on the shelf.
When does H&M Black Friday 2026 start?
In the US, H&M's Black Friday page says Black Friday 2026 begins in stores on November 27 and starts early at hm.com on November 26. We did not read the dates for other markets; the deals endpoint and the sale_price field show what is marked down in each market on the day you call.
Do H&M's terms allow automated price collection?
H&M's US website terms ask users not to use spiders, bots, crawlers or other automated tools to navigate or search hm.com or copy its content, and say site content is for personal, non-commercial use. This is not legal advice; read the current terms for your market and use case.