Zara API

Read Zara products, prices and per-size stock by market

Zara API returns live Zara data as clean JSON for zara The primary endpoint, search, returns matching records including product id, product group id, name, brand and brand id.

Z
/zara/v1

2 active endpoints. Every call is 1 credit.

  • POST/zara/v1/search
  • POST/zara/v1/product_detail

What Zara endpoints does ReefAPI ship?

2 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

2 endpoints

search

1 cr

Search the Zara catalogue and get back the products on sale right now.

required
query
optional
market, section, brand, color, category, sort, max_results, page

product_detail

1 cr

Get one Zara product in full, by its product id or its zara.com URL.

required
optional
product_id, url, market, include_composition

Every parameter, every allowed value →

Zara API

2 of 2 endpoints, ready to run

View docs ↗

The results grid: product id, group id, reference, display reference, the price object, the colour with its hex value, the section, and whether the match was literal.

1 credit1 required · 3 optional
POST/zara/v1/search
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the Zara API works

Zara is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 185 engines.

02
Call
POST /zara/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 credit per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Watch which sizes of one garment are actually in stock

Zara's interesting signal is not the price, which rarely moves, but which sizes are gone. That lives one level below the product, on the size rows.

01search
POST/zara/v1/search
{"query": "jacket", "market": "us", "section": "man", "max_results": 20}

One flat credit. Take results[].product_id — not the reference, and not the group id.

02product_detail
POST/zara/v1/product_detail
{"product_id": "...", "market": "us"}

One flat credit. selected_color.sizes[] is one row per size with in_stock, its own reference and its own price; sizes_in_stock counts them for you.

Two flat credits per garment per check, and the response is small and fast enough — one to two seconds — to run across a whole rail several times a day.

request
curl -X POST https://api.reefapi.com/zara/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"dress","max_results":20}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "zara",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

Zara price minor units by market, and what exponent 0 means

Zara returns money as an integer plus an exponent, so reading price.raw on its own is how you end up off by a factor of a hundred, and the exponent is not the same in every market. The same product also has a different assortment and a different in-stock size count per store. Every row below is product 545456737, a pinstripe blazer, fetched once per market on 2026-08-27.

marketCurrencyprice.raw / exponentprice.amountsizes_in_stock of 5
usUSD21900 / -2219.004
deEUR13900 / -2139.005
gbGBP13900 / -2139.003
trTRY799000 / -27990.005
inINR1295000 / -212950.001
jpJPY25990 / 0259904
krKRW259900 / 02599004

The market enum holds 19 codes: us, ca, mx, br, gb, ie, es, pt, fr, it, de, nl, pl, tr, ae, in, jp, kr, au. The default is us. price.amount is already the divided figure, so use it unless you need the integer. sku_count stayed at 5 in every market above while sizes_in_stock moved between 1 and 5, which means stock is per store even though the SKU list is not.

Five identifiers, one of which opens the product

Measured on 2026-08-27 across womenswear, menswear and childrenswear on the US, Spanish and Japanese markets. Two of these lines go against us.

Zara emits five ids for one garment. Only one is a key.

A single search row carries product_id (579951647), product_group_id (545471614), reference (C04575567703200-I2026), display_reference (4575/567), and a per-size sku (545471616). product_detail takes product_id and nothing else: the group id returned NOT_FOUND, the size sku returned NOT_FOUND, and the reference was rejected with an INVALID_PARAM that spells out the right shape. That is the single most useful fact about this engine.

And the reference is not the same string on both surfaces

Against us. The search row printed reference as C04575567703200-I2026 — the colour-level code. The detail response for the same product printed reference as 04575567-I2026, the product-level one, and put the colour-level code on selected_color.reference. Same field name, two granularities. If you key a database on reference, key it on the one you know you took.

display_reference is the code on the price tag

4575/567 is what a customer sees in the shop and what people search for. It is derived from the same digits as the long reference and is the field to match against if your input came from a human rather than from a URL.

The price carries its own precision

price is an object: amount (35.9), currency (USD), raw (3590) and exponent (-2), plus was, discount_pct, discount_label and on_sale. raw with exponent is the exact integer in minor units, which is what you want for money arithmetic. Currencies without minor units come through correctly: the Japanese market returned raw 8590 with exponent 0.

The market changes the catalogue, not just the currency

The same word returned 820 results on the US market and a different 300 on the Spanish one, in different currencies, with different products. And meta.match_type tells you how you were answered: the US query matched EXACT, the Spanish one fell through to SEMANTIC_FALLBACK — meaning nothing matched literally and Zara guessed. Check that field before you trust a foreign-language query.

Without a section, the grid mixes them

Searching "dress" on the US market returned a child's pinafore in position one, tagged section_name KID. Every row carries section, section_name, family_name and subfamily_name, so you can filter after the fact — but if you meant womenswear, pass section, or your top result will be from the wrong department.

