# Zara Scraper - Prices, Rebajas, Variants & Composition (`abotapi/zara-com-scraper`) Actor

Scrape Zara (zara.com) products: current price plus strike-through Rebajas (sale) discount, full colour variant matrix with per-colour availability, and (with full detail) fabric composition and a per-size availability/price matrix. Browse by category or Rebajas, or paste links.

- **URL**: https://apify.com/abotapi/zara-com-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 product results

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 Product Scraper

Pull structured product data from Zara (zara.com), the global fast-fashion retailer. Browse any category or Zara's own Rebajas (sale) catalog for a chosen section, or paste product and category/listing links directly. Every record includes the current price, the strike-through original price with discount percentage when a product is on Rebajas, and the full colour variant matrix with per-colour availability -- plus fabric composition and a real per-size availability/price matrix when you ask for full detail.

### Why This Scraper?

- **Was-price and discount, structured, straight from Zara's own pricing data.** When a product is on Rebajas, the record carries the current price, the strike-through original price, and the discount percentage -- taken directly from the site's own `isOnSale` flag, never guessed. Full-price products return these fields as null, so a discount is always real.
- **Rebajas, first class.** A `specialsOnly` toggle browses the chosen section's own, real, currently-running Rebajas (sale) catalog -- thousands of genuinely marked-down items, not a guessed category.
- **Full colour variant matrix.** Every colourway Zara sells for a product, each with its own price, availability, and image gallery. With full detail on, each colour also carries a real per-size matrix (in stock / out of stock) and each size's own price.
- **Fabric composition.** With `fetchDetails` on, every product also returns its fabric composition -- a material breakdown by percentage, per garment part.
- **Two ways in.** Browse a category or Rebajas feed, or paste any product / category link.
- **Optional export to your apps.** Send results into Notion, Linear, Airtable, or any Apify MCP connector alongside the dataset.

### Data You Get

| Field | Example value |
|---|---|
| productId | `07521308` |
| name | `Sample Ribbed Knit Dress` |
| brand / section | `Zara`, `WOMAN` |
| family / subfamily | `Dresses`, `Midi` |
| reference | `1234/567/800` |
| url | `https://www.zara.com/es/es/sample-ribbed-knit-dress-p07521308.html?v1=545409966` |
| price / currency | `15.99`, `EUR` |
| originalPrice / discountPercent / isOnSale | `25.99`, `38`, `true` |
| availability | `in_stock` |
| colors\[] | `[{"id": "800", "name": "Black", "hexColor": "#000000", "availability": "in_stock", "price": 15.99, "originalPrice": 25.99, "discountPercent": 38, "isOnSale": true, "images": [...], "sizes": [...]}]` |
| compositions | `[{"part": "Outer shell", "materials": [{"material": "Cotton", "percentage": "95%"}, {"material": "Elastane", "percentage": "5%"}]}]` |
| reviews | `[]` |

> Sample shape: values above are illustrative placeholders, not from a live product.

### How to Use

**1. Browse the women's Rebajas (sale) catalog, Spain market:**

```json
{
  "mode": "search",
  "section": "WOMAN",
  "specialsOnly": true,
  "maxItems": 50
}
```

**2. Browse a specific category id, UK market, biggest discount first:**

```json
{
  "mode": "search",
  "market": "gb/en",
  "categoryId": "2420896",
  "sortBy": "discountDesc",
  "maxItems": 40
}
```

**3. Full product detail (composition and per-size availability) for a pasted product link:**

```json
{
  "mode": "url",
  "urls": ["https://www.zara.com/es/es/sample-ribbed-knit-dress-p07521308.html?v1=545409966"],
  "fetchDetails": true
}
```

**4. Paste a category / listing page:**

```json
{
  "mode": "url",
  "urls": ["https://www.zara.com/es/es/mujer-vestidos-l1066.html"],
  "maxItems": 100
}
```

### Input Parameters

