Zara Product Scraper — Prices, Sizes & Stock
Pricing
from $2.25 / 1,000 scraped products
Zara Product Scraper — Prices, Sizes & Stock
Scrape Zara into a clean 58-column dataset: price, discount, currency, colours, images, description and per-SKU sizes with stock, across 200+ country stores. Sweep the catalogue, one category, the sitemap, or paste product URLs. No account, API key or proxy needed.
Pricing
from $2.25 / 1,000 scraped products
Rating
0.0
(0)
Developer
SIÁN OÜ
Maintained by CommunityActor stats
1
Bookmarked
4
Total users
3
Monthly active users
5 days ago
Last modified
Categories
Share
Zara Product Scraper — Prices, Sizes & Stock 🛍️
🎉 Zara's catalogue in 96 country stores, priced in each market's own currency — 58 columns per product, including per-SKU sizes, stock and Zara's own per-SKU demand signal
Built for price analysts, assortment planners, resellers and anyone who wants zara.com as clean rows instead of screenshots.
🔎 What is the Zara Product Scraper — and when should you use it?
The Zara Product Scraper turns zara.com's public catalogue into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.
Use it when you need: Zara products with current price, pre-discount price, discount percentage and the market's own currency. Also colours, images, the full category path, descriptions, composition, per-SKU sizes with stock, and the merchandising slot each product held in its grid.
Use something else when: you want a different Inditex brand. Use Zara Home Product Scraper for homeware, Bershka Product Scraper for Bershka, or Inditex Product Scraper when you want several brands in one dataset with one schema.
🤖 Use with AI agents
Already connected to the Apify MCP server? Just ask for this Actor by name: sian.agency/zara-product-scraper
Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want Zara product data using the Apify Actor `sian.agency/zara-product-scraper`.Use it when I need: Zara products with price, old price, discount, currency, colours, images, category taxonomy, description, composition, and per-SKU sizes with stock.Don't use it when: I want a different Inditex brand — use `zara-home-product-scraper`, `bershka-product-scraper`, or `inditex-product-scraper` for several brands at once.How to call it: `mode` is either "overview" (walks the category tree and returns every product) or "detail" (takes product URLs I paste). In overview mode set `country` to the zara.com market segment, keep `allCategories` on, and cap the run with `maxItems`. Turn on `withSizes` when I need sizes, stock and descriptions — Zara's grid does not carry them.Start with this input:{"mode": "overview","country": "de","allCategories": true,"withSizes": true,"maxItems": 100}Ask me which market and how many products, then run the Actor and summarise the results as a table.
Things you can ask your agent for:
- Compare the same Zara dress across the German, British and Japanese stores and show me the price gaps in local currency.
- Pull the first 500 products from the Zara new-in grid and list everything that is already discounted.
- Take these 40 Zara product URLs and give me every size with its stock state and Zara's own demand signal.
Machine-readable API, MCP config and OpenAPI definition for this Actor are published at apify.com/sian.agency/zara-product-scraper.md.
📋 Overview
The Zara Product Scraper reads zara.com the way zara.com reads itself. It talks to the same catalogue endpoints the website uses, so you get the real record — not whatever survived an HTML parse.
What you get:
- ✅ 58 columns per product: price, old price, discount, currency, colours, images, taxonomy, description, composition, availability, per-SKU sizes
- 🌍 96 country stores: every market zara.com publishes, each priced in its own currency with the right divisor applied
- 📐 Sizes and per-SKU stock: Zara's grid carries neither — one switch fetches them and merges them into the row
- 📊 Merchandising rank:
grid_positionandis_pinnedtell you where Zara chose to place a product in the grid, and which tiles it pinned there - 🆕 Drop detection:
first_visible_dateis when a product entered the catalogue — diff two runs and you have the new-arrivals feed - 🔗 Twinned SKUs and cross-market size ids: the same physical SKU under sibling style ids, and Zara's own mapping between a German S and a US S
- 🧾 A bill you can audit: the
sourcecolumn on every row says which call produced it, so your invoice reconciles against the dataset - 💰 $2.50 per 1,000 products on the category sweep, and the price steps down as your Apify plan tier goes up
✨ Features
- 🗂️ Category sweep: walk the whole tree, or name one category and take just that
- 🗺️ Sitemap sweep: pick up catalogue items no category lists, for genuine full-catalogue coverage
- 🔗 Paste your own URLs: hand it product links or bare
?v2=ids and get one full record each - 🎚️ Facet filters: filter by colour, size or any facet the category publishes, one filter per line
- 💶 Price bounds: keep only what falls between your floor and ceiling, in the market's major units
- ↕️ Sort: catalogue order, price ascending or descending, or novelty where the category offers it
- 🌐 Any market:
defor zara.com/de,usfor zara.com/us, and so on across the 96 stores in the dropdown - 🧹 Deduplicated: the same product reached from two categories is counted and charged once
- 📉 Honest run summary: products pushed, duplicates skipped, ids that no longer exist, and fetches that genuinely failed — reported apart, never merged
🎬 Quick Start
Pick a market, leave the category sweep on, cap the run, and press Run. That is the whole setup.
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~zara-product-scraper/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"mode": "overview","country": "de","allCategories": true,"maxItems": 100}'
🚀 Getting Started (3 Simple Steps)
Step 1: Choose your market
Set Market to the first segment of a Zara URL — de for zara.com/de, us for zara.com/us, gb, jp, and so on. Prices, names and stock are per market, and the country column travels with every row so a multi-market dataset stays honest.
Step 2: Choose what to scrape
Leave Sweep All Categories on for the catalogue. Turn it off and fill Single Category to take one grid. Or switch Run Mode to detail and paste product URLs. Turn on Fetch Sizes & SKUs when you need sizes, stock and descriptions.
Step 3: Run and download
Set Max Products so the first run is cheap, press Run, and export as JSON, CSV or Excel from the dataset tab.
That's it. Within a couple of minutes you'll have:
- Every product in your market with price, old price, discount and currency
- Colours, full image galleries and the complete category path
- Sizes with per-SKU stock, when you asked for them
- A run summary telling you exactly what was and was not fetched
📥 Input Configuration
| Field | Type | Required | Description |
|---|---|---|---|
| mode | string | No | overview walks the categories, detail reads the URLs you paste. Default overview |
| country | string | No | zara.com market segment, lowercase — de, us, gb, jp. Default de |
| language | string | No | Two-letter language for names and descriptions. Empty takes the market default |
| allCategories | boolean | No | Sweep every category. On by default, and it wins over Single Category |
| category | string | No | One Zara category by numeric id or slug. Only used when the sweep is off |
| fromSitemap | boolean | No | Also crawl the product sitemap for anything the categories missed. Bills at the detail rate |
| maxItems | integer | No | Stop after this many distinct products. 0 means no cap. Default 100 |
| withSizes | boolean | No | Fetch per-SKU sizes, stock and the description and merge them into each row. Charges both events |
| productUrls | array | No | Product URLs or bare ?v2= ids, one per line. Required in detail mode |
| sort | string | No | default, price-asc, price-desc or novelty. Options vary per category |
| filters | array | No | Facet filters as GROUP=VALUE, one per line. Same group OR-ed, different groups AND-ed |
| minPrice | integer | No | Drop products below this price, in the market's major units |
| maxPrice | integer | No | Drop products above this price, in the market's major units |
| jitterMs | integer | No | Random pause before each request, in milliseconds. Default 0 |
| proxyConfiguration | object | No | Leave it off. The Actor reaches Zara directly and a proxy adds cost without adding success |
Example — sweep the German store:
{"mode": "overview","country": "de","allCategories": true,"maxItems": 500}
Example — one category, discounted items only, with sizes:
{"mode": "overview","country": "gb","allCategories": false,"category": "2546081","withSizes": true,"maxPrice": 50}
Example — specific products:
{"mode": "detail","country": "us","productUrls": ["https://www.zara.com/us/en/ribbed-tank-top-p04424016.html?v2=418123456","418123456"]}
📤 Output
Results are saved to the Apify dataset with 58 columns per product. Export as JSON, CSV or Excel.
| Field | Type | Description |
|---|---|---|
| brand | string | Brand key stamped on every row. Always zara on this Actor |
| product_id | integer/string | Catalogue id. The only column that is never null — the join key for everything else |
| url | string | Canonical product page for the market you scraped |
| source | string | Which call produced the row: overview, detail, or overview+detail |
| url_id | integer/string | Numeric URL id used by the six shared-catalogue brands. Null on Zara |
| reference | string | Internal style reference, stable across markets |
| display_reference | string | The shorter reference printed on the page and the label |
| seo_product_id | string | Id used in Zara SEO URLs |
| seo_keyword | string | URL slug for the product |
| name | string | Product name in the market language |
| name_en | string | Shared-catalogue brands only, null here |
| product_type | string | Catalogue type of the record, e.g. Product or Bundle |
| kind | string | Zara grid classification of the tile, e.g. Wear |
| country | string | Market the prices and names belong to |
| language | string | Language the names and descriptions came back in |
| store_id | integer/string | Internal store id. Shared-catalogue brands only, null here |
| catalog_id | integer/string | Internal catalogue id. Shared-catalogue brands only, null here |
| section_name | string | Top level of the catalogue tree, e.g. WOMAN |
| section_name_en | string | Shared-catalogue brands only, null here — Zara publishes the section in section_name |
| family_name | string | Product family in the market language |
| family_name_en | string | Shared-catalogue brands only, null here — group on family_name |
| subfamily_name | string | Sub-level of the family in the market language |
| subfamily_name_en | string | Shared-catalogue brands only, null here |
| categories | array | Shared-catalogue brands only, empty here — Zara reports the scraped category in category_id / category_name |
| category_id | integer/string | Id of the category this row was scraped from |
| category_name | string | Name of the category this row was scraped from |
| price | number | Current price in major units, divisor already applied |
| old_price | number | Pre-discount price. Null when the product is not reduced |
| currency | string | ISO currency of the market, e.g. EUR, GBP, JPY |
| discount_pct | number | Percentage off, computed from price and old price |
| on_special | boolean | Shared-catalogue brands only, null here — use old_price and discount_pct |
| main_image | string | First image of the shown colour, full resolution |
| images | array | Every image URL for the shown colour, in catalogue order |
| description | string | Long product description. Grid rows carry none — turn on the size fetch |
| additional_info | string | Shared-catalogue brands only, null here |
| keywords | string | Shared-catalogue brands only, null here |
| assembly_url | string | Shared-catalogue brands only, null here |
| color_name | string | Name of the colour this row represents |
| colors | array | Colour objects with id, name, reference, price, availability and hex |
| available_color_names | array | Colour names the grid offers for this style |
| composition | array | Material breakdown per garment part, with the percentage of each fibre. Grid rows carry none — turn on the size fetch |
| care | array | Shared-catalogue brands only, empty here — Zara's care text arrives inside description |
| variants | array | One entry per colour and size — see the table below |
| size_guide | string | Set to enabled when the product page offers a size guide. Detail records only |
| availability | string | Stock state of the shown colour, e.g. in_stock, low_on_stock |
| is_buyable | boolean | Shared-catalogue brands only, null here — use availability and per-SKU availability |
| back_soon | boolean | Shared-catalogue brands only, null here |
| visibility | string | Shared-catalogue brands only, null here |
| availability_date | string | Shared-catalogue brands only, null here — see first_visible_date |
| first_visible_date | string | When the product first appeared in the catalogue. Detail records only |
| is_continuity | boolean | Carryover line versus seasonal drop. Shared-catalogue brands only, null here |
| is_pinned | boolean | Whether merchandising pinned the tile to a fixed slot |
| grid_position | integer | Position of the tile inside the category grid — the raw merchandising rank |
| join_life | string | Shared-catalogue brands only, null here |
| sustainability_show | boolean | Shared-catalogue brands only, null here |
| sustainability | object | Shared-catalogue brands only, null here |
| traceability | object | Supply-chain traceability node. Shared-catalogue brands only, null here |
| certified_materials | array | Certified material entries. Shared-catalogue brands only, null here |
Inside variants — one entry per colour and size (Zara):
| Field | Description |
|---|---|
| sku | Stock-keeping unit id for this colour and size |
| color / color_id | Colour name and id of the SKU |
| size / size_id | Size label as the market prints it, plus Zara's size id |
| price / old_price | SKU price and pre-discount price in major units |
| availability | Per-SKU stock state |
| reference | Per-SKU reference |
| demand | Zara's own sell-through signal for the SKU |
| equivalent_size_id | Cross-market size id — a German S and a US S resolve to the same value |
| twinned_skus | The same physical SKU under sibling style ids |
Example row (trimmed):
{"brand": "zara","product_id": 418123456,"url": "https://www.zara.com/de/de/ribbed-tank-top-p04424016.html","source": "overview+detail","name": "ÄRMELLOSES RIPP-TOP","price": 12.95,"old_price": 19.95,"currency": "EUR","discount_pct": 35.1,"country": "de","language": "de","family_name_en": "TOPS","color_name": "Ecru","grid_position": 7,"first_visible_date": "2026-06-14T00:00:00Z","variants": [{ "sku": 419881234, "size": "S", "availability": "in_stock", "demand": "DEMAND_REGULAR", "equivalent_size_id": 4 },{ "sku": 419881235, "size": "M", "availability": "low_on_stock", "demand": "DEMAND_HIGH", "equivalent_size_id": 5 }]}
Columns to read carefully. Zara's category grid ships no detail payload at all, so description, variants, composition, size_guide and first_visible_date are filled on detail records only — a plain overview sweep returns them empty. Switch on Fetch Sizes & SKUs, or use detail mode, if any of those five is why you came. A further set of columns belongs to the six shared-catalogue brands and is always null on Zara, because zara.com's API does not publish them: url_id, store_id, catalog_id, name_en, section_name_en, family_name_en, subfamily_name_en, categories, on_special, additional_info, keywords, assembly_url, care, is_buyable, back_soon, visibility, availability_date, is_continuity, join_life, sustainability_show, sustainability, traceability and certified_materials. They are in the schema so one table fits all seven brands.
💼 Use Cases & Examples
1. Cross-market price comparison
A pricing analyst wants to know what the same garment costs in six countries.
Input: the same category id, run once per market
Output: price, old price, discount and currency per market, with country on every row
Use: grey-market spotting, launch pricing, currency-adjusted benchmarks
2. New-arrivals and drop detection
A trend researcher wants to know what entered the catalogue this week.
Input: a scheduled run with Fetch Sizes & SKUs on
Output: first_visible_date per product
Use: diff two runs, keep the new ids, and you have the drop feed without watching the site
3. Size and stock monitoring
A reseller wants to know which sizes are actually available before sourcing.
Input: product URLs in detail mode, or an overview sweep with sizes on
Output: per-SKU size, stock state and Zara's own demand signal
Use: sourcing decisions, restock alerts, sell-through estimates
4. Assortment and merchandising analysis
A category manager wants the shape of a competitor's range, not only its contents.
Input: a full category sweep
Output: grid_position, is_pinned, family and subfamily taxonomy, colour counts
Use: range width by family, what Zara pushes to the top, colour and price architecture
5. Discount and markdown tracking
A retail analyst wants to see how deep the season's markdowns run.
Input: a weekly sweep with maxItems: 0
Output: old_price and discount_pct across the catalogue
Use: markdown cadence, depth by family, comparison against your own calendar
6. Catalogue enrichment
A marketplace team has Zara references and needs the rest of the record.
Input: references or URLs in detail mode
Output: description, composition, images, colours, per-SKU sizes
Use: filling product pages, feed enrichment, matching against your own catalogue
🔗 Integration Examples
JavaScript/Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('sian.agency/zara-product-scraper').call({mode: 'overview',country: 'de',allCategories: true,withSizes: true,maxItems: 200,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Got ${items.length} products`);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('sian.agency/zara-product-scraper').call(run_input={'mode': 'overview','country': 'gb','allCategories': True,'maxItems': 500,'maxPrice': 50,})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item['name'], item['price'], item['currency'])
cURL
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~zara-product-scraper/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"mode": "detail","country": "us","productUrls": ["418123456"]}'
Automation Tool Workflows (n8n, Zapier, Make, etc.)
- Trigger: schedule or webhook
- HTTP Request: start a run and wait for the dataset
- Process: diff against last week's
product_idandprice - Action: write to your warehouse, or alert on new arrivals and markdowns
📊 Performance & Pricing
Performance
- ~20 products per second on the category sweep
- 512 MB memory, no proxy, no browser — direct API reads
- Duplicates removed before anything is charged, so you pay once per distinct product
How you are billed
Three events, and the source column on every row tells you which one applied. Count the rows by source and you have rebuilt your own invoice.
| What you ran | source on the row | Event | Price |
|---|---|---|---|
| Run start | — | Actor start | $0.005 once |
| Category or grid sweep | overview | Scraped product | $0.0025 |
| Pasted URL, or a sitemap row | detail | Scraped product detail | $0.0075 |
Sweep row plus its SKU fetch (withSizes) | overview+detail | both | $0.01 |
Two switches move a row onto the higher-priced event. Also Crawl the Sitemap cannot use the bulk endpoint — it is one request per product, so those rows bill at $0.0075 instead of $0.0025. Fetch Sizes & SKUs genuinely costs both calls and charges both, so those rows cost $0.01. The category sweep is the default and the cheap path; use the sitemap when completeness matters more than price.
Cost examples
- 100 products, category sweep: $0.255
- 1,000 products, category sweep: $2.505
- 1,000 products with sizes and descriptions: $10.005
- 100 pasted product URLs: $0.755
Prices shown are the BRONZE tier. They step down at SILVER, GOLD, PLATINUM and DIAMOND, so heavier use costs less per row.
❓ Frequently Asked Questions
Q: Why are sizes missing from my results? A: Zara's category grid genuinely does not carry sizes or descriptions — that is the site, not the scraper. Switch on Fetch Sizes & SKUs and each row is enriched with per-SKU sizes, stock and the description.
Q: Can I search by keyword? A: No, and neither can anything else. Zara publishes no server-side search endpoint. Every "Zara search scraper" filters client-side over the category tree, so name a category or sweep them all and filter the results yourself.
Q: Which markets are supported? A: The 96 markets zara.com publishes, read from Zara's own sitemap index rather than guessed. Set Market to the first segment of a Zara URL. Prices come back in that market's own currency with the correct divisor applied. (The sibling Actors for the other Inditex brands cover ~216 markets each — those catalogues are open in far more countries than zara.com is.)
Q: Does it return customer reviews? A: No. Zara does not publish ratings or reviews on its product pages, so no scraper can return them. Any actor promising Zara reviews is promising an empty list.
Q: How do I find a category id? A: Open a Zara category page and take the numeric id from the URL, or leave Sweep All Categories on and let the Actor walk the tree for you.
Q: What does first_visible_date need?
A: A detail record. Turn on Fetch Sizes & SKUs during a sweep, or use detail mode. An overview-only run leaves it null.
Q: Is the price already converted?
A: It is already in the market's major units with the correct divisor applied, and currency tells you which currency. No conversion between currencies is performed — a Japanese run returns JPY.
Q: Do I need a proxy? A: No. Leave the proxy off. The Actor reaches Zara's endpoints directly from Apify, verified on the platform, and a proxy only adds cost.
Q: What output formats are available? A: JSON, CSV and Excel, exported straight from the dataset. There is also a run summary in the key-value store with the counts for the run.
🐛 Troubleshooting
Zero products returned
- The category you named is a landing page, not a product grid — those return no ids
- Your filters or price bounds excluded everything; widen them
- Leave Sweep All Categories on and let the Actor find the grids
The run summary says complete: false
- Some fetches failed for transport reasons, so the dataset is short. Re-run to fill the gap
- Ids reported as gone are a different thing: those products no longer exist in that market
A pasted URL is rejected
- A Zara URL without
?v2=carries only an SEO id, which no endpoint accepts. The Actor opens the page once to resolve it, so paste the full URL rather than a fragment - A bare number is treated as the
?v2=product id
The sort or filter option stops the run, or the sweep came back short
- Sort options and facet groups are published per category, and many Zara categories publish none at all
- If you named a single category and it does not offer the one you picked, the Actor stops and lists what is available there
- During a Sweep All Categories run it skips that category instead and counts it under
categoriesSkipped— so a sort or filter can quietly shrink a sweep. Check that count in the run summary before concluding the catalogue is small
Sitemap mode is slower and dearer than expected
- That is the trade: it is one request per product instead of one per hundred, and those rows bill at the detail rate. Use the category sweep unless you need the products no category lists
⚖️ Is it legal to scrape data?
Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.
However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
You can also read Apify's blog post on the legality of web scraping.
Trademarks. Zara is a trademark of Industria de Diseño Textil, S.A. This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by Inditex or any of its brands, and it reads only publicly available catalogue pages.
🤝 Support
Join our active support community
- 🐛 Found a bug? File an issue in the Apify Console Issues tab
- ⭐ Loving the tool? Leave a 5-star review — it helps us build more
- Check SIÁN Agency Store for more automation tools
- 📧 apify@sian-agency.online
Built by SIÁN Agency | More Tools