Stock is per size, and the count is done for you

Each size row carries availability, in_stock, its own reference and its own price, plus a demand marker. The product record carries sizes_in_stock and sku_count, so a sold-out check is one field rather than a loop. That is the field this engine exists for.

Composition arrives on most products, not all

Against us. With include_composition, three of the four products we opened returned a real breakdown — outer shell 100% cotton, lining 100% polyester, with the exceptions listed. The fourth returned the structure with an empty components array. The care instructions, origin, measurements and conformity declaration came back on all of them.

Two endpoints, flat, fast

search and product_detail at 1 flat credit each, and nothing else. Search of 20 rows ran one to three seconds and product_detail about one. The feed is genuinely deep for a fashion site: page 41 of an 820-result query still returned its final 15 rows.

What people build with Zara

The jobs this data is most often used for.

2

endpoints

1

credit per call

01

Pricing and assortment teams use Zara to search the Zara catalogue and get back the products on sale right now.

02

Brand-protection teams use Zara to get one Zara product in full, by its product id or its zara.com URL.

03

Retail analysts use Zara to read a retailer's own catalogue with full product detail, variants, price and stock, all from one ReefAPI key and credit pool.

What Zara data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 185 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/zara/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"dress","max_results":20}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/zara/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "query": "dress",
  "max_results": 20
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Zara.

Get a free key →
Does the Zara API return prices in cents?

It returns both forms. price.raw is the integer Zara publishes, price.exponent says where the decimal point goes, and price.amount is the already-divided number. For product 545456737 on the us market that was raw 21900, exponent -2 and amount 219.0. Read amount unless you specifically need the integer, and never assume raw divided by 100.

Is the Zara price exponent always -2?

No, and that is the trap. Currencies without minor units come back with exponent 0: the same blazer on jp returned raw 25990 exponent 0 for JPY 25,990 and on kr raw 259900 exponent 0 for KRW 259,900. Dividing those by 100 would understate the price a hundredfold. us, de, gb, tr and in all returned -2 in the same measurement.

What does the market parameter change?

The catalogue, the assortment, the price and the currency, and nothing else. The same blazer was USD 219.00 on us, EUR 139.00 on de, GBP 139.00 on gb, TRY 7,990.00 on tr and INR 12,950.00 on in. It does not depend on where the request comes from, so the same market always returns the same currency. Nineteen codes are accepted and the default is us.

Is a Zara product_id the garment or the colour?

The colour. Zara ids are colour-level, so 545456737 is one colourway and product_group_id (545451465) is the garment it belongs to. Passing the group id also resolves. Inside product_detail, colors[] holds every colourway with its own color_id and hex, and colors[].sizes[] holds every size with its own sku, so one call gives you the whole matrix rather than one variant.

What size-level detail comes back, and what are the stock values?

Every size row carries sku, size_id, name, availability, in_stock and its own reference. On the us market that blazer returned SKUs 545451466 through 545451470 for XS, S, M, L and XL, with XL at availability "coming_soon" and in_stock false while the other four were "in_stock". Across a 60-row search the availability values seen were in_stock and low_on_stock, so treat it as a small vocabulary and read in_stock when you only need the boolean.

What are reference and display_reference?

reference is the full code printed on the label, built from the product code, the colour code and the season: "C00550156407000-I2026" for that blazer, whose color_id is 407. display_reference is the short form Zara shows on the page, "0550/156". Each size then has its own reference with the size appended, such as "0055015640701-I2026" for XS. Use reference when matching against Zara's own paperwork rather than the numeric id.

Why does a Zara search return Zara Home or Massimo Dutti products?

Because the search index behind a Zara store is the Inditex index for that store, so sister brands can match a query. A 60-row search for 'dress' on the us market returned 59 zara rows and 1 zarahome row. Every row carries brand and brand_id, and the brand parameter (zara, zarahome, massimodutti) trims rows after they are fetched, so a filtered page can come back shorter than max_results.

How do I know Zara actually matched my words?

Read match.type. "EXACT" means the words matched the catalogue, and Zara also reports spell-corrected and semantic-fallback matches instead of returning nothing, which is how a query quietly turns into merely similar products. match.universe names the department Zara routed the query to and it can disagree with the rows: a search for 'dress' came back with universe KID while the 60 rows split 36 KID, 21 WOMAN, 2 MAN and 1 HOME.

What is the Zara API?

Zara API is a ReefAPI endpoint group for zara It returns live JSON through POST requests under /zara/v1.

Is the Zara API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Zara calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Zara login or account?

No login to Zara is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Zara data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Zara API use?

Zara actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call Zara from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call zara actions with the same key, credit pool and JSON envelope used by normal REST requests.

15 More APIs APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Zara, you are one call away from the rest of the category — no second contract, no second integration.

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-27.