# Zara Scraper - Prices, Sizes, Stock, Colors & Sales (`scrapewise/zara-scraper`) Actor

Scrape zara.com in any country by keyword, category or product link: price, previous price and discount, color with hex, every size with stock status and SKU, composition, images, family and section. Filters for color, size, price and section. Error rows are free.

- **URL**: https://apify.com/scrapewise/zara-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** E-commerce
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.82 / 1,000 product delivereds

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Zara Scraper: prices, sizes, stock, colors and sales from zara.com in any country

Zara Scraper collects **products from zara.com** by keyword, category link or product link, in the Zara store of the
country you choose (US, UK, Spain, Germany, France, Italy, Mexico, Brazil, Japan and 20+ more), without an account or
cookies. Each row is **one product in one color**, the way Zara sells it: name, reference, section,
family and subfamily, color name and hex code, current price, previous price and discount label when it is on sale,
the promotion end date, the availability of the color and **every size with its own stock status** (in stock, low on
stock, out of stock), SKU, size reference and demand signal ("running out"). With details on (the default), each row
also gets the **composition by part** (outer shell, lining...) with materials and percentages, all colors of the
product and the date it first appeared.

It is used for fast fashion price monitoring and markdown tracking, size and stock availability alerts, assortment
and new arrivals research across countries, competitor analysis for fashion brands and resellers, and clean product
datasets for e-commerce, market research and AI agents.

### At a glance

| What | Price |
|---|---|
| Product color delivered | **US$ 4.50 per 1,000 rows** (US$ 0.0045 each) |
| Run start | US$ 0.005 per run |

- 1,000 dresses with sizes, stock and composition = **US$ 4.51**.
- Error rows, duplicates, filtered products and products already delivered in earlier runs (`onlyNew`) are never
  charged.
- `maxItems` is a hard cap, and a spending limit set on the run stops it cleanly with everything delivered so far.
- Proxy is included.

### Quick start

```json
{
  "searchQueries": ["leather jacket"],
  "maxItems": 50
}
```

Black dresses on sale in Spain, cheapest first:

```json
{
  "searchQueries": ["dress"],
  "country": "es",
  "section": "WOMAN",
  "colors": ["black"],
  "onSaleOnly": true,
  "sortBy": "price_asc",
  "maxItems": 200
}
```

A whole category and a product page from the US store, only colors with a size in stock:

```json
{
  "startUrls": [
    "https://www.zara.com/us/en/woman-dresses-l1066.html",
    "https://www.zara.com/us/en/strappy-strapless-mini-dress-p03152204.html?v1=547664352"
  ],
  "inStockOnly": true,
  "maxItems": 500
}
```

### Input

| Field | What it does |
|---|---|
| `searchQueries` | Keywords, one search each, in the store of `country`. |
| `startUrls` | Product links (`-p03152204.html`), category links (`-l1066.html`) or search links (`/search?searchTerm=`). The country and language in the link are used for that link. |
| `country` | Zara store: `us`, `gb`, `es`, `de`, `fr`, `it`, `nl`, `pt`, `pl`, `tr`, `mx`, `br`, `ca`, `au`, `jp`, `kr`, `ae`, `sa`, `in` and more. Prices and currency follow the store. |
| `language` | Two-letter language of the store (`en`, `es`, `de`...). Empty = the store's main language. |
| `section` | `WOMAN`, `MAN`, `KID` or `HOME`. Empty = all sections. |
| `colors`, `sizes` | Site filters for keyword searches: color groups in English (`black`, `beige`, `blue`...) and sizes (`xs`, `s`, `m`, `l`, `xl`). |
| `minPrice`, `maxPrice` | Price range in the store currency. |
| `onSaleOnly` | Only colors with a previous price above the current price. |
| `inStockOnly` | Only colors with at least one size in stock. |
| `sortBy` | `relevance`, `price_asc` or `price_desc`. |
| `includeDetails` | On by default: opens the product page for composition, sizes (needed for category links), all colors and first visible date. |
| `maxItems` | Cap for the whole run (default 50, 0 = no cap). |
| `onlyNew` | For schedules: delivers only rows not delivered before for the same search. |

### Output fields

