# Zalando Scraper - Products, Prices, Discounts & Sizes (`scrapewise/zalando-scraper`) Actor

Scrape Zalando search, category and brand pages in 26 European countries: name, brand, color, current and original price, discount %, currency, sizes, Bestseller and Deal flags, images, sponsored flag and link. Sort, price and sale filters. Error rows are free.

- **URL**: https://apify.com/scrapewise/zalando-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 $2.55 / 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

## Zalando Scraper: products, prices, discounts and sizes from 26 Zalando shops

Zalando Scraper collects **the products of any Zalando search, category or brand page**, without an account
or cookies. Each product comes back as one clean row: brand, model name, product type and color, current
price, original price, discount percentage and currency, every size listed, Zalando's flags (Bestseller, Deal, New,
Sustainable...), all product images, the sponsored flag, the position in the list and the product link.

It covers the 26 Zalando shops: Germany, Austria, Switzerland, United Kingdom, Ireland, France, Belgium,
Luxembourg, Netherlands, Italy, Spain, Poland, Czechia, Slovakia, Slovenia, Croatia, Hungary, Romania, Sweden,
Denmark, Norway, Finland, Lithuania, Latvia, Estonia and Greece.

It is used for fashion price monitoring and discount tracking, brand and assortment research, competitor
benchmarking for retailers and brands, building product feeds and catalogs, and following new arrivals or sales in
a category with a daily schedule.

### At a glance

| What | Price |
|---|---|
| Product delivered | **US$ 3.00 per 1,000 products** (US$ 0.003 each) |
| Run start | US$ 0.005 per run |

