# Alza.cz Scraper & Price Tracker (CZ, SK, HU, AT, DE) (`tsutseisoftware/alza-scraper`) Actor

Scrape Alza.cz, Alza.sk, .hu, .at and .de by category, brand, search, Alza code, MPN or product URL. Prices, crossed-out prices, discount codes, stock, stores and pickup, MPN, all parameters, rating distribution, complaint rate, reviews without names. Filters, price monitoring. Unofficial.

- **URL**: https://apify.com/tsutseisoftware/alza-scraper.md
- **Developed by:** [Tomáš Buchta](https://apify.com/tsutseisoftware) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 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/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

## Alza Scraper & Price Tracker (CZ, SK, HU, AT, DE)

Scrape products and prices from **Alza**, the largest e-shop in Central Europe, on all five of its websites: **alza.cz, alza.sk, alza.hu, alza.at and alza.de**. Start from a **category**, a **brand page**, a **filtered or sorted page**, a **promotion**, **search terms**, **product URLs**, or your own list of **Alza codes, product IDs or manufacturer part numbers (MPN)**.

For each product you get the name, brand, Alza code and product ID, the **current price, the crossed-out price and the discount exactly as the price box shows it**, the **discount code and the price with the code** ("Koupit s kódem ALZADNY5"), the trade-in and AlzaPlus+ prices, the monthly instalment, **availability** ("Skladem > 5 ks", "Skladem u dodavatele", "Očekáváme 23. října"), pieces in stock, the condition (**new, unpacked, like new, used**), the rating with the number of ratings, the number of variants, labels and the image.

**Product details are included by default** (one small request per product, no extra charge): the **MPN** for matching with other shops, the **price without VAT**, **all parameters**, **all photos**, warranty, **how many stores have it now**, the fastest delivery, the code's expiry, the promotions and the full category path. The **rating summary** comes with it too: the **rating distribution (5 to 1 stars)**, how many customers **bought it ("1 000+")**, the **recommendation rate** and the **complaint rate ("reklamovanost")**. Optionally you also get **customer reviews without names**, the **full description** and the **delivery date and pickup places (Alza stores, AlzaBoxes, partner points) near a town**.

Built for **price monitoring**: schedule it daily in monitoring mode and you get, and pay for, only products whose price, crossed-out price, code price or availability changed, plus (optionally) products that **disappeared** and the ones that **came back**.

### Why this Alza scraper?

| | This actor |
|---|---|
| 🌍 **Websites** | alza.cz, alza.sk, alza.hu, alza.at, alza.de, each through IPs of its own country |
| 🧾 **Product details** | Included in the price per product: MPN, price without VAT, all parameters and photos, warranty, stores with stock |
| ⭐ **Rating data** | Rating, number of ratings, distribution per star, bought count, recommendation rate, complaint rate (included) |
| 💬 **Reviews** | Optional, text, pros and cons, variant, verified purchase, shop response, **without reviewers' names** |
| 🏷️ **Prices** | Price, crossed-out price (30-day lowest), discount as shown, savings, **discount code + price with code**, trade-in price, AlzaPlus+ price, instalment, price without VAT |
| 📦 **Availability** | 10 clear values (in stock, at the supplier, on the way, on order, expected, pre-order, unavailable…), pieces, condition, stores with stock, pickup places and delivery date near a town |
| 🔎 **Inputs** | URLs of categories, brands, parameters, promotions, searches and products; search terms; **Alza codes, product IDs and MPNs** |
| 🎛️ **Filters** | Website sorting and brand pages; price, discount, code, availability, condition, rating, number of ratings, brands, name words, sponsored, MPN |
| 📉 **Monitoring** | Only new or changed, only price changes, minimum price drop, removed and reappeared products |
| ⚡ **Speed** | No browser, 256 MB; optional fast mode about 4× faster for a tiny extra charge |
| 💲 **Price** | **From $2.49 per 1 000 products**, proxy and platform included, details included |

### What data can you get?

Share of products with a value, measured on 264 products of listing pages saved on 2026-10-14 (laptops, TVs, Apple laptops, cheapest laptops, searches, alza.sk/.hu/.de) and on the product data for the details. Fields marked *optional* need the input in brackets.

| Field | Example | Filled |
|---|---|---|
| Name, Alza code, product ID, URL, image, short description | MacBook Air 13" M5 CZ 2026 Blankytně modrý, NL253a1a, 13268819 | 100 % |
| Brand | Apple, Lenovo | 100 % with details (without: ~52 %, from brand pages and the category's brand list) |
| Price, currency | 31 990 CZK, 839.87 EUR, 221 290 HUF | 100 % |
| Crossed-out price, discount, price badge | 34 990 → 31 990 CZK, 8 %, "Zlevněno -8 %" | discounted products (~14 %) |
| Savings ("Ušetříte …") | 800 CZK | ~9 % |
| Discount code, price with code, code discount | ALZADNY5, 30 391 CZK, 5 % | ~34 % (code expiry with details) |
| Trade-in price, AlzaPlus+ price | 27 891 CZK | when shown |
| Monthly instalment from | 699 CZK | ~70 % |
| Availability, text, pieces | `in_stock`, "Skladem > 5 ks", 5 (at least) | 100 %, pieces ~96 % |
| Condition, price of the new product | `unpacked`, 10 990 CZK | 100 % (second-hand ~3 % of listings) |
| Rating, number of ratings | 4.6, 1 059 | rated products (~80 %) |
| Variants | 7 | products with variants (~45 %) |
| Labels, delivery note, free delivery, sponsored | "Adaptér není v balení", "Do půlnoci objednáš, ráno v AlzaBoxu máš." | ~92 % |
| MPN, price without VAT, warranty *(details, on by default)* | MDHH4CZ/A, 26 438 CZK, 24 months | 100 % of products with details (MPN when the shop has it) |
| Parameters, photos, promotions, category path *(details)* | 60 parameters, 9 photos, "Cenové bomby" | 100 % of products with details |
| Stores with stock, fastest delivery *(details)* | 6, "Můžete mít ihned na 6 prodejnách" | products in stores |
| Rating distribution, bought, recommended, complaint rate *(rating summary, on by default)* | {"5": 2, …}, "100+", 100 %, 1.67 % "nízká reklamovanost" | 100 % with the rating summary |
| Reviews *(Add reviews)* | rating, date, text, pros, cons, variant, verified purchase | products with reviews |
| Description *(Add description)* | the full text | 100 % of products |
| Pickup places, delivery date *(Pickup places near)* | "Alza Praha 5 Anděl – Doručíme 16.10. do 17:30", "Zítra" | 100 % (tested on alza.cz) |

### How to scrape Alza

1. Open a category, brand or search on alza.cz (or .sk, .hu, .at, .de) and copy the URL, or type search terms, Alza codes or MPNs.
2. Paste it into **Category, brand, search or product URLs** (or the other fields) and set **Max products**.
3. Optionally choose **Sort by**, filters, the extras (reviews, description, pickup places) and monitoring.
4. Click **Start**. Download the results as JSON, CSV, Excel or XML, or connect them to your tools.

### Use cases

**Price monitoring of a category (only changes, with price drops of 5 % or more):**

```json
{
  "startUrls": [{ "url": "https://www.alza.cz/televize/18849604.htm" }],
  "maxItems": 0,
  "maxPagesPerCategory": 40,
  "onlyNewOrChanged": true,
  "minPriceDropPercent": 5,
  "monitoringKey": "tv-drops"
}
```

**Competitor price check by MPN (match your catalogue with Alza):**

```json
{
  "mpns": ["MDHH4CZ/A", "WH1000XM5B.CE7"],
  "country": "CZ"
}
```

**Slovak prices of a category, cheapest first, only in stock:**

```json
{
  "startUrls": [{ "url": "https://www.alza.sk/notebooky/18842920.htm" }],
  "sortBy": "cheapest",
  "onlyInStock": true,
  "maxItems": 100
}
```

**Discount hunting: products with a discount code or at least 20 % off:**

```json
{
  "startUrls": [{ "url": "https://www.alza.cz/notebooky/18842920.htm" }],
  "onlyDiscounted": true,
  "minDiscountPercent": 20,
  "maxItems": 200
}
```

**Unpacked and second-hand goods (bazaar) of a brand:**

```json
{
  "startUrls": [{ "url": "https://www.alza.cz/levne-notebooky/18842920.htm" }],
  "brands": ["Lenovo"],
  "conditions": ["unpacked", "like_new", "used"],
  "includeDetails": false,
  "maxItems": 50
}
```

**Reviews and ratings for product research (no names):**

```json
{
  "startUrls": [{ "url": "https://www.alza.cz/iphone-17-pro-256gb-temne-modra-d13078791.htm" }],
  "includeReviews": true,
  "maxReviewsPerProduct": 100
}
```

**Store and AlzaBox availability near Brno for a product list:**

```json
{
  "productCodes": ["NL253a1a", "13078791"],
  "pickupCity": "Brno"
}
```

**Fast listing-only sweep of a whole category (one request per 24 products):**

```json
{
  "startUrls": [{ "url": "https://www.alza.cz/mobily/18843445.htm" }],
  "includeDetails": false,
  "maxItems": 0,
  "maxPagesPerCategory": 100,
  "fastMode": true
}
```

#### Website order and brands

**Sort by** uses the website's own sorted pages of a category (best-selling, cheapest, most expensive, best rated). **Brands** in a category read the website's brand pages (e.g. `…/notebooky/apple/18842920-v1627.htm`), so you don't pay for pages of other brands. You can also paste any page Alza offers in its menus: a brand, a parameter (`…/notebooky/amd-ryzen-7/18842920-par65-106755006.htm`), a sorted page or a promotion. Filters chosen in the browser after `#` are not part of the page address, so use the filters of this actor instead.

#### Filters (you don't pay for filtered-out products)

Price range, only discounted, minimum discount, only with a discount code, only in stock, availability values, condition (new, unpacked, like new, used), minimum rating and number of ratings, brands and excluded brands, words the name must or must not contain, exclude sponsored positions, only with MPN. Filters that need product data (MPN, brand on search pages) are checked again after the product data is read, and freed places are filled with the next products, so **Max products** is still reached.

#### Search terms, codes and MPNs

**Search terms** use the website's own search (Alza opens the matching category for many terms, e.g. "iphone 17"). **Alza codes** are found with the search; **product IDs** (the number after `-d` in the URL) are read directly; **MPNs** are found with the search and returned only when the product's MPN matches exactly. **Country** chooses the website for these inputs; URLs are read on their own website.

#### Fast mode (optional, small extra charge)

Normal speed is at most 30 requests per minute (3 at a time), adjustable up to 60. Fast mode allows up to 120 per minute and 5 at a time, and goes back to the normal speed for the rest of the run the moment Alza answers "too many requests", rejects a request or slows down. It costs $0.01 per 1 000 products saved in fast mode.

#### All inputs

| Input | What it does |
|---|---|
| **Category, brand, search or product URLs** | Alza URLs from alza.cz, alza.sk, alza.hu, alza.at or alza.de: a category (e.g. https://www.alza.cz/notebooky/18842920.htm), a category filtered by a brand or parameter (…/notebooky/apple/18842920-v1627.htm, …/notebooky/amd-ryzen-7/18842920-par65-106755006.htm), a sorted or promotion page (…/levne-notebooky/18842920.htm, …/18842920-e40.htm), a later page (…-p3.htm), a search (https://www.alza.cz/search.htm?exps=iphone) or a product (…-d13268819.htm). |
| **Search terms** | Searched with the website's own search on the website of "Country" (e.g. "iphone 17", "sluchátka sony"). |
| **Alza codes or product IDs** | Alza order codes ("Objednací kód", e.g. NL253a1a; looked up with the website's search) or product IDs (the number after -d in the URL, e.g. 13268819; read directly). |
| **MPNs (manufacturer part numbers)** | Manufacturer part numbers ("Kód výrobce", e.g. MDHH4CZ/A). |
| **Country (for search terms and codes)** | Website for search terms, codes and MPNs. |
| **Max products** | Maximum number of products saved (and charged) in total. 0 = no limit. |
| **Max products per URL** | Maximum number of products from each start URL or search term (and from all codes and MPNs together). 0 = no limit. |
| **Add product details** | Reads each product's data (one small request per product, included in the price): MPN, brand, price without VAT, all parameters, all photos, warranty, stores with stock, fastest delivery, code validity, promotions and the full category path. |
| **Add rating summary** | The product page's rating box: rating distribution (5 to 1 stars), text review count, how many bought it ("1 000+"), recommendation rate and the complaint rate ("reklamovanost"). |
| **Add reviews** | Customer reviews (rating, date, text, pros and cons, variant, verified purchase, likes, shop response) without the reviewer's name or photo. |
| **Max reviews per product** | Newest reviews per product (with "Add reviews"). |
| **Add description** | The full product description as plain text. |
| **Pickup places near** | Adds the delivery date to this town and the nearest Alza stores, AlzaBoxes and partner pickup points with when the product can be picked up there (as the product page's "Dostupnost" window shows it). |
| **Sort by** | The website's sorting of a category (its "Nejprodávanější", "Nejlevnější", "Nejdražší" and "Dle hodnocení" pages). |
| **Brands** | Only these brands (e.g. Apple, Lenovo). |
| **Exclude brands** | Never these brands (checked by the actor on each product; case and diacritics ignored). |
| **Min price** | Lowest price incl. VAT, in the website's currency. |
| **Max price** | Highest price incl. VAT, in the website's currency. |
| **Only in stock** | Only products in stock now ("Skladem", in Alza's warehouse or a store; not "u dodavatele"). |
| **Availability** | Only these availabilities. |
| **Condition** | Only these conditions. |
| **Only discounted** | Only products with a crossed-out price, a discount or savings. |
| **Min discount (%)** | Only products with at least this discount. |
| **Only with a discount code** | Only products offered with a discount code ("Koupit s kódem"). |
| **Min rating** | Only products rated at least this (0–5). |
| **Min number of ratings** | Only products with at least this many ratings. |
| **Name must contain** | Any of these words (case and diacritics ignored). |
| **Name must not contain** | None of these words (case and diacritics ignored). |
| **Exclude sponsored** | Drops sponsored positions ("Sponzorováno") at the top of listings. |
| **Only with MPN** | Only products with a manufacturer part number (needs product details). |
| **Monitoring: only new or changed products** | Saves (and charges) only products that are new or whose price, crossed-out price, price with code or availability changed since the previous run with the same monitoring key. |
| **Monitoring key** | Name of the saved state. |
| **Monitoring: only price changes** | Of the changed products, only those whose price changed (new products are still saved). |
| **Monitoring: min price drop (%)** | Only products whose price fell by at least this many percent since the previous run. |
| **Monitoring: include removed products** | Adds rows with changeType "removed" for products that disappeared since the previous run (only after a run that read everything) and "reappeared" when they are back. |
| **Fast mode (small extra charge)** | Reads Alza about 4x faster: at most 120 requests per minute and 5 at a time instead of 30 per minute and 3 at a time. |
| **Max requests per minute (normal speed)** | All requests together (pages, product data, extras). |
| **Max pages per category** | Listing pages (24 products each) read per category or brand URL. |
| **Max pages per search** | Result pages (24 products each) read per search term or search URL. |
| **Proxy configuration** | Alza answers requests from data centers (also Apify's) with a Cloudflare challenge, so the default is Apify residential proxy. |

#### Monitoring mode explained

With **Monitoring: only new or changed products** the actor remembers what it saw (per **Monitoring key**) and saves only products that are new or whose price, crossed-out price, price with code or availability changed. Product details and extras are read only for those, so a daily run of an unchanged category costs almost nothing. Rows carry `changeType` (`new`, `updated`, `removed`, `reappeared`), `previousPrice`, `priceChange`, `priceChangePercent` and `previousAvailability`. **Only price changes** and **Min price drop (%)** narrow it further. **Include removed products** adds a row for each product that disappeared (only after a run that read the whole listing) and marks it `reappeared` when it is back.

### How much does it cost to scrape Alza?

You pay per saved product. **Platform usage and the residential proxy are included**, and so are product details and the rating summary. Filtered-out and unchanged products (in monitoring mode) are free.

| Plan | Price per 1 000 products | + Fast mode (only products saved in fast mode) |
|---|---|---|
| FREE | **$3.49** | +$0.01 |
| BRONZE | **$3.29** | +$0.01 |
| SILVER | **$2.99** | +$0.01 |
| GOLD and higher | **$2.49** | +$0.01 |

Reviews, description, pickup places and removed-product rows don't change the price per product. There is also a tiny start fee of $0.00005 per run.

Typical runs (normal speed 30 requests per minute; one listing page = 24 products):

| Scenario | Requests | Time (normal / fast mode) | Price (FREE plan) |
|---|---|---|---|
| 20 products with details (the prefilled input) | 41 | ~1.5 min / ~25 s | $0.07 |
| 100 products with details | ~205 | ~7 min / ~2 min | $0.35 |
| 1 000 products, listing data only | ~42 | ~1.5 min / ~30 s | $3.49 |
| 1 000 products with details (default) | ~2 042 | ~70 min / ~18 min | $3.49 |
| 100 products with details, 10 reviews, pickup places and description | ~605 | ~20 min / ~5 min | $0.35 |
| 100 Alza codes or MPNs | ~300 | ~10 min / ~3 min | $0.35 |

For runs longer than an hour (thousands of products with details), raise the run **Timeout** in the run options or use fast mode.

### Input example

```json
{
  "startUrls": [{ "url": "https://www.alza.cz/notebooky/18842920.htm" }],
  "maxItems": 100,
  "sortBy": "bestselling",
  "onlyInStock": true
}
```

### Output example

```json
{
  "id": "alza:NL253a1a",
  "source": "alza.cz",
  "country": "CZ",
  "url": "https://www.alza.cz/macbook-air-13-m5-cz-2026-blankytne-modry-d13268819.htm",
  "name": "MacBook Air 13\" M5 CZ 2026 Blankytně modrý",
  "brand": "Apple",
  "productId": "13268819",
  "productCode": "NL253a1a",
  "mpn": "MDHH4CZ/A",
  "category": "MacBook",
  "categoryPath": ["Počítače a notebooky", "Notebooky", "MacBook"],
  "price": 31990,
  "priceWithoutVat": 26438,
  "currency": "CZK",
  "priceBeforeDiscount": 34990,
  "discountPercent": 8,
  "savings": null,
  "isDiscounted": true,
  "priceBadge": "Zlevněno -8 %",
  "couponCode": "ALZADNY5",
  "couponPrice": 30391,
  "couponDiscountPercent": 5,
  "couponValidUntil": "2026-10-26T23:59:59.0000000+01:00",
  "tradeInPrice": 27891,
  "alzaPlusPrice": null,
  "installmentFrom": 699,
  "newProductPrice": null,
  "availability": "in_stock",
  "availabilityText": "Skladem > 5 ks",
  "stockQuantity": 5,
  "stockQuantityIsMinimum": true,
  "condition": "new",
  "storesWithStock": 6,
  "storeAvailabilityText": "Můžete mít ihned na 6 prodejnách",
  "fastestDelivery": "Můžete mít ihned na 6 prodejnách",
  "deliveryPromo": null,
  "freeDelivery": true,
  "isSponsored": false,
  "rating": 5.0,
  "ratingCount": 3,
  "reviewCount": 0,
  "ratingDistribution": { "5": 3, "4": 0, "3": 0, "2": 0, "1": 0 },
  "purchaseCount": "100+",
  "recommendationRate": 100.0,
  "complaintRate": 1.67,
  "complaintLabel": "nízká reklamovanost",
  "imageUrl": "https://image.alza.cz/products/NL253a1a/NL253a1a.jpg",
  "imageUrls": ["https://image.alza.cz/Foto/f4/NL/NL253a1a.jpg", "https://image.alza.cz/Foto/FotoAddOrig/NL/NL253a1a-01.jpg"],
  "shortDescription": "MacBook - Apple M5 (10jádrový), 13,6\" IPS lesklý 2560 × 1664 px, RAM 16GB, SSD 512GB, …",
  "description": null,
  "specifications": [{ "group": "Displej", "name": "Úhlopříčka displeje", "value": "13,6 \"" }],
  "labels": ["Pořadí mezi nejprodávanějšími v kategorii", "Sleva", "Adaptér není v balení", "Výkon adaptéru: 30 - 72 W", "-9%"],
  "promotions": ["Cenové bomby", "Slevy, kódy, cashbacky"],
  "warranty": "24 měsíců",
  "warrantyMonths": 24,
  "variantCount": 10,
  "reviews": null,
  "pickupCity": null,
  "deliveryToAddress": null,
  "pickupPlaces": null,
  "position": 5,
  "sourceUrl": "https://www.alza.cz/notebooky/18842920.htm",
  "searchQuery": null,
  "matchedBy": null,
  "detailScraped": true,
  "scrapedAt": "2026-10-14T10:00:00Z"
}
```

### Limitations

- **EAN:** Alza doesn't publish EAN codes and its search doesn't find products by EAN. Match products with other shops by **MPN** (with product details, on by default).
- **Price before discount** is the crossed-out price Alza shows; by law it is its lowest price of the 30 days before the discount. `discountPercent` is the percent the price box shows (Alza rounds down: 34 990 → 31 990 is "-8 %").
- **Variants:** the tile shows only the number of variants (`variantCount`); each variant is its own product with its own code and URL (variants that share a page get `…?dq=<product ID>`, which opens exactly that variant), so list them with the category or brand page.
- **Memory:** the default 256 MB is enough for thousands of products; if a run gets close to its memory limit, it stops, saves what it has read and says so in the status message.
- **Sorting** works for categories (the website has sorted pages for them). Searches and categories filtered by a brand keep the website's order; "newest first" has no page of its own.
- **Website filters in the browser** (`#…` after the URL, e.g. a price range or a store) are applied by JavaScript in your browser and are not part of the page; use this actor's filters, brand pages, parameter pages or **Sort by** instead.
- **Brand without details** comes from brand pages or from the category's brand list matched with the start of the name; on search pages it can be null. With details (default) it is Alza's own brand.
- **Pickup places** need a town from the list (Alza asks for an address); they were tested on alza.cz. Stores with stock (`storesWithStock`) come with the product details on every website.
- **Reviews** never include the reviewer's name or photo; review texts may still contain what reviewers wrote about themselves, so use them for analysis, not republishing.
- **Large listings:** **Max pages per category** defaults to 50 pages (1 200 products), up to 500; searches up to 100 pages.
- If Alza rejects a request, it is asked once more after 30 seconds from the same IP address and session (never from another IP). If it rejects a few requests in a row even so, the run stops and says so. When only optional data (rating summary, reviews, pickup places, description) are rejected, that data is turned off for the rest of the run and the run goes on; the status message says which. Products whose data couldn't be read are returned with the listing data (`detailScraped: false`).

### For AI agents and API users

- **Minimal input:** `{"startUrls": [{"url": "https://www.alza.cz/notebooky/18842920.htm"}], "maxItems": 20}`, or `{"searchQueries": ["iphone 17"], "maxItems": 10}`, or `{"productCodes": ["NL253a1a"]}`, or `{"mpns": ["MDHH4CZ/A"]}`.
- One row = one product = one charge (+ the fast-mode event when fast mode is on). Details, rating summary, reviews, pickup places and description don't change the price per product.
- 24 products per listing page. `maxItems` counts saved products, `maxItemsPerStartUrl` limits each URL, search term or the code list.
- Prices are incl. VAT in the website's currency (`currency`: CZK, EUR, HUF). `availability` is one of `in_stock`, `in_store_only`, `at_supplier`, `in_transit`, `on_order`, `expected`, `preorder`, `unavailable`, `out_of_stock`, `unknown`. `condition` is `new`, `unpacked`, `like_new` or `used`. IDs are `alza:<code>` on alza.cz and `alza-sk:<code>` etc. on the other websites.
- Monitoring state is kept per `monitoringKey` between runs of the same user.

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("tsutseisoftware/alza-scraper").call(run_input={
    "startUrls": [{"url": "https://www.alza.cz/notebooky/18842920.htm"}],
    "sortBy": "cheapest",
    "maxItems": 100,
})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(product["name"], product["price"], product["couponPrice"], product["availability"])
```

#### JavaScript

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('tsutseisoftware/alza-scraper').call({
    searchQueries: ['iphone 17'], maxItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((p) => `${p.name}: ${p.price} ${p.currency}`));
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/tsutseisoftware~alza-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"productCodes": ["NL253a1a"], "mpns": ["MDHH4CZ/A"], "includeReviews": true}'
```

You can also connect the actor to Make, Zapier, n8n, Google Sheets, Slack or webhooks and schedule it in Apify Console.

### Troubleshooting

| Status message | What to do |
|---|---|
| `Skipping unsupported URL` | Use an Alza category, brand, parameter, promotion, search or product URL (cart, account and article pages have no product list). |
| `Ignored URL parts …` (log) | Filters after `#` are applied by your browser; use this actor's filters instead. |
| `brands not found: …` | The category has no products of that brand; check the spelling as Alza shows it. |
| `the chosen order is not available …` | Searches and brand pages have no sorted pages; the website's order was used. |
| `no products: …` | The listing or search is empty. |
| `not found: …` | No product with exactly this code, product ID or MPN on the chosen website. |
| `… could not be loaded` | The page or product doesn't exist (anymore); open the URL in your browser. |
| `stopped at the page limit …` | Raise **Max pages per category** or **Max pages per search**. |
| `rating summary turned off (…)` (or reviews, pickup places, descriptions) | Alza rejected that optional data; the products are saved without it. Run again later. |
| `fast mode: N products, then the normal speed because …` | Alza asked to slow down; the rest of the run used the normal speed (no fast-mode charge). |
| `removed products were not checked because …` | The run didn't read everything (e.g. **Max products** reached); removed products are checked in a complete run. |
| `Alza is rejecting requests` | Use the default proxy setting (Apify Proxy, residential) and try again later. |
| `… listing pages could not be read, so the results may be incomplete` | Alza didn't answer some pages; run it again later for complete results. |
| `Saved 0 products (new or changed since last run)` | Nothing changed since the previous monitoring run; that's expected. |

### More Czech & Slovak e-shop scrapers

Compare prices across Czech and Slovak shops with the same output format (EAN for matching, monitoring mode):

- [Datart.cz Scraper](https://apify.com/tsutseisoftware/datart-scraper): electronics: prices, 30-day low, EAN, store availability
- [TSBOHEMIA.CZ Scraper](https://apify.com/tsutseisoftware/tsbohemia-scraper): IT & electronics: prices, discount codes, EAN, site filters
- [Planeo.cz Scraper](https://apify.com/tsutseisoftware/planeo-scraper): electronics & appliances: prices, discount codes, store pickup, EAN
- [Smarty.cz Scraper](https://apify.com/tsutseisoftware/smarty-scraper): electronics: prices, coupons, cashback, EAN, price history, store stock
- [BAUHAUS.cz Scraper](https://apify.com/tsutseisoftware/bauhaus-cz-scraper): DIY & garden: prices, unit prices, stock in 9 stores, variants, EAN
- [Mironet.cz Scraper](https://apify.com/tsutseisoftware/mironet-scraper): electronics: prices, store stock, delivery date, MPN, warranty, price history
- [NAY.sk Scraper (Slovakia)](https://apify.com/tsutseisoftware/nay-sk-scraper): electronics: prices in EUR, discount codes, stock in 54 stores, EAN
- [BAUHAUS.sk Scraper (Slovakia)](https://apify.com/tsutseisoftware/bauhaus-sk-scraper): DIY & garden: EUR prices, Bratislava store stock, variants, EAN
- [Planeo.sk Scraper (Slovakia)](https://apify.com/tsutseisoftware/planeo-sk-scraper): electronics & appliances: EUR prices, discount codes, cashback, stock in 69 stores, EAN
- [TSBOHEMIA.SK Scraper (Slovakia)](https://apify.com/tsutseisoftware/tsbohemia-sk-scraper): IT & electronics: EUR prices, discount codes, EAN, lookups
- [Smarty.sk Scraper (Slovakia)](https://apify.com/tsutseisoftware/smarty-sk-scraper): electronics: EUR prices, coupons, cashback, stock in Slovak stores, EAN

### FAQ

#### Is it legal to scrape Alza?

The actor collects publicly available product data (prices, availability, parameters, ratings) that anyone sees on Alza's websites without logging in. It reads the pages and the data a browser loads on those websites, does not log in, never solves captchas or other challenges, makes at most 30 requests per minute by default (120 in fast mode, with automatic slow-down) and stops when the site keeps rejecting requests. It returns no personal data: reviews come without names or photos. Alza's terms of business (checked 2026-10-14) don't prohibit automated access. How you use the data is your responsibility: use it for price monitoring and analysis, and don't republish the catalogue, descriptions, photos or reviews. If unsure, consult a lawyer. Objections and data protection requests: the **Issues** tab of this actor.

#### Do I need a proxy?

Alza answers requests from data centers (including Apify's own servers) with a Cloudflare challenge, so the default setting uses **Apify residential proxy**, each website through IPs of its own country. It is **included in the price**; you don't pay for it separately. Keep the default setting.

#### Which websites are supported?

alza.cz (CZK), alza.sk (EUR), alza.hu (HUF), alza.at (EUR) and alza.de (EUR). Paste URLs from any of them; **Country** chooses the website for search terms, codes and MPNs.

#### Why are product details on by default?

Because they are cheap (about 10 kB per product) and add what most users need: MPN, brand, price without VAT, parameters, photos, stores with stock and the rating summary. Turn **Add product details** off for the fastest listing-only sweeps.

#### What does fast mode cost and when should I use it?

$0.01 per 1 000 products on top of the normal price, only for products saved at the fast speed. Use it for large categories, product details and long code lists, when the time matters.

#### Why is there no EAN?

Alza doesn't publish EANs. Use the **MPN** (manufacturer part number) to match products with other shops; our other Czech shop scrapers return MPNs and EANs in the same format.

#### Can I use it through the API?

Yes. See the Python, JavaScript and cURL examples above, or the **API** tab.

#### Something doesn't work

Open an issue in the **Issues** tab and include the input you used.

Unofficial, not affiliated with or endorsed by Alza.cz a.s., the operator of Alza. This tool is also known as an Alza API, Alza.cz scraper, Alza price tracker, Alza.sk scraper or "hlídač cen Alza".

# Actor input Schema

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

Alza URLs from alza.cz, alza.sk, alza.hu, alza.at or alza.de: a category (e.g. https://www.alza.cz/notebooky/18842920.htm), a category filtered by a brand or parameter (…/notebooky/apple/18842920-v1627.htm, …/notebooky/amd-ryzen-7/18842920-par65-106755006.htm), a sorted or promotion page (…/levne-notebooky/18842920.htm, …/18842920-e40.htm), a later page (…-p3.htm), a search (https://www.alza.cz/search.htm?exps=iphone) or a product (…-d13268819.htm). Filters chosen in the browser after '#' are not part of the address; use the filters below.

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

Searched with the website's own search on the website of "Country" (e.g. "iphone 17", "sluchátka sony"). Alza opens the matching category for many terms. Up to 20 terms; "Max pages per search" limits each.

## `productCodes` (type: `array`):

Alza order codes ("Objednací kód", e.g. NL253a1a; looked up with the website's search) or product IDs (the number after -d in the URL, e.g. 13268819; read directly). On the website of "Country".

## `mpns` (type: `array`):

Manufacturer part numbers ("Kód výrobce", e.g. MDHH4CZ/A). Looked up with the website's search; a product is returned only when its MPN matches exactly (spaces, dashes and slashes ignored). Alza publishes no EAN codes, so use MPNs to match products with other shops.

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

Website for search terms, codes and MPNs. URLs are read on their own website.

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

Maximum number of products saved (and charged) in total. 0 = no limit.

## `maxItemsPerStartUrl` (type: `integer`):

Maximum number of products from each start URL or search term (and from all codes and MPNs together). 0 = no limit.

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

Reads each product's data (one small request per product, included in the price): MPN, brand, price without VAT, all parameters, all photos, warranty, stores with stock, fastest delivery, code validity, promotions and the full category path. Without it, rows have only what the listing shows (faster).

## `includeRatingStats` (type: `boolean`):

The product page's rating box: rating distribution (5 to 1 stars), text review count, how many bought it ("1 000+"), recommendation rate and the complaint rate ("reklamovanost"). One tiny extra request per product. Needs product details.

## `includeReviews` (type: `boolean`):

Customer reviews (rating, date, text, pros and cons, variant, verified purchase, likes, shop response) without the reviewer's name or photo. One request per 10 reviews. Needs product details.

## `maxReviewsPerProduct` (type: `integer`):

Newest reviews per product (with "Add reviews").

## `includeDescription` (type: `boolean`):

The full product description as plain text. One extra request per product (descriptions are large pages, so runs are slower). Needs product details.

## `pickupCity` (type: `string`):

Adds the delivery date to this town and the nearest Alza stores, AlzaBoxes and partner pickup points with when the product can be picked up there (as the product page's "Dostupnost" window shows it). One extra request per product. Needs product details. Only for products from the town's country.

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

The website's sorting of a category (its "Nejprodávanější", "Nejlevnější", "Nejdražší" and "Dle hodnocení" pages). "Default" keeps the order of the URL. Searches and categories filtered by a brand have no sorted pages and keep the website's order.

## `brands` (type: `array`):

Only these brands (e.g. Apple, Lenovo). In a category the actor reads the website's brand pages (…/notebooky/apple/18842920-v1627.htm); elsewhere it checks the brand of each product.

## `excludeBrands` (type: `array`):

Never these brands (checked by the actor on each product; case and diacritics ignored).

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

Lowest price incl. VAT, in the website's currency.

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

Highest price incl. VAT, in the website's currency.

## `onlyInStock` (type: `boolean`):

Only products in stock now ("Skladem", in Alza's warehouse or a store; not "u dodavatele").

## `availabilities` (type: `array`):

Only these availabilities.

## `conditions` (type: `array`):

Only these conditions. Unpacked, like-new and used (bazaar) goods are separate products on Alza.

## `onlyDiscounted` (type: `boolean`):

Only products with a crossed-out price, a discount or savings.

## `minDiscountPercent` (type: `integer`):

Only products with at least this discount.

## `onlyWithCoupon` (type: `boolean`):

Only products offered with a discount code ("Koupit s kódem").

## `minRating` (type: `number`):

Only products rated at least this (0–5).

## `minRatingCount` (type: `integer`):

Only products with at least this many ratings.

## `nameKeywords` (type: `array`):

Any of these words (case and diacritics ignored).

## `excludeNameKeywords` (type: `array`):

None of these words (case and diacritics ignored).

## `excludeSponsored` (type: `boolean`):

Drops sponsored positions ("Sponzorováno") at the top of listings.

## `onlyWithMpn` (type: `boolean`):

Only products with a manufacturer part number (needs product details).

## `onlyNewOrChanged` (type: `boolean`):

Saves (and charges) only products that are new or whose price, crossed-out price, price with code or availability changed since the previous run with the same monitoring key. Product details are read only for those.

## `monitoringKey` (type: `string`):

Name of the saved state. Use a different key for each tracked list.

## `onlyPriceChanges` (type: `boolean`):

Of the changed products, only those whose price changed (new products are still saved).

## `minPriceDropPercent` (type: `number`):

Only products whose price fell by at least this many percent since the previous run.

## `includeRemovedProducts` (type: `boolean`):

Adds rows with changeType "removed" for products that disappeared since the previous run (only after a run that read everything) and "reappeared" when they are back.

## `fastMode` (type: `boolean`):

Reads Alza about 4x faster: at most 120 requests per minute and 5 at a time instead of 30 per minute and 3 at a time. It stays polite: the moment the website answers "too many requests", rejects a request or slows down, the rest of the run uses the normal speed. Costs $0.01 per 1,000 products saved in fast mode (the "fast-mode" event), nothing after the switch back.

## `maxRequestsPerMinute` (type: `integer`):

All requests together (pages, product data, extras). At most 60.

## `maxPagesPerCategory` (type: `integer`):

Listing pages (24 products each) read per category or brand URL.

## `maxPagesPerSearch` (type: `integer`):

Result pages (24 products each) read per search term or search URL.

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

Alza answers requests from data centers (also Apify's) with a Cloudflare challenge, so the default is Apify residential proxy. With the default setting each website is read through IPs of its own country (alza.sk through Slovak IPs …). The residential proxy is included in the price.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.alza.cz/notebooky/18842920.htm"
    }
  ],
  "searchQueries": [],
  "country": "CZ",
  "maxItems": 20,
  "maxItemsPerStartUrl": 0,
  "includeDetails": true,
  "includeRatingStats": true,
  "includeReviews": false,
  "maxReviewsPerProduct": 10,
  "includeDescription": false,
  "sortBy": "default",
  "onlyInStock": false,
  "onlyDiscounted": false,
  "onlyWithCoupon": false,
  "excludeSponsored": false,
  "onlyWithMpn": false,
  "onlyNewOrChanged": false,
  "monitoringKey": "default",
  "onlyPriceChanges": false,
  "includeRemovedProducts": false,
  "fastMode": false,
  "maxRequestsPerMinute": 30,
  "maxPagesPerCategory": 50,
  "maxPagesPerSearch": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CZ"
  }
}
```

# Actor output Schema

## `products` (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": [
        {
            "url": "https://www.alza.cz/notebooky/18842920.htm"
        }
    ],
    "searchQueries": [],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "CZ"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tsutseisoftware/alza-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 = {
    "startUrls": [{ "url": "https://www.alza.cz/notebooky/18842920.htm" }],
    "searchQueries": [],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "CZ",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("tsutseisoftware/alza-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 '{
  "startUrls": [
    {
      "url": "https://www.alza.cz/notebooky/18842920.htm"
    }
  ],
  "searchQueries": [],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CZ"
  }
}' |
apify call tsutseisoftware/alza-scraper --silent --output-dataset

```

## MCP server setup

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