# Zara Home Product Scraper — Prices, Sizes & Stock (`sian.agency/zara-home-product-scraper`) Actor

Scrape Zara Home into a clean 58-column dataset: price, discount, currency, colours, images, per-SKU sizes, stock, GTIN barcodes, dimensions and weights, across 200+ country stores. Sweep the catalogue, one category, the sitemap, or paste product URLs. No proxy needed.

- **URL**: https://apify.com/sian.agency/zara-home-product-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** E-commerce, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.70 / 1,000 scraped products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Zara Home Product Scraper — Prices, Sizes & Stock 🏠

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![IKEA Product Scraper](https://img.shields.io/badge/Store-IKEA%20Product%20Scraper-0058A3)](https://apify.com/sian.agency/ikea-product-scraper?fpr=sian) [![Crate & Barrel Product Scraper](https://img.shields.io/badge/Store-Crate%20%26%20Barrel%20Product%20Scraper-1AE392)](https://apify.com/sian.agency/crate-and-barrel-product-scraper?fpr=sian) [![Leroy Merlin Product Scraper](https://img.shields.io/badge/Store-Leroy%20Merlin%20Product%20Scraper-6BAE43)](https://apify.com/sian.agency/leroy-merlin-product-scraper?fpr=sian)

#### 🎉 Zara Home's catalogue in 200+ country stores, priced in each market's own currency — 58 columns per product, with per-SKU stock, GTIN barcodes and promotion end dates

##### Built for homeware buyers, price analysts and marketplace teams who need zarahome.com as clean rows instead of screenshots.

### 🔎 What is the Zara Home Product Scraper — and when should you use it?

The **Zara Home Product Scraper** turns zarahome.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 Home products with current price, pre-discount price, discount percentage and the market's own currency. Also colours, images, the full category path, descriptions, composition and care, and per-SKU sizes with stock, GTIN barcodes, dimensions and weight.

**Use something else when:** you want a different Inditex brand. Use [Bershka Product Scraper](https://apify.com/sian.agency/bershka-product-scraper?fpr=sian) or [Zara Product Scraper](https://apify.com/sian.agency/zara-product-scraper?fpr=sian) for fashion, or [Inditex Product Scraper](https://apify.com/sian.agency/inditex-product-scraper?fpr=sian) when you want several brands in one dataset with one schema.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/zara-home-product-scraper

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want Zara Home product data using the Apify Actor `sian.agency/zara-home-product-scraper`.

Use it when I need: Zara Home products with current price, pre-discount price, discount percentage and the market's own currency, plus colours, images, full category taxonomy, descriptions, composition, care, and per-SKU sizes with stock, GTIN barcodes, dimensions and weight.

Don't use it when: I want a different Inditex brand — use `bershka-product-scraper` or `zara-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 two-letter market, keep `allCategories` on, and cap the run with `maxItems`.

Start with this input:
{
  "mode": "overview",
  "country": "DE",
  "allCategories": 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 Home product across the German, Spanish and British stores and show me the price gaps in local currency.*
- *Pull 300 Zara Home products and list everything that is discounted, with the date the promotion ends.*
- *Give me every Zara Home SKU in this category with its size, stock state and barcode.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/zara-home-product-scraper.md](https://apify.com/sian.agency/zara-home-product-scraper.md).

***

### 📋 Overview

**The Zara Home Product Scraper reads zarahome.com the way the site reads itself.** It talks to the same catalogue endpoints, so you get the real record — not whatever survived an HTML parse. The whole product comes back from the cheap sweep, sizes and all.

**What you get:**

- ✅ **58 columns per product**: price, old price, discount, currency, colours, images, taxonomy, description, composition, care, per-SKU sizes
- 🌍 **218 country stores**: each priced in its own currency, with the market's divisor already applied
- 📐 **Per-SKU sizes and stock** in the cheap sweep: colour by size, with buyable and back-soon flags, no second request needed
- 🏷️ **GTIN barcodes**: the join key to every other retail dataset
- 🗓️ **Promotion windows**: per-SKU price start and end dates, so you know the date a markdown ends, not only that one is running
- 🧾 **A bill you can audit**: the `source` column on every row says which call produced it, so your invoice reconciles against the dataset
- 💰 **$3.00 per 1,000 products** on the category sweep, and the price steps down as your Apify plan tier goes up
- 🪑 **Homeware specifics**: assembly and instruction sheet links, named physical dimensions and gram weight per SKU

### ✨ 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 ids and get one full record each
- 🎚️ **Facet filters**: `color=`, `size=`, `category=` and `discount=` shortcuts, or any facet group the site publishes
- 💶 **Price bounds**: keep only what falls between your floor and ceiling, in the market's major units
- ↕️ **Sort**: catalogue order, price ascending or price descending
- 🧹 **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, press Run.

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~zara-home-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 a two-letter country code — `DE`, `ES`, `FR`, `GB`, `JP` and around 210 more. Prices, names and stock are per market, and the `country` column travels with every row.

#### 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.

#### 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
- Per-SKU sizes with stock, barcodes, dimensions and weight
- 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 | Two-letter store country, e.g. `DE`, `ES`, `FR`, `GB`, `JP`. Default `DE` |
| language | string | No | Two-letter language for names and descriptions. Empty takes the store default |
| allCategories | boolean | No | Sweep every category. On by default, and it wins over Single Category |
| category | string | No | One category by slug or numeric id. 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` |
| productUrls | array | No | Product URLs or bare product ids, one per line. Required in `detail` mode |
| sort | string | No | `default`, `price_asc` or `price_desc`, applied over the ids the category ships |
| 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 |
| batchSize | integer | No | Product ids per call. Default `100`, maximum `200` |
| jitterMs | integer | No | Random pause before each request, in milliseconds. Default `0` |
| proxyConfiguration | object | No | Leave it off. The Actor reaches the API directly and a proxy adds cost without adding success |

**Example — sweep one market:**

```json
{
  "mode": "overview",
  "country": "DE",
  "allCategories": true,
  "maxItems": 500
}
```

**Example — one category, filtered by colour and price-capped:**

```json
{
  "mode": "overview",
  "country": "DE",
  "allCategories": false,
  "category": "1020447643",
  "filters": ["color=Blau"],
  "maxPrice": 40
}
```

Facet values are published per category and change with the season. `discount=` takes the markdown percentages that category currently carries (`30`, `50`, …), not a yes/no flag — name a value the category does not offer and the run stops and prints the ones it does.

**Example — specific products:**

```json
{
  "mode": "detail",
  "country": "DE",
  "productUrls": [
    "https://www.zarahome.com/de/-c0p123456789.html",
    "123456789"
  ]
}
```

### 📤 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 `zarahome` 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` or `detail` |
| url\_id | integer/string | Numeric id used in the product URL |
| 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 | Zara SEO id. Null on this brand |
| seo\_keyword | string | Zara URL slug. Null on this brand |
| name | string | Product name in the market language |
| name\_en | string | English product name, when the catalogue carries one |
| product\_type | string | Catalogue type of the record, e.g. Product or Bundle |
| kind | string | Zara grid classification. Null on this brand |
| 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 for the market |
| catalog\_id | integer/string | Internal catalogue id for the market |
| section\_name | string | Zara-only column. Null on this brand — this catalogue publishes the section in English only, in `section_name_en` |
| section\_name\_en | string | English name of the section |
| family\_name | string | Product family in the market language |
| family\_name\_en | string | English product family — group on this across markets |
| subfamily\_name | string | Sub-level of the family in the market language |
| subfamily\_name\_en | string | English sub-level of the family |
| categories | array | Every category the product is filed under, as `{id, name}` |
| category\_id | integer/string | Zara-only column. Null on this brand |
| category\_name | string | Zara-only column. Null on this brand |
| 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 | Catalogue flag for a promotional product |
| 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, falling back to the short one |
| additional\_info | string | Extra copy the catalogue attaches to the product. Measured empty on every product we sampled — treat it as a bonus |
| keywords | string | Merchandising keywords attached to the product. Measured empty on every product we sampled — treat it as a bonus |
| assembly\_url | string | Link to an assembly or instruction sheet, where one exists |
| color\_name | string | Name of the colour this row represents |
| colors | array | Colour objects with id, name and reference |
| available\_color\_names | array | Zara-only column. Null on this brand |
| composition | array | Material breakdown per garment part, with the percentage of each fibre |
| care | array | Washing and care instructions as `{id, name, description}` |
| variants | array | One entry per colour and size — see the table below |
| size\_guide | string | Zara-only column. Null on this brand |
| availability | string | Zara-only column. Null here — this brand reports stock per SKU in `variants` |
| is\_buyable | boolean | Whether the product can currently be added to a basket |
| back\_soon | boolean | Catalogue flag for a restock that is already scheduled |
| visibility | string | Catalogue visibility state, e.g. `visible` or `hidden` |
| availability\_date | string | Date the product becomes or became available |
| first\_visible\_date | string | Zara detail column. Null on this brand |
| is\_continuity | boolean | True for a carryover line, false for a seasonal drop |
| is\_pinned | boolean | Zara grid column. Null on this brand |
| grid\_position | integer | Zara grid column. Null on this brand |
| join\_life | string | Join Life sustainability label text, when the product carries one |
| sustainability\_show | boolean | Whether the product page shows a sustainability badge |
| sustainability | object | Full sustainability node off the shown colour |
| traceability | object | Supply-chain traceability node off the shown colour |
| certified\_materials | array | Certified material entries off the shown colour |

**Inside `variants` — one entry per colour and size:**

| Field | Description |
|-------|-------------|
| sku | Stock-keeping unit id for this colour and size |
| color / color\_id | Colour name and id of the SKU |
| size | Size label as the market prints it |
| partnumber | Catalogue part number |
| price / old\_price | SKU price and pre-discount price in major units |
| barcode | GTIN barcode of the SKU — the join key to other retail datasets |
| price\_start\_date / price\_end\_date | When the current price took effect and when it expires |
| old\_price\_start\_date / old\_price\_end\_date | The same window for the pre-discount price |
| is\_buyable / back\_soon | Whether this SKU can be bought now, and whether a restock is scheduled |
| dimensions / weight | Named physical axes and gram weight of the SKU |
| origin | Manufacturing country of the SKU |

**Example row (trimmed):**

```json
{
  "brand": "zarahome",
  "product_id": 123456789,
  "url": "https://www.zarahome.com/de/-c0p123456789.html",
  "source": "overview",
  "price": 19.99,
  "old_price": 29.99,
  "currency": "EUR",
  "discount_pct": 33.3,
  "country": "DE",
  "family_name_en": "TOPS",
  "is_continuity": false,
  "variants": [
    { "sku": 44112233, "size": "M", "barcode": "8445123456789", "price": 19.99, "is_buyable": true,
      "price_start_date": "2026-08-01T00:00:00Z", "price_end_date": "2026-08-31T23:59:59Z", "weight": 180 }
  ]
}
```

**Columns that belong to other brands.** `first_visible_date`, `grid_position`, `is_pinned`, `available_color_names`, `seo_keyword`, `section_name`, `category_id`, `category_name` and `size_guide` come from Zara and stay null here. `traceability` and `certified_materials` are in the schema and often empty — treat them as a bonus rather than a guarantee. No Inditex brand publishes ratings or reviews, so no scraper can return them.

### 💼 Use Cases & Examples

#### 1. Price and markdown tracking

**A retail analyst wants to see how deep and how long the markdowns run.**

**Input:** a weekly sweep of the market
**Output:** `old_price`, `discount_pct`, `on_special`, and per-SKU promotion start and end dates
**Use:** markdown cadence and depth, and the date each promotion ends

#### 2. Size and stock monitoring

**A reseller wants to know which sizes are actually available before sourcing.**

**Input:** a category sweep, or product URLs in `detail` mode
**Output:** per-SKU size, stock, buyable and back-soon flags
**Use:** sourcing decisions, restock alerts, sell-through estimates

#### 3. Barcode-keyed catalogue matching

**A marketplace needs to match these products against its own inventory.**

**Input:** a full sweep of one market
**Output:** GTIN barcodes per SKU alongside price, size and stock
**Use:** joining to any other retail dataset without fuzzy name matching

#### 4. Cross-market price comparison

**A pricing analyst wants to know what the same product costs in several countries.**

**Input:** the same run repeated per `country`
**Output:** price, old price, discount and currency per market
**Use:** grey-market spotting, launch pricing, currency-adjusted benchmarks

#### 5. Assortment and range analysis

**A category manager wants the shape of the range, not only its contents.**

**Input:** a full category sweep
**Output:** family and subfamily taxonomy, colours, `is_continuity`, price distribution
**Use:** range width per family, carryover versus seasonal split, price architecture

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/zara-home-product-scraper').call({
  mode: 'overview',
  country: 'DE',
  allCategories: true,
  maxItems: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} products`);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/zara-home-product-scraper').call(
    run_input={
        'mode': 'overview',
        'country': 'DE',
        'allCategories': True,
        'maxItems': 500,
        'maxPrice': 40,
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['name'], item['price'], item['currency'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~zara-home-product-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
  "mode": "detail",
  "country": "DE",
  "productUrls": ["123456789"]
}'
```

#### Automation Tool Workflows (n8n, Zapier, Make, etc.)

1. **Trigger**: schedule or webhook
2. **HTTP Request**: start a run and wait for the dataset
3. **Process**: diff against last week's `product_id` and `price`
4. **Action**: write to your warehouse, or alert on new markdowns

### 📊 Performance & Pricing

[💰 View current pricing](https://apify.com/sian.agency/zara-home-product-scraper?fpr=sian)

#### 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

Two product events, and the `source` column on every row tells you which one applied. Your invoice reconciles against the dataset.

| What you ran | `source` on the row | Event | Price |
|---|---|---|--:|
| Run start | — | Actor start | $0.005 once |
| Category sweep | `overview` | Scraped product | **$0.003** |
| Pasted URL, or a sitemap row | `detail` | Scraped product detail | $0.0075 |

**One switch moves a row onto the higher-priced event.** **Also Crawl the Sitemap** cannot use the bulk endpoint — it is one request per product instead of one per hundred, so those rows bill at $0.0075 instead of $0.003, **2.5× the sweep price**. A 1,000-product sitemap sweep costs $7.50 where the same 1,000 products from the category sweep cost $3.00. Sitemap mode buys completeness, and the category sweep is the default and the cheap path.

#### Cost examples

- **100 products, category sweep**: $0.305
- **1,000 products, category sweep**: $3.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: Do I need a second run to get sizes?**
A: No. This brand's catalogue returns colours, sizes, per-SKU stock, barcodes, dimensions and weight in the cheap category sweep. Detail mode exists for pasted URLs, not because the sweep is missing anything.

**Q: Can I search by keyword?**
A: No, and neither can anything else. The site publishes no server-side search endpoint. Name a category or sweep them all and filter the results yourself.

**Q: Which markets are supported?**
A: Around 210 country stores. Set **Market** to a two-letter country code. Prices come back in that market's own currency with the correct divisor applied.

**Q: Does it return customer reviews?**
A: No. This brand does not publish ratings or reviews through its catalogue, so no scraper can return them.

**Q: How complete is the data?**
A: Measured coverage on Zara Home: price, images, GTIN barcode and description all at 100%. Every column in the table above is documented with what it holds and which brands fill it.

**Q: Do I need a proxy?**
A: No. Leave the proxy off. The Actor reaches the catalogue API 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 container rather than 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 response timed out on a large market**

- Lower **Batch Size** from 100. Some markets return very large product records

**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](https://blog.apify.com/is-web-scraping-legal/).

**Trademarks.** Zara Home 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

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**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](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `mode` (type: `string`):

**Overview** walks the category tree (and optionally the sitemap) and returns every product it finds.

**Detail** takes the product URLs you paste below and returns one full record each. Detail mode needs at least one URL or it stops immediately.

## `country` (type: `string`):

Two-letter store country, e.g. `DE`, `ES`, `FR`, `GB`, `JP`. Around 210 markets are open.

Prices, names and stock are per market. The actor divides the raw minor units by the market divisor, so `price` is already in major units and `currency` tells you which.

If the market you pass is closed, the run stops and prints the codes that are open.

## `language` (type: `string`):

Two-letter language for names and descriptions. Leave empty and the store serves its own default for the market you picked.

An unsupported code stops the run with the list the market does support.

## `allCategories` (type: `boolean`):

Walk every category in the tree. On by default so a bare run returns data.

**This wins over the single category below.** Turn it off to scrape one category.

Categories that are containers rather than product grids return nothing and are skipped, which is normal — the run summary counts them under `categoriesSkipped`.

## `category` (type: `string`):

One category, by slug or numeric id. The slug is the last path segment of a category URL on the brand site.

Turn off **Sweep All Categories** above or this field is ignored.

## `fromSitemap` (type: `boolean`):

After the categories, read the product sitemap and fetch everything the categories missed.

This is the expensive half of a full-catalogue run: sitemap products are fetched one at a time instead of a hundred per call, so those rows are charged as the "Scraped product detail" event at $0.0075 instead of $0.003 — 2.5× the category-sweep price.

Use it when you want the complete catalogue rather than what merchandising currently surfaces.

## `maxItems` (type: `integer`):

Stop after this many products. `0` means no cap — the run goes until the catalogue is exhausted.

Duplicates are removed before the cap is counted, so the number you set is the number of distinct products you get.

## `productUrls` (type: `array`):

One product per line. A full Zara Home product URL works, and so does the bare numeric product id.

## `sort` (type: `string`):

The grid returns pre-sorted id lists rather than accepting a sort parameter, so sorting is applied over the ids the category ships.

## `filters` (type: `array`):

Facet filters as `GROUP=VALUE`, one per line. Values in the same group are OR-ed, different groups are AND-ed.

Shortcuts: `color=Gelb`, `size=M`, `category=...`, `discount=...`. Anything else is passed through as the facet group id, e.g. `colFilter=Gelb`.

The grid ships each facet value with its own product ids, so filtering is a set intersection rather than a query parameter. When a group or value does not exist in the category you picked, the run stops and prints the exact list that does.

## `minPrice` (type: `integer`):

Drop products cheaper than this, in major units of the market currency. Leave empty for no floor.

## `maxPrice` (type: `integer`):

Drop products dearer than this, in major units of the market currency. Leave empty for no ceiling.

## Actor input object example

```json
{
  "mode": "overview",
  "country": "DE",
  "language": "",
  "allCategories": true,
  "category": "neuheiten-kollektion-n942",
  "fromSitemap": false,
  "maxItems": 100,
  "sort": "default",
  "filters": [
    "color=Gelb",
    "size=M"
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

One row per product: price, old price, currency, discount, images, taxonomy, colours, per-SKU sizes and stock.

## `runSummary` (type: `string`):

Your run at a glance: products returned, ids that no longer exist, fetches that failed and how to retry them, how each row was fetched, and an itemized statement of what you paid.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "overview",
    "country": "DE",
    "language": "",
    "maxItems": 100,
    "sort": "default"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/zara-home-product-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "overview",
    "country": "DE",
    "language": "",
    "maxItems": 100,
    "sort": "default",
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/zara-home-product-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "overview",
  "country": "DE",
  "language": "",
  "maxItems": 100,
  "sort": "default"
}' |
apify call sian.agency/zara-home-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/zara-home-product-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ErbR1Tc6q8q5pMELD/builds/1KeEUHNBj5L1gLDTu/openapi.json