| Field | Example |
|---|---|
| `name` | Z1975 HIGH-WAIST WIDE-LEG JOGGER JEANS |
| `productId`, `colorProductId` | 548536010, 586069625 |
| `reference`, `colorReference`, `displayReference` | 04083226-I2026, C04083226407015-I2026, 4083/226 |
| `section`, `family`, `subfamily`, `productType` | WOMAN, PANTALON, B.PANTALON, Wear |
| `colorId`, `colorName`, `colorHex` | 407, Blue, #192438 |
| `price`, `previousPrice`, `currency` | 17.99, 27.99, GBP |
| `discountLabel`, `discountPercent`, `isOnSale`, `promotionEndDate` | -35%, 35, true, 2027-07-11T23:00:00Z |
| `availability` | in_stock, low_on_stock or out_of_stock |
| `sizes` | name, availability, SKU, size reference, price and demand of each size |
| `sizesInStock`, `sizesOutOfStock` | \["XS", "S"], \["M", "L", "XL", "XXL"] |
| `image`, `images` | photo links (1024 px wide) |
| `composition`, `compositionText` | OUTER SHELL: 50% viscose, 50% lyocell |
| `availableColors` | all colors of the product |
| `firstAvailableAt`, `firstVisibleDate` | 2026-08-23T00:00:00Z |
| `description`, `seoDescription` | product text without HTML |
| `url`, `country`, `position`, `sourceQuery` | product link with the color, store, rank in the results, the search or link |

Discount fields are filled only when the color is on sale. Composition and first visible date come with
`includeDetails`.

### Example output

A real row from the UK store (16 Oct 2026), sizes shortened:

```json
{
  "type": "product",
  "productId": "548536010",
  "colorProductId": "586069625",
  "displayReference": "4083/226",
  "name": "Z1975 HIGH-WAIST WIDE-LEG JOGGER JEANS",
  "section": "WOMAN",
  "family": "PANTALON",
  "colorName": "Blue",
  "colorHex": "#192438",
  "price": 17.99,
  "previousPrice": 27.99,
  "discountLabel": "-35%",
  "discountPercent": 35,
  "isOnSale": true,
  "promotionEndDate": "2027-07-11T23:00:00Z",
  "currency": "GBP",
  "availability": "low_on_stock",
  "sizes": [
    {"name": "XS", "availability": "low_on_stock", "sku": 548536012, "reference": "0408322640701-I2026", "price": 17.99, "demand": "DEMAND_RUNNING_OUT"},
    {"name": "S", "availability": "low_on_stock", "sku": 548536013, "reference": "0408322640702-I2026", "price": 17.99, "demand": "DEMAND_RUNNING_OUT"}
  ],
  "sizesInStock": ["XS", "S"],
  "sizesOutOfStock": ["M", "L", "XL", "XXL"],
  "compositionText": "OUTER SHELL: 50% viscose, 50% lyocell",
  "firstAvailableAt": "2026-08-23T00:00:00Z",
  "url": "https://www.zara.com/gb/en/z1975-high-waist-wide-leg-jogger-jeans-p04083226.html?v1=586069625",
  "country": "GB",
  "position": 2,
  "sourceQuery": "jeans"
}
```

### Errors you may see

Error rows are free and have `type: "error"`, an `errorCode` and a plain message.

| errorCode | Meaning |
|---|---|
| `INVALID_URL` | The link is not a Zara product, category or search link. |
| `INVALID_INPUT` | A field has a value the Actor cannot use (for example a three-letter country code). |
| `STORE_NOT_FOUND` | The country code does not match a Zara store. |
| `NOT_FOUND` | The product link no longer exists in that store. |
| `NO_RESULTS` | The search or category has no product with these filters. |
| `BLOCKED` | Zara refused every attempt for that search; run it again in a few minutes. |

### Integrations, scheduling and AI agents

- **Schedules:** run it daily from Apify Schedules. Each run is a fresh price, sale and size stock snapshot; with
  `onlyNew` on, only products not seen before are delivered (new arrivals alert).
- **Export:** download the dataset as JSON, CSV, Excel, XML or HTML, or read it from the Apify API.
- **Make, n8n, Zapier:** use the Apify integration to start the Actor and send rows to Google Sheets, Airtable, Slack
  or your database, for example a back-in-stock or markdown alert for one size.