- 50 products = **US$ 0.155**. 1,000 products = **US$ 3.005**.
- Error rows, duplicates and products skipped by `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.

### Quick start

```json
{
  "searchQueries": ["running shoes"],
  "country": "de",
  "maxItems": 50
}
```

Biggest discounts first, between 20 and 80 in the shop's currency, sale items only:

```json
{
  "searchQueries": ["trench coat", "leather jacket"],
  "country": "uk",
  "sortBy": "sale",
  "minPrice": 20,
  "maxPrice": 80,
  "onlyOnSale": true,
  "maxItems": 300
}
```

Category and brand pages copied from the browser, from any country, with the filters you set on the site:

```json
{
  "startUrls": [
    "https://www.zalando.co.uk/womens-clothing-dresses/",
    "https://www.zalando.fr/nike/",
    "https://www.zalando.it/catalogo/?q=sneakers"
  ],
  "maxItems": 500
}
```

### Input

| Field | What it does |
|---|---|
| `searchQueries` | Keywords as typed in the Zalando search box, one per line. Each one is a search in `country`. |
| `country` | Shop for the keyword searches: `de`, `at`, `ch`, `uk`, `ie`, `fr`, `be`, `lu`, `nl`, `it`, `es`, `pl`, `cz`, `sk`, `si`, `hr`, `hu`, `ro`, `se`, `dk`, `no`, `fi`, `lt`, `lv`, `ee`, `gr` (default `de`). |
| `startUrls` | Search, category or brand pages from any Zalando shop. Filters already in the link (colour, size, brand, price) are kept. |
| `sortBy` | `popularity` (default), `newest`, `sale`, `price_asc` or `price_desc`. A sort already in a link wins. |
| `minPrice`, `maxPrice` | Price range in the shop's currency. |
| `onlyOnSale` | Only products in Zalando's sale (default off). |
| `skipSponsored` | Leave out the advertised products placed at the top of the list (default off). |
| `maxItems` | Cap for the whole run (default 50; 0 = no cap). Zalando shows 84 products per page. |
| `onlyNew` | Remember the products already delivered for the same search and deliver only new ones (default off). |
| `proxyConfiguration` | Apify Proxy by default. |

`searchQuery`, `keyword`, `keywords`, `urls`, `categoryUrls`, `maxResults`, `maxProducts`, `sort` and `onSale` are
accepted too, so inputs written for other Zalando tools keep working.

### Output

One row per product (`type: "product"`).

| Field | Description |
|---|---|
| `sku` | Zalando product code (the same in every country) |
| `name`, `brand`, `modelName`, `productType`, `color` | Full product name and its parts: brand, model, type (Trainers, Maxi dress...) and color |
| `category`, `targetGroup` | Zalando silhouette (Shoe, Dress, Jacket...) and target group (WOMEN, MEN, KIDS, ALL) |
| `price`, `originalPrice`, `discountPercent`, `currency`, `isOnSale` | Price now, price before the discount, discount in percent and the shop's currency |
| `flags`, `flagKinds` | Labels as shown in the shop language (Bestseller, Deal, up to -10%) and their stable codes (BESTSELLER, DEAL, NEW...) |
| `sizes`, `sizeCount` | Every size listed for the product |
| `imageUrl`, `images` | Main packshot and every product photo in full size |
| `url` | Product page |
| `isSponsored`, `page`, `position` | Advertised placement, results page and position in the list |
| `country`, `sourceQuery` | Shop and the input that produced the row |
| `scrapedAt`, `errorCode`, `error` | Time of collection and error details (error rows only) |

Real row (16 Oct 2026, "running shoes" on zalando.de, images cut to 2):

```json
{
  "type": "product",
  "sku": "ONM12P000-K11",
  "name": "CLOUD 6 - Road running shoes - midnight white",
  "brand": "On",
  "modelName": "CLOUD 6",
  "productType": "Road running shoes",
  "color": "midnight white",
  "category": "Low Shoe",
  "targetGroup": "MEN",
  "price": 144.0,
  "originalPrice": 160.0,
  "discountPercent": 10,
  "currency": "EUR",
  "isOnSale": true,
  "flags": ["Bestseller", "Deal"],
  "flagKinds": ["BESTSELLER", "DEAL"],
  "sizes": ["41", "42", "42.5", "43", "44", "44.5", "45", "46", "47", "47.5", "48"],
  "sizeCount": 11,
  "imageUrl": "https://img01.ztat.net/article/spp-media-p1/a26cf1ec749741c0aa5ee465b4189e77/64aee532e8ac43e6975c480001b88d9a.jpg",
  "images": [
    "https://img01.ztat.net/article/spp-media-p1/a26cf1ec749741c0aa5ee465b4189e77/64aee532e8ac43e6975c480001b88d9a.jpg",
    "https://img01.ztat.net/article/spp-media-p1/43483dec38bb4c5981b4af880d44417a/2a9f75e3f7904bd4ab72c3a78322897e.jpg"
  ],
  "url": "https://en.zalando.de/on-trainers-midnight-white-onm12p000-k11.html",
  "isSponsored": true,
  "country": "de",
  "page": 1,
  "position": 3,
  "sourceQuery": "running shoes",
  "scrapedAt": "2026-10-17T07:40:30Z"
}
```

### Errors you may see

Error rows are free and carry `errorCode` and a readable `error`:

| errorCode | Meaning |
|---|---|
| `INVALID_URL` | The link is not a Zalando list page (single product pages ending in `.html` are not supported yet). |
| `NOT_FOUND` | Zalando answered 404 for the link (moved or misspelled category). |
| `NO_LIST` | The page has no product list (a landing or editorial page). Open a category, brand or search page instead. |
| `NO_RESULTS` | No product for the search and filters. Try a broader keyword or fewer filters. |
| `BLOCKED` | Zalando refused every attempt for a search. Run again in a few minutes. |
| `INVALID_INPUT` | A field has a wrong value (for example an unknown country or sort). |

### Integrations, scheduling and AI agents

- **Schedules:** run the same searches daily with `onlyNew` on for new arrivals only, or with it off to follow
  prices and discounts of a whole category over time.
- **Export:** download the dataset as JSON, CSV, Excel or XML, or read it through the Apify API.
- **Make, n8n and Zapier:** use the Apify integrations to push price drops to Google Sheets, Slack, a database or a
  repricing tool.
- **AI agents:** the Actor works through the Apify MCP server, so an assistant can ask for "the 100 biggest sneaker
  discounts on Zalando UK" and get structured rows back.

### FAQ

**Do I need a Zalando account?** No. The Actor reads the public list pages any visitor sees.

**How many products can I get per search?** Up to what Zalando shows for that list: a category such as women's
dresses in the UK has more than 7,000 products (93 pages of 84). Use `maxItems` to cap the run.

**Why are prices different between countries?** Each shop has its own prices and currency (EUR, GBP, PLN, SEK,
CHF...). The `country` field tells which shop a row comes from, and `sku` lets you compare the same product.

**Can I filter by color, size or brand?** Yes: set the filters on the Zalando site and paste the link in
`startUrls`. Every filter in the link is kept.

**Does it collect personal data?** No. Rows describe products only.

### Limitations

- Product detail pages (description, material, stock per size) are not opened in this version; `sizes` lists every
  size Zalando shows for the product.
- Prices are those shown to a visitor at the time of the run, without member or app-only prices.
- Very deep lists stop at 60 pages per search (5,040 products); split by category or price range for more.

### Changelog

- **16 Oct 2026:** first version. Keyword search in 26 shops, category, brand and search links, sort, price range,
  sale filter, sponsored flag, images and `onlyNew`.

# Actor input Schema

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

Words you would type in the Zalando search box, one per line, for example running shoes or trench coat. Each keyword is one search in the chosen country. Leave empty when you paste links below.

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

Zalando shop used for the keyword searches (prices and currency follow it). Links below keep their own country.

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

Optional: search, category or brand pages from any Zalando country, for example https://www.zalando.co.uk/womens-clothing-dresses/ with any filters set on the site (they are kept).

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

Order of the results. A sort already in a link wins.

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

Optional: lowest price, in the shop's currency.

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

Optional: highest price, in the shop's currency.

## `onlyOnSale` (type: `boolean`):

On: only products Zalando lists in its sale.

## `skipSponsored` (type: `boolean`):

On: leaves out the products placed by advertising at the top of the list.

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

Hard cap for the whole run, across all searches and links (84 products per Zalando page). 0 = no cap.

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

On: remembers the products delivered in earlier runs of the same search (in your account) and delivers only new ones. 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": [
    "running shoes"
  ],
  "country": "de",
  "sortBy": "popularity",
  "onlyOnSale": false,
  "skipSponsored": false,
  "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": [
        "running shoes"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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