# Zara Products Scraper & Monitor (per-size stock, price drops) (`integrative_cafe_8pc/zara-products-monitor`) Actor

Zara products from any category, search or product URL in any country: price, sale price, colors, every size with stock status, images. Monitor mode returns only new products, price drops and sizes back in stock, with webhook alerts.

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

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Products Scraper & Monitor

Get Zara products from any **category page, search or product URL**, in **any Zara country store** (US, Spain, Brazil, France, Germany, UK, Mexico, Japan and more): price, sale price, currency, every color, **every size with its stock status**, images, URL and category.

Turn on **monitor mode**, schedule it every hour, and get **only what changed**: new products, price drops and sizes back in stock, straight to Discord, Slack, Telegram or any webhook.

### Why this one

- **Runs finish.** It reads the same JSON that zara.com loads in your browser, at a gentle pace, and swaps to a fresh residential IP whenever a request is blocked. In our launch test, **5 of 5 inputs across 5 countries (ES, US, FR, DE, BR) returned 100 of 100 products with 0 errors**.
- **Stock per size, per color.** `in_stock`, `low_on_stock`, `out_of_stock` or `coming_soon` for every size, not just "available".
- **Monitor built in.** No spreadsheet diffing: the actor remembers the last run and returns only the changes.
- **Failures are free.** If a product or input still fails, it comes back with an `error` field and is not charged.

### Schedule it every hour and get only new items

1. Set `monitorMode` to `true` and add your category or search URLs.
2. Optional: paste a Discord or Slack webhook in `webhookUrl`.
3. In Apify, create a **Schedule** (for example `0 * * * *`, every hour) for this actor with that input.

Each run returns only products with a change, with a `changes` list like:

```json
[{"type": "priceDrop", "color": "Black", "oldPrice": 29.95, "newPrice": 15.99},
 {"type": "backInStock", "color": "Black", "size": "M", "availability": "low_on_stock"}]
```

Use a different `monitorStateName` for each independent watch list. Set `emitOnFirstRun` to `false` to save the first run silently as a baseline.

### Input

| Field | What it does |
|---|---|
| `startUrls` | Zara category (`…-l1066.html`), search (`…/search?searchTerm=…`) or product (`…-p04174315.html`) URLs from any country site |
| `searchTerms` | Words to search, in the store set by `country` (and optional `language`, `searchSection`) |
| `maxItemsPerInput` | Products per URL or search term (default 20) |
| `includeSizes` | Read every size and its stock (default on; off gives a faster price-only list) |
| `monitorMode` | Return only new products, price drops and sizes back in stock |
| `notifyOn` | Which changes count: `new`, `priceDrop`, `priceIncrease`, `backInStock`, `outOfStock` |
| `webhookUrl` | Discord, Slack, Telegram bot `sendMessage?chat_id=…` or any JSON endpoint |
| `proxy` | Residential by default; blocked sessions are replaced automatically |

### Output (one row per product)

```json
{
  "id": 574950582,
  "name": "VESTIDO MINI ABERTURA",
  "url": "https://www.zara.com/es/es/vestido-mini-abertura-p03152232.html?v1=574950582",
  "price": 29.95,
  "salePrice": 15.99,
  "currentPrice": 15.99,
  "onSale": true,
  "discountPercent": 46,
  "currency": "EUR",
  "inStock": true,
  "sizesInStock": ["XS"],
  "colors": [{
    "colorId": "800", "name": "Negro", "hexCode": "#0A0A0A",
    "price": 29.95, "salePrice": 15.99, "currentPrice": 15.99,
    "sizes": [{"name": "XS", "availability": "low_on_stock", "inStock": true, "lowStock": true, "sku": 574950590},
              {"name": "S", "availability": "out_of_stock", "inStock": false, "lowStock": false, "sku": 574950591}],
    "images": ["https://static.zara.net/assets/public/.../03152232800-p.jpg"]
  }],
  "images": ["https://static.zara.net/assets/public/.../03152232800-p.jpg"],
  "category": "MUJER > COLECCIÓN > VESTIDOS > VER TODO",
  "section": "WOMAN",
  "country": "es",
  "scrapedAt": "2026-10-26T03:00:00+00:00"
}
```

`price` is the regular price; `salePrice` is filled only when the item is discounted.

### Pricing

You pay per result, failures are free.

- **Scraper mode:** per product returned.
- **Monitor mode:** a small fee per product checked, plus a fee per product with a change.

### Notes

Public product data only, no login. Bundles and marketing tiles are skipped; their individual products appear on their own. Stock status is what Zara shows on the product page.

# Actor input Schema

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

Zara category pages (…-l1066.html), search pages (…/search?searchTerm=…) or product pages (…-p04174315.html), from any country site. Country and language are taken from the URL.

## `searchTerms` (type: `array`):

Words to search on Zara, one per line, in the country below (for example: linen shirt, leather jacket).

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

Two-letter Zara store code used for search terms: es, us, br, fr, de, gb, it, mx, pt, jp and others. URLs keep their own country.

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

Optional two-letter language of the store (en, es, pt, fr, de...). Empty uses the store's main language.

## `searchSection` (type: `string`):

Limit search terms to one Zara section.

## `maxItemsPerInput` (type: `integer`):

How many products to take from each URL or search term.

## `includeSizes` (type: `boolean`):

Opens each product to read every size with its stock status (in_stock, low_on_stock, out_of_stock, coming_soon). Turn off for a faster price-only list. Always on in monitor mode.

## `monitorMode` (type: `boolean`):

Remembers what it saw last run and returns only products with changes: new products, price drops and sizes back in stock. Schedule it and get alerts.

## `notifyOn` (type: `array`):

Which changes count in monitor mode. On the first run every product is 'new'.

## `emitOnFirstRun` (type: `boolean`):

On the first monitor run every product is new. Turn off to save the first run silently as a baseline and get only real changes from the second run on.

## `webhookUrl` (type: `string`):

Optional. Each change is POSTed here: Discord or Slack webhook URL, Telegram bot sendMessage URL with chat_id, or any endpoint that accepts JSON.

## `monitorStateName` (type: `string`):

Name of the key-value store that keeps the last seen state. Use a different name for each independent watch list.

## `maxConcurrency` (type: `integer`):

Requests at the same time. Low values are gentler and get blocked less.

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

Residential proxy is recommended; a blocked session is replaced automatically.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.zara.com/us/en/woman-dresses-l1066.html"
  ],
  "country": "us",
  "searchSection": "",
  "maxItemsPerInput": 20,
  "includeSizes": true,
  "monitorMode": false,
  "notifyOn": [
    "new",
    "priceDrop",
    "backInStock"
  ],
  "emitOnFirstRun": true,
  "monitorStateName": "zara-monitor-state",
  "maxConcurrency": 3,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `results` (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 = {
    "startUrls": [
        "https://www.zara.com/us/en/woman-dresses-l1066.html"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("integrative_cafe_8pc/zara-products-monitor").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 = {
    "startUrls": ["https://www.zara.com/us/en/woman-dresses-l1066.html"],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("integrative_cafe_8pc/zara-products-monitor").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 '{
  "startUrls": [
    "https://www.zara.com/us/en/woman-dresses-l1066.html"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call integrative_cafe_8pc/zara-products-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,integrative_cafe_8pc/zara-products-monitor"
        }
    }
}
```

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/eS1SptSmKz6lvgDRe/builds/loagstUJVCHCQzz9L/openapi.json