- **AI agents:** the Actor works as a tool through the Apify MCP server, so Claude, ChatGPT or any MCP client can
  search Zara and check prices, sizes and stock on demand.
- **Webhooks:** get a call when a run finishes and pull the dataset from there.

### FAQ

**Why one row per color?** Zara gives each color its own product ID, photos, price and size stock, and the site shows
them as separate tiles. A product in three colors is three rows.

**Which countries work?** Any country with a Zara online store and a URL like `zara.com/<country>/<language>/`. The
list in the input covers the largest; a store link in `startUrls` works for any other.

**How fresh are prices and stock?** They are read live from the store at run time.

**Do category links include sizes?** Yes with `includeDetails` on (the default): the Actor opens each product page.
With it off, category rows carry price and color availability only, and keyword search rows still carry sizes.

**Is it legal?** The Actor reads public product pages the same way a visitor does and collects no personal data.
Check that your use fits the laws and terms that apply to you.

### Limitations

- Prices are the public online prices of the store; member, app-only or in-store prices are not shown.
- Color and size filters apply to keyword searches; for category links use `minPrice`, `maxPrice`, `onSaleOnly`
  and `inStockOnly`.
- A keyword search returns what Zara's own search returns, which tops out at a few hundred products per keyword.
- Zara Home and Massimo Dutti stores are separate sites and are not covered.

### Changelog

- **16 Oct 2026:** first version. Keyword, category, product and search link input; 28 country stores; section,
  color, size, price, sale and stock filters; price sort; sizes with stock, SKU and demand; composition by part;
  `onlyNew` for schedules.

# Actor input Schema

## `searchQueries` (type: `array`):

Product keywords, one per line, for example leather jacket or linen shirt. Each keyword is one search in the Zara store of the chosen country.

## `startUrls` (type: `array`):

Zara product links (.../us/en/...-p03152204.html), category links (.../us/en/woman-dresses-l1066.html) or search links (.../us/en/search?searchTerm=...). The country in the link is used for that link.

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

Zara store to search: prices, currency, stock and language follow this country.

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

Two-letter language of the store, for example en, es or de. Empty = the store's main language (en for the US and UK, es for Spain...).

## `section` (type: `string`):

Search only one section of the store. Empty = all sections.

## `colors` (type: `array`):

Only these color groups, in English: black, white, blue, beige, brown, grey, green, red, pink, yellow, orange, khaki, printed, metallic... Applied to keyword searches.

## `sizes` (type: `array`):

Only products sold in these sizes, for example xs, s, m, l or xl. Applied to keyword searches.

## `minPrice` (type: `number`):

Skip products cheaper than this, in the store currency. Skipped products are free.

## `maxPrice` (type: `number`):

Skip products more expensive than this, in the store currency.

## `onSaleOnly` (type: `boolean`):

On: only products with a previous price above the current price.

## `inStockOnly` (type: `boolean`):

On: skip products (colors) with no size in stock.

## `sortBy` (type: `string`):

Order of the keyword search results, same options as the site.

## `includeDetails` (type: `boolean`):

On: opens each product page for composition by part, sizes with stock (needed for category links), all colors and first visible date. Off: rows from the search or category list only (faster).

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

Hard cap for the whole run, across all searches and links (one product in one color = one row). 0 = no cap.

## `onlyNew` (type: `boolean`):

On: remembers the products delivered in earlier runs of the same search (in your account) and delivers only products not seen before. Skipped products are free.

## `proxyConfiguration` (type: `object`):

Apify Proxy by default. Change it only if you know you need to.

## Actor input object example

```json
{
  "searchQueries": [
    "leather jacket"
  ],
  "country": "us",
  "section": "",
  "onSaleOnly": false,
  "inStockOnly": false,
  "sortBy": "relevance",
  "includeDetails": true,
  "maxItems": 50,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (type: `string`):

No description

# 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 = {
    "searchQueries": [
        "leather jacket"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/zara-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 = {
    "searchQueries": ["leather jacket"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/zara-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 '{
  "searchQueries": [
    "leather jacket"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/zara-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/zara-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/9nhWXw7UPci4YzHiy/builds/G1Gjk8iANI4c9gPaX/openapi.json