| Parameter | Type | Description |
|---|---|---|
| `mode` | string | `search` (browse a category or Rebajas) or `url` (paste links). |
| `market` | string | Zara's own market path prefix, e.g. `es/es`, `gb/en` (search mode only; a pasted URL carries its own market). |
| `section` | string | `WOMAN`, `MAN`, `KID`, or `BEAUTY` (search mode). Drives the Rebajas catalog and labels results. |
| `categoryId` | string | A specific Zara category id to browse (search mode). Ignored when Rebajas only is on. |
| `specialsOnly` | boolean | Browse the chosen section's real Rebajas (sale) catalog instead of a specific category (search mode). |
| `searchTerm` | string | Keep only products whose name/description contains this text (narrows the loaded catalog). |
| `colors` | array | Keep only products with a colourway matching one of these names (partial, case-insensitive). |
| `sizes` | array | Keep only products with one of these sizes in stock. Requires `fetchDetails`. |
| `minPrice` / `maxPrice` | number | Price band to keep, in the market's own currency. |
| `sortBy` | string | Order results after filtering: relevance, price low→high, price high→low, or biggest discount first. |
| `urls` | array | Product or category/listing URLs to scrape (url mode). Filter fields are ignored in this mode. |
| `fetchDetails` | boolean | Add fabric composition and a real per-size availability/price matrix. A pasted product URL always fetches full detail. |
| `maxItems` | integer | Cap on total products returned; `0` = unlimited. |
| `proxy` | object | Connection settings. Defaults work out of the box. |
| `mcpConnectors` | array | Optional MCP connectors to export results into (Notion, Linear, Airtable, Apify). |
| `notionParentPageUrl` | string | Notion connector only: page under which item pages are created. |
| `maxNotifyListings` | integer | Cap on items exported to each connector per run. Does not affect the dataset. |

### Output Example

```json
{
  "productId": "07521308",
  "name": "Sample Ribbed Knit Dress",
  "brand": "Zara",
  "reference": "1234/567/800",
  "section": "WOMAN",
  "family": "Dresses",
  "subfamily": "Midi",
  "description": "Midi dress with a round neckline and long sleeves.",
  "url": "https://www.zara.com/es/es/sample-ribbed-knit-dress-p07521308.html?v1=545409966",
  "currency": "EUR",
  "price": 15.99,
  "originalPrice": 25.99,
  "discountPercent": 38,
  "isOnSale": true,
  "availability": "in_stock",
  "image": "https://static.zara.net/photos/sample/image1.jpg",
  "defaultColorId": "800",
  "colors": [
    {
      "id": "800",
      "name": "Black",
      "hexColor": "#000000",
      "discernProductId": "545409966",
      "availability": "in_stock",
      "images": [
        { "url": "https://static.zara.net/photos/sample/image1.jpg", "width": 1500, "height": 2250, "kind": "GENERAL" }
      ],
      "sizes": [
        { "id": "S", "name": "S", "availability": "in_stock", "sku": 12345678, "price": 15.99, "originalPrice": 25.99, "discountPercent": 38, "isOnSale": true }
      ],
      "currency": "EUR",
      "price": 15.99,
      "originalPrice": 25.99,
      "discountPercent": 38,
      "isOnSale": true
    }
  ],
  "compositions": [
    { "part": "Outer shell", "materials": [{ "material": "Cotton", "percentage": "95%" }, { "material": "Elastane", "percentage": "5%" }] }
  ],
  "reviews": []
}
```

> Sample shape: values above are illustrative placeholders, not from a live product.

### A note on reviews, sort, and brand

Zara does not surface customer reviews on its product pages -- `reviews` is always returned as an empty list rather than omitted or guessed. No usable server-side keyword-search or sort parameter is available on Zara's browse routes, so `searchTerm` and `sortBy` narrow and order results client-side against the site's own real values rather than faking a query. Zara is a single-brand shop, so there is no brand filter -- every record's `brand` is `Zara`.

