# Zara API — search the Zara catalogue in 20 country stores and pull a full product: price with discount and currency, every colourway, every size with its own SKU and live stock status, the full-resolution image gallery, fibre composition, care instructions and country of origin — no API key or account required

> Search the Zara catalogue and get back the products on sale right now — each with Zara's own product id, name, price (with the was-price and discount percentage when it is reduced), currency, availability, colourway with hex code, the other colours it comes in, the product images at full resolution, the department and product family, and the link to the page. Choose the country store with `market` (that is what sets the currency), narrow with section, colour, category or brand, sort by price, and page through the results. Every filter value the query actually supports comes back in `filters_available` with counts, so you never have to guess one.
> ReefAPI engine `zara` · 2 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/zara/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed or blocked calls are free.
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /zara/v1/search — 1 credit
Search the Zara catalogue and get back the products on sale right now — each with Zara's own product id, name, price (with the was-price and discount percentage when it is reduced), currency, availability, colourway with hex code, the other colours it comes in, the product images at full resolution, the department and product family, and the link to the page. Choose the country store with `market` (that is what sets the currency), narrow with section, colour, category or brand, sort by price, and page through the results. Every filter value the query actually supports comes back in `filters_available` with counts, so you never have to guess one.

**Parameters:**
- `query` (string, required) — What to look for — a garment, a material + garment, a product name, even a reference ('linen blazer', 'wide leg jeans', 'wool coat', 'scented candle'). Zara matches its own catalogue; when it cannot match the words it silently falls back to semantic similarity, so always read `match.type` in the response (EXACT = the words matched, SPELL_CHECK_LONG = Zara corrected the spelling, SEMANTIC_FALLBACK = the results are only loosely related).
- `market` (enum, optional, default "us") — Which Zara country store to read. This decides the catalogue, the assortment, the prices AND the currency — the same product is USD 35.90 in `us`, EUR 22.95 in `de` and GBP 22.99 in `gb`. Prices do NOT depend on where the request comes from, only on this value, so the same market always returns the same currency. [one of: us, ca, mx, br, gb, ie, es, pt, fr, it, de, nl, pl, tr, ae, in, jp, kr, au]
- `section` (enum, optional) — Restrict to one department. Omit for all of them. (Zara accepts other words here and silently ignores them, so only the four that verifiably filter are offered.) [one of: woman, man, kid, home]
- `brand` (enum, optional) — Zara's search index is the Inditex index for that store, so a query can return Zara Home and Massimo Dutti products alongside Zara ones (measured: 78% zara, 14% zarahome, 8% massimodutti over 720 rows, and heavily query-dependent — 'candle' is almost entirely Zara Home). Set this to keep only one brand. Zara has no server-side brand filter, so this is applied to the rows after they are fetched: `meta.pagination.total_results` stays Zara's own unfiltered count and `meta.brand_filtered_out` reports how many rows were removed. [one of: zara, zarahome, massimodutti]
- `color` (string, optional) — Keep only one colour family. Pass a value from `filters_available.color` (black, beige, blue, brown, grey, green, white, red, pink, purple, orange, yellow, multicolour …) — the exact list a query supports, with counts, comes back in every response so you never have to guess.
- `category` (string, optional) — Keep only one catalogue branch, using a value from `filters_available.rootCategories` (e.g. catalog01_woman, catalog01_kid, catalog01_home). Finer-grained than `section` and always taken from the response rather than invented.
- `sort` (enum, optional) — Result ordering. Omit for Zara's own relevance ranking. Price is the only ordering Zara's search supports — it rejects every other sort key outright, so no other option is offered here. [one of: price_asc, price_desc]
- `max_results` (integer, optional, default 40) — How many products to return, 1-200. One upstream request whatever you ask for — Zara pages by offset, not by fixed page size.
- `page` (integer, optional, default 1) — Which page of results to start from (1-based; a page is `max_results` products). Page until `meta.pagination.has_more` is false. Zara stops serving results a little under 2,000 products deep whatever the query's headline total says.

**Returns:** results[]{product_id, product_group_id, name, url, brand, brand_id, reference, display_reference, price{amount, currency, raw, exponent, was, discount_pct, discount_label, on_sale, min, max, promotions[], unit_price}, availability, in_stock, section, section_name, family_name, subfamily_name, kind, type, color{product_id, color_id, name, hex, reference, availability}, available_colors[]{name, hex}, additional_color_count, main_color_hex, tags[]{type, label}, image, images[]{url, kind, name, width, height}, image_count, seo{keyword, seo_product_id, discern_product_id}, position} + filters_available{color[], rootCategories[], price_range[]} (each {value, label, count, filter}) + sort_available[] + market{code, store_id, locale, currency, url_base} + match{type, provider, universe}. meta.pagination{page, page_size, total_results, returned, has_more, next_page}. Honest caveats: `price.was` / `discount_pct` / `discount_label` exist only on reduced items (about 1 row in 3.5 when something is on sale, none otherwise) — a missing was-price means the item is not reduced, never that we failed to read it; `price.min`/`max` appear only on the rare product whose colourways are priced differently; `tags` is Zara's own badge (NEW, …) and most products carry none; `additional_color_count` is 0 on single-colour products; `total_results` is Zara's headline count for the query and it is NOT the number you can page through — paginate on `has_more`.

**Example request body:**
```json
{
  "query": "dress",
  "max_results": 20
}
```

### POST /zara/v1/product_detail — 1 credit
Get one Zara product in full, by its product id or its zara.com URL — the name and the full description, the price with its currency and any discount, the product reference as printed on the label, EVERY colourway it is made in and, inside each one, EVERY size with Zara's own SKU number, that size's own price and whether it is in stock right now. Also the complete image gallery at full resolution, the fibre composition broken down per garment part, care instructions, country of origin and traceability, safety warnings, certified and sustainable material claims, physical measurements where Zara publishes them, the size system, the department and product family, and the date the product first went on sale. Choose the country store with `market` — id, price, currency and stock are all per-market.

**Parameters:**
- `product_id` (string, optional) — Zara's own product id — exactly the `product_id` a search row returns, and the `v1=` value in a zara.com product URL. A digits-only string (9 digits today); it is never a number to be arithmetic on and never has leading zeros stripped. Zara's ids are colour-level: one id is one colourway of a garment. Passing the `product_group_id` instead also works and returns the same group. Provide `product_id` OR `url`.
- `url` (string, optional) — A zara.com product URL, as an alternative to `product_id`. The id is read from the `v1=` parameter, which every link Zara itself publishes carries. A URL without `v1=` cannot be resolved — Zara publishes no lookup from the short `-p<number>` code to a product — and is rejected with that explanation rather than guessed at.
- `market` (enum, optional, default "us") — Which Zara country store to read. This decides the catalogue, the assortment, the prices AND the currency — the same product is USD 35.90 in `us`, EUR 22.95 in `de` and GBP 22.99 in `gb`. Prices do NOT depend on where the request comes from, only on this value, so the same market always returns the same currency. [one of: us, ca, mx, br, gb, ie, es, pt, fr, it, de, nl, pl, tr, ae, in, jp, kr, au]
- `include_composition` (boolean, optional, default true) — Include the composition-and-care detail: fibre percentages per garment part, washing/care instructions, country of origin and traceability, safety warnings, certified and sustainable material claims, and (on bags, shoes, candles and similar) physical measurements. Costs one extra upstream request that runs alongside the main one; set false for the fastest possible response.

**Returns:** product{product_id, product_group_id, name, url, description, brand, brand_id, reference, display_reference, price{amount, currency, raw, exponent, was, discount_pct, discount_label, on_sale, promotions[], unit_price}, availability, in_stock, sizes_in_stock, state, section, section_name, family_id, family_name, subfamily_id, subfamily_name, kind, type, first_visible_date, size_system, size_guide_available, buyer, flags{}, selected_color, colors[]{product_id, color_id, name, hex, reference, styling_id, availability, price{}, description, sizes[]{sku, size_id, equivalent_size_id, name, short_name, availability, in_stock, reference, price{}, demand, attributes[]}, images[]{url, kind, name, width, height}, videos[], tags[], attributes[]{type, identifier, name, values[], properties{}}, related_product_ids[]}, color_count, sku_count, composition{parts[]{description, components[]{material, percentage}, areas[], microcontents[], reinforcements[]}, exceptions[]}, care[], origin[], warnings[], measurements[], certified_materials[], sustainable_materials[], conformity_declaration[], extra_detail_sections[]{type, lines[]}, seo{keyword, seo_product_id, discern_product_id, breadcrumb[]}}. Honest caveats: `composition` is the structured fibre table and is present on most but not all products (perfume and some accessories have none); `care`, `origin`, `warnings`, `measurements`, `certified_materials` and `sustainable_materials` are per-category — `measurements` is published for bags, shoes and homeware and not for garments, `warnings` for candles, perfume and children's wear — and each is null where Zara publishes nothing, never because the fetch failed; `videos` exists only on the products Zara filmed; `attributes` are Zara's own machine tags, returned verbatim because they have no cross-category meaning; `related_product_ids` are the looks and sets Zara links to the product. `availability` / `in_stock` / `sizes_in_stock` are computed from the per-size stock, because per size is the only granularity Zara publishes here — a product counts as in stock when at least one of its sizes is, and all three are null for a product with no sizes at all. Zara publishes NO ratings, NO reviews, NO stock quantity (only in/out per size) and NO seller — see the source notes; nothing here is invented to fill those gaps.

**Example request body:**
```json
{
  "product_id": "999999999999"
}
```

## More
- Try it live, no code: https://reefapi.com/playground?engine=zara
- Human docs page: https://reefapi.com/docs/zara
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