### Send results into your apps (MCP connectors)

Optionally pipe results into the apps you already use through Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it in the `mcpConnectors` field. Each connector receives a condensed, human-readable summary per product (name plus key fields), while the complete record always stays in the Apify dataset. For Notion, set `notionParentPageUrl` to the page the item pages should be created under, and use `maxNotifyListings` to cap how many items are exported per connector per run. Supported connectors: Notion, Linear, Airtable, and Apify. Leave the field empty to skip; it never changes the dataset output.

# Actor input Schema

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

'search' browses a category or Zara's own Rebajas (sale) catalog for a chosen section. 'url' scrapes any product or category/listing page URL you paste.

## `market` (type: `string`):

Zara's own market path prefix, e.g. 'es/es' (Spain, Castellano) or 'gb/en' (UK, English). Applies to search mode; a pasted URL in url mode carries its own market instead.

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

Which Zara section to browse. Drives the Rebajas catalog below and labels results; a Category id (also below) can point at any category in any section.

## `categoryId` (type: `string`):

A specific Zara category id to browse (any category, from any section). Find one by copying the number after '-l' from a category page's own URL and looking it up, or leave empty and use Rebajas only below. Ignored when Rebajas only is on.

## `specialsOnly` (type: `boolean`):

Browse the chosen section's own, real, currently-running Rebajas (sale) catalog instead of a specific category id -- verified live (thousands of items). Every returned product carries a genuine strike-through original price and discount percentage.

## `searchTerm` (type: `string`):

Only keep products whose name or description contains this text (case-insensitive). Narrows whichever category/Rebajas catalog is loaded above.

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

Only keep products with at least one colourway matching one of these names (case-insensitive, partial match), e.g. 'negro', 'azul'.

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

Only keep products with at least one of these sizes in stock, e.g. 'S', 'M', '40'. Requires Fetch full detail below (per-size availability is only available with full detail) -- ignored otherwise.

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

Only return products priced at or above this amount, in the market's own currency.

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

Only return products priced at or below this amount, in the market's own currency.

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

Order results after filtering. 'Relevance' keeps the catalog's own order.

## `urls` (type: `array`):

Paste one or more zara.com product pages or category/listing pages, in any market. Filter fields above are ignored in this mode.

## `fetchDetails` (type: `boolean`):

Adds fabric composition (material breakdown by percentage) and a real per-size matrix (in stock / low on stock / out of stock, and each size's own price) for every colour. Current price, was-price/discount, and colour-level availability are already included without this toggle. A pasted product URL in url mode always fetches full detail regardless of this toggle.

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

Hard cap on total products returned across every search/URL entry. 0 = unlimited.

## `proxy` (type: `object`):

Connection settings for reaching zara.com. The actor manages the connection it needs for the chosen market automatically, so the defaults here work out of the box; leave them as-is unless you have a specific reason to change them.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "market": "es/es",
  "section": "WOMAN",
  "categoryId": "2420896",
  "specialsOnly": false,
  "sortBy": "relevance",
  "urls": [
    "https://www.zara.com/es/es/mujer-vestidos-l1066.html"
  ],
  "fetchDetails": false,
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (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 = {
    "mode": "search",
    "market": "es/es",
    "categoryId": "2420896",
    "urls": [
        "https://www.zara.com/es/es/mujer-vestidos-l1066.html"
    ],
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/zara-com-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": "search",
    "market": "es/es",
    "categoryId": "2420896",
    "urls": ["https://www.zara.com/es/es/mujer-vestidos-l1066.html"],
    "proxy": { "useApifyProxy": True },
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "search",
  "market": "es/es",
  "categoryId": "2420896",
  "urls": [
    "https://www.zara.com/es/es/mujer-vestidos-l1066.html"
  ],
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call abotapi/zara-com-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=abotapi/zara-com-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/UmnhXD8LGbAexC5AD/builds/G7YRkXXL6vYIauuqL/openapi.json
