# Planeo.cz Scraper: Prices, Discount Codes & EAN (`tsutseisoftware/planeo-scraper`) Actor

Scrape Planeo.cz (Czech electronics & appliances chain) by category, search, product code, EAN or URL: price, price before discount, discount codes, stock per store in 100+ stores, delivery date, energy class, EAN and parameters. Site filters, monitoring mode. Unofficial.

- **URL**: https://apify.com/tsutseisoftware/planeo-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 $0.85 / 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

## Planeo.cz Scraper: Prices, Discount Codes & EAN

Scrape products and prices from **Planeo.cz**, a Czech electronics and home appliances chain with more than 100 stores. Start from a **category URL**, **product URLs**, the website's **search** (search terms or search URLs) or your own list of **Planeo product codes or EANs**. For each product you get the name, brand, current price (with and without VAT), **price before discount and savings**, **public discount codes and the price with the code**, stock in the warehouse, **pickup in stores** (number of stores), estimated delivery date, rating and labels. Optionally you also get the **EAN (barcode)**, the technical parameters, a description of up to 1 000 characters and the **stock in each PLANEO store** (pieces, address, region, pickup time). The **energy class** comes with every product that has an energy label.

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

### What's new

- **October 2026: search, lookups, stock per store and fast mode.** All optional; runs with your current input return the same products with the same values as before. The new fields are added at the end of each row; `energyClass` is filled whenever the product has an energy label, the others only when you use the new options:
  - **Search terms** and **search URLs** with the website's own search (relevance or price order, **Max pages per search**).
  - **Product codes** and **EANs**: look up your own product list; the product page confirms each EAN.
  - **Add stock per store**: pieces in each of the ~100 PLANEO stores, with address, region and pickup time.
  - **Energy class** (`energyClass`) from the energy label, with an **Energy classes** filter; `promoLabel` and cashback fields when the website shows a campaign price tag or a cashback price box.
  - **Monitoring: include removed products**: rows for products that disappeared (`changeType: "removed"`) and came back (`"reappeared"`).
  - **Fast mode**: about 4× faster (at most 120 requests per minute) with automatic slow-down, for $0.01 per 1 000 products.
  - **Description length**: the description excerpt can be up to 1 000 characters (default stays ~200).
- **October 2026: Planeo.sk Scraper.** The same scraper for the Slovak shop, with EUR prices, search, EAN/code lookups, cashback and stock in 69 stores: [Planeo.sk Scraper](https://apify.com/tsutseisoftware/planeo-sk-scraper).
- **Second attempt for rejected pages:** a page the site rejects is asked once more 30 seconds later from the same IP, so short-lived blocks no longer leave gaps.
- **Discount codes with the price after the code**, savings, store pickup and delivery dates as separate fields.

### Why use this Planeo scraper?

- 🎟️ **Discount codes.** Many products are cheaper with a code ("Koupit s kuponem"). You get `couponCode` and `couponPrice`, next to the regular price, so you see the real lowest price.
- 🏷️ **Real prices, clearly separated.** Current price, crossed-out price, savings in CZK and %, and the price with a code, each in its own field.
- 🎛️ **The website's own filters and sorting:** brand, availability (ready for shipment / in a store), specific stores, labels and **any category parameter** (screen type, resolution, operating system…). Sorting by price, best sellers or rating is done by the shop, so it's free and fast. Or just paste a URL with filters set on the website.
- 🏬 **Stores and delivery as data:** `storeCount`, `stockText` ("více než 5 ks") and `deliveryDate` as an ISO date.
- 🔢 **EAN** (optional) for matching products with other shops, and **lookups by EAN or product code** for your own product list.
- 🔎 **The website's own search:** search terms or pasted search URLs, sorted by relevance or price.
- 🏬 **Stock in each PLANEO store** (optional): Praha, Brno, Ostrava, Plzeň…, with pieces, address, region and pickup time.
- 📉 **Monitoring mode and price drop alerts.** Only new or changed products, with `previousPrice`, `priceChange` and `priceChangePercent`.
- ⚡ **Fast and light.** No browser and no proxy needed: one listing page gives 24 products. Optional **fast mode** about 4× faster for a tiny extra charge.

### What data can you get?

| Field | Example |
|---|---|
| Name, brand, product ID | Samsung QE55QN72H + Dárek balíček aplikací, Samsung, 35063830 |
| Price incl. / without VAT | 16 655 CZK, 13 764 CZK |
| Price before discount, savings | 16 990 CZK, 335 CZK (2 %) |
| Discount code, price with code | planeo10%, 14 990 CZK |
| Availability | in_stock (Ihned k odeslání, skladem více než 5 ks) |
| Stores with stock, delivery date | 108 stores, 2026-10-14 |
| Rating, ratings | 5.0, 1 |
| Category path | TV, foto a audio video › Televize › QLED televize |
| Energy class | E |
| EAN (optional) | 8806099038533 |
| Parameters (optional) | Úhlopříčka v cm: 138 cm, … |
| Stock per store (optional) | PLANEO Benešov: Skladem 2 ks, K vyzvednutí do 15 min |
| Search term / lookup (searches and lookups) | `searchQuery: "samsung televize"`, `matchedBy: "ean"` |

See the **Output** tab for all fields.

### How to scrape Planeo.cz

1. Open Planeo.cz, go to a category, e.g. `https://www.planeo.cz/televize`, and paste the URL into **Category or product URLs**. Product URLs (e.g. `https://www.planeo.cz/samsung-qe55qn72h`) and search URLs (e.g. `https://www.planeo.cz/vyhledavani?q=samsung`) work too. Or type **Search terms**, **Product codes** or **EANs**.
2. Optionally choose **Sort by** (e.g. *Cheapest first*), **Site filters** (brand, availability, stores, parameters) and **Filters**, and set **Max products**. Turn on **Add EAN and parameters** if you need them.
3. Click **Start** and download the results as JSON, CSV or Excel, or use the API.

**Tip:** set filters and sorting on the website and paste the URL, e.g. `https://www.planeo.cz/televize?znacka=samsung&sort=PRICE_ASC`. The actor keeps them.

### Use cases

**Daily price monitoring of a category:**

```json
{
  "startUrls": [{ "url": "https://www.planeo.cz/televize" }],
  "maxItems": 0,
  "onlyNewOrChanged": true,
  "monitoringKey": "tv-daily"
}
```

**Price drop alerts** of at least 10 %: add `"minPriceDropPercent": 10`.

**The 10 cheapest Samsung OLED TVs ready for shipment:**

```json
{
  "startUrls": [{ "url": "https://www.planeo.cz/televize" }],
  "sortBy": "cheapest",
  "brands": ["Samsung"],
  "parameterFilters": { "Typ obrazovky": "OLED" },
  "siteAvailability": ["in_stock_online"],
  "maxItems": 10
}
```

**Products you can pick up in Brno today:** `"stores": ["Brno"]`.

**Search, sorted by price:**

```json
{
  "searchQueries": ["samsung televize"],
  "sortBy": "cheapest",
  "maxItems": 50
}
```

**Your own product list by EAN or Planeo code** (each EAN is confirmed on the product page):

```json
{
  "eans": ["8806096685983"],
  "productCodes": ["35063830"],
  "maxItems": 0
}
```

**Stock in each store** for the 10 cheapest OLED TVs: add `"includeStoreAvailability": true` to a category input.

**Daily monitoring with removed products:** add `"includeRemovedProducts": true` next to `"onlyNewOrChanged": true`.

**A big category quickly:** add `"fastMode": true` (see the pricing below).

**Discount codes overview:** `"onlyWithCoupon": true` and compare `price` with `couponPrice`.

#### Site filters (applied by the shop)

| Input | What it does |
|---|---|
| **Sort by** | Recommended, Best sellers, Cheapest first, Most expensive first, Best rated. |
| **Brands** | Only these brands, e.g. `Samsung`, `LG`. |
| **Available** | Ready for shipment and/or available in a store. |
| **Available in store** | Specific stores, e.g. `Brno` (all Brno stores), `PLANEO Plzeň`. |
| **Labels** | The category's "Štítky" filter, e.g. `Sleva na další produkt`. |
| **Parameter filters** | Any parameter of the category's filter: `{"Name": "value"}` or `{"Name": ["value 1", "value 2"]}`. |

Names are matched without case and diacritics; a unique beginning is enough (`operacni` → *Operační systém*). If a name or value doesn't exist in a category, the log lists the available ones, and the category is skipped when nothing in it can match. Numeric ranges (e.g. screen size in inches) are not available as site filters; use **Name must contain** or the parameter values instead.

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

| Input | Example |
|---|---|
| **Only products in stock**, **Availability** | in stock / store pickup only / on order / pre-order |
| **Only discounted products**, **Min discount (%)** | crossed-out price, at least 15 % off |
| **Only products with a discount code** | `couponCode` is set |
| **Min price (CZK)**, **Max price (CZK)** | 10 000 – 30 000 |
| **Exclude brands**, **Name must contain**, **Name must not contain** | `OLED`, not `držák` |
| **Min rating**, **Min number of reviews**, **Only products with EAN** | 4.5, 10 |
| **Energy classes** | `A`, `B` (from the energy label or the parameters) |

Safety limits in **Advanced**: **Max pages per category** and **Max pages per search** (24 products per page).

#### Search and lookups

**Search terms** use the website's own search form (at most 10 per run, **Max pages per search**, 24 products per page; sorting by price is done by the website, other orders give relevance). **Product codes** (the "ID" on the product page) must match exactly. **EANs** are confirmed on the product page, so each EAN costs one product page read and the row always has the EAN and parameters. **Parameter filters** work only with categories; **Brands**, **Available**, **Available in store** and **Labels** are checked by the actor for search results (with **Available in store**, the stock per store is read for each product).

#### Fast mode (small extra charge)

Normal speed: at most 30 requests per minute, 2 at a time. **Fast mode**: at most 120 per minute, 4 at a time; it switches back to the normal speed for the rest of the run as soon as the website answers "too many requests", "service unavailable", "forbidden", shows a challenge or slows down, and it waits when the website asks it to wait. It never changes IP address to get around a limit.

#### Monitoring mode explained

With **Monitoring: only new or changed products** each run compares products with the previous run that used the same **Monitoring key**. A product is returned as `changeType: "new"` or `"updated"` only if it is new or its **price, availability, price before discount or price with a code** changed. **Monitoring: only price changes** narrows it to price changes, **Monitoring: min price drop (%)** to price drops.

**Monitoring: include removed products** also returns products of the previous run that are no longer listed as `changeType: "removed"` with `removedAt` and the last known name, price and URL; when such a product comes back, it is `"reappeared"`. It is checked only after a run that read everything it was asked for (not when **Max products**, a page limit or unread pages cut it short; the status message then says why). Use one **Monitoring key** per input.

### How much does it cost to scrape Planeo.cz?

You pay per saved product; see the **Pricing** tab. Platform usage is included and no proxy is needed. 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 | **$0.95** | +$0.01 |
| BRONZE | **$0.93** | +$0.01 |
| SILVER | **$0.90** | +$0.01 |
| GOLD and higher | **$0.85** | +$0.01 |

Product pages, stock per store, searches, lookups and removed-product rows don't change the price per product. The actor makes at most 2 requests at a time and 30 per minute (fast mode: 4 and 120), to keep the load on the shop low. Typical runs:

| Scenario | Requests | Time (normal / fast mode) |
|---|---|---|
| 20 products from a category | 1 | a few seconds |
| 1 000 products from a category | ~42 | ~1.5 min / ~25 s |
| 100 products with EAN and parameters | ~105 | ~4 min / ~1 min |
| 10 products with stock per store | ~11 | ~25 s |
| 1 search term, 50 results sorted by price | 3 | a few seconds |
| 100 EANs | ~200 | ~7 min / ~2 min |

### Input example

```json
{
  "startUrls": [{ "url": "https://www.planeo.cz/televize" }],
  "maxItems": 100,
  "sortBy": "cheapest",
  "brands": ["Samsung", "LG"],
  "includeDetails": false
}
```

### Output example

```json
{
  "id": "planeo:35063830",
  "source": "planeo.cz",
  "url": "https://www.planeo.cz/samsung-qe55qn72h",
  "productId": "35063830",
  "ean": "8806099038533",
  "name": "Samsung QE55QN72H + Dárek balíček aplikací",
  "brand": "Samsung",
  "category": "QLED televize",
  "categoryPath": ["TV, foto a audio video", "Televize", "QLED televize"],
  "price": 16655,
  "priceWithoutVat": 13764,
  "currency": "CZK",
  "priceBeforeDiscount": 16990,
  "savings": 335,
  "discountPercent": 2,
  "isDiscounted": true,
  "couponCode": "planeo10%",
  "couponPrice": 14990,
  "availability": "in_stock",
  "availabilityCode": "CENTRAL_WAREHOUSE_AND_STORE",
  "availabilityText": "Ihned k odeslání, Skladem více než 5 ks. U Vás do 14.10.",
  "stockText": "více než 5 ks",
  "storeCount": 108,
  "storePickupText": "Odběr do 15 minut",
  "deliveryDate": "2026-10-14",
  "rating": 5.0,
  "reviewCount": 1,
  "labels": [],
  "shortDescription": "NEO QLED SMART televize, úhlopříčka 55\"/138 cm …",
  "imageUrl": "https://mc-static.fast.eu/pics/35/35063830/35063830-onesixty.webp",
  "position": 4,
  "specifications": null,
  "description": null,
  "detailScraped": false,
  "changeType": null,
  "firstSeenAt": null,
  "previousPrice": null,
  "priceChange": null,
  "priceChangePercent": null,
  "sourceUrl": "https://www.planeo.cz/televize",
  "scrapedAt": "2026-10-13T10:00:00Z",
  "promoLabel": null,
  "cashbackPrice": null,
  "cashbackAmount": null,
  "energyClass": "G",
  "storeAvailability": null,
  "storesInStock": null,
  "searchQuery": null,
  "matchedBy": null,
  "removedAt": null
}
```

### Limitations

- **Search** uses the website's search form, which returns the same product tiles as categories. Results are in the website's relevance order (or by price), loosely matching products appear further down, and **Max pages per search** (default 5) limits each term. Search URLs from the address bar (`/vyhledavani?q=…`) are read through the same form.
- **Stock per store** costs one request per product (none for products sold online only).
- **Cashback:** Planeo.cz mostly writes cashback only in the product name ("+ Cashback 3 000 Kč"); `cashbackPrice` and `cashbackAmount` are filled only when the website shows a cashback price box.
- **EAN and parameters** are on the product page only: turn on **Add EAN and parameters** (one extra request per product). For product URLs given as input they are always included.
- **Price before discount** is the crossed-out price shown by the shop. The shop doesn't state a 30-day lowest price, so the actor doesn't return one.
- **Member prices (Planeo+)** require login and are not returned.
- **Availability:** products the shop marks as out of stock but orderable ("Zboží na objednávku") are returned as `on_order`.
- **Labels:** the **Labels** input uses the names of the category's "Štítky" filter; the output field `labels` contains the badges shown on the product tile (e.g. "Kup spolu"), which can differ.
- **Brands:** the shop lists only the most common brands in its filter. For other brands the actor filters the products itself, which reads more pages.
- **Descriptions:** only an excerpt (**Add a short description excerpt**, ~200 characters by default, up to 1 000 with **Description length**). Images are returned as URLs; product photos and texts are copyrighted, so check the rights before you republish them.
- If the site rejects a request, a rejected page is asked once more after 30 seconds from the same IP address and session (never from another IP), which recovers short-lived rejections. If it rejects a few requests in a row even so, the run stops and says so. Products whose page couldn't be read are returned with the listing data (`detailScraped: false`).

### For AI agents and API users

- **Minimal input:** `{"startUrls": [{"url": "https://www.planeo.cz/televize"}], "maxItems": 20}`.
- **Other sources:** `searchQueries` (up to 10), `productCodes` and `eans` (up to 500 together); rows from lookups have `matchedBy` (`productCode` or `ean`) and `searchQuery`.
- **Options:** `includeStoreAvailability` (`storeAvailability`, `storesInStock`), `includeRemovedProducts` (with `onlyNewOrChanged`), `fastMode` (+$0.01 per 1 000 products saved at the fast speed).
- One row = one product = one charge. `includeDetails: true` adds 1 request per product, same price per product.
- 24 products per listing page. `maxItems` counts saved products, `maxItemsPerStartUrl` limits each URL.
- Prices are in CZK. `availability` is one of `in_stock`, `in_store_only`, `on_order`, `preorder`, `out_of_stock`, `unknown`.
- 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("<username>/planeo-scraper").call(run_input={
    "startUrls": [{"url": "https://www.planeo.cz/televize"}],
    "sortBy": "cheapest",
    "maxItems": 100,
})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(product["name"], product["price"], product["couponPrice"])
```

#### JavaScript

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('<username>/planeo-scraper').call({
    startUrls: [{ url: 'https://www.planeo.cz/televize' }], maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((p) => `${p.name}: ${p.price} CZK`));
```

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 a Planeo.cz category, product or search URL (cart and account pages are not supported). |
| `not found: …` | The product code or EAN is not on Planeo.cz (or the search found a product with another EAN). |
| `the search is turned off` | Search and lookups are temporarily off; use category or product URLs. |
| `Fast mode switched to the normal speed: …` | The website showed signs of load; the run continues at the normal speed without the fast-mode charge. |
| `removed products were not checked …` | The run didn't read everything (see the reason); removed products are checked in the next complete run. |
| `unknown brand / store / value …` (log) | Use one of the names listed in the log for that category. |
| `… skipped because the site filters match nothing there` | No product in that category has the requested value. |
| `… could not be loaded` | The category or product doesn't exist anymore; open the URL in your browser. |
| `Planeo.cz is rejecting requests` | Try again later. |
| `… listing pages could not be read, so the results may be incomplete` | The site 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
- [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
- [Alza Scraper (CZ, SK, HU, AT, DE)](https://apify.com/tsutseisoftware/alza-scraper): electronics: prices, coupons, ratings, reviews, pickup points, MPN
- [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 Planeo.cz?

The actor collects only publicly available product data (prices, availability, codes, parameters) and no personal data: no reviews or contacts. It does not log in, makes at most 30 requests per minute (120 in the optional fast mode, which slows down at the first sign of load) and never solves captchas or other challenges. The site's robots.txt asks crawlers not to use its filter and sorting parameters; the actor uses them (gently) when you set site filters or sorting. How you use the data is your responsibility. Use it for price monitoring and analysis, and don't republish the catalogue, texts or photos. If unsure, consult a lawyer.

#### Can I look up products by EAN?

Yes. Put the EANs into **EANs** (or Planeo codes into **Product codes**). The actor uses the website's search and confirms each EAN on the product page; EANs that aren't on Planeo.cz are listed in the status message.

#### What does fast mode cost?

$0.01 per 1 000 products, only for products saved while the fast speed was on. If the website shows any sign of load, the run switches back to the normal speed and stops charging it.

#### Do I need a proxy?

No. Planeo.cz works without a proxy, including from Apify's servers. You can still use Apify Proxy or your own proxies if you prefer.

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

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

#### Something doesn't work

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

This is an unofficial tool, not affiliated with or endorsed by FAST ČR, a.s. (PLANEO), the operator of Planeo.cz. It is also known as a Planeo API, Planeo price tracker or "hlídač cen Planeo".

# Actor input Schema

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

Planeo.cz category URLs (e.g. https://www.planeo.cz/televize), product URLs (e.g. https://www.planeo.cz/tcl-65c69k) or search URLs (e.g. https://www.planeo.cz/vyhledavani?q=samsung). Tip: set filters and sorting on the website and paste the URL (e.g. …/televize?znacka=samsung\&sort=PRICE_ASC); the actor keeps them.

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

Optional. Searched with the website's own search, in its order (e.g. "lg oled", "iphone 17"). Up to 10 terms per run; "Max pages per search" limits each. Sorting by price works for searches too.

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

Optional. Planeo product codes (the number after "ID:" on the product page, the end of the id field, e.g. 35063830). Each is looked up with the website's search; only an exact code match is returned.

## `eans` (type: `array`):

Optional. EAN barcodes (check digit verified). The website's search finds the product and the product page confirms the EAN (one product page per EAN, so EAN and parameters are included). Up to 500 codes and EANs per run.

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

Maximum number of products saved. You pay per saved product. 0 = no limit.

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

Limit for each start URL separately, so one large category doesn't use up the whole Max products. 0 = no limit.

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

Open each product page to add the EAN (barcode), the technical parameters and the exact rating. Slower: one extra request per product.

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

Add the first ~200 characters of the product description ("Description length" allows up to 1 000). Reads the product page (like "Add EAN and parameters"), so it is slower.

## `descriptionMaxLength` (type: `integer`):

Maximum characters of the description excerpt (with "Add a short description excerpt"). Default 200; up to 1 000.

## `includeStoreAvailability` (type: `boolean`):

Stock in each of the ~100 PLANEO stores as the website's "availability in stores" window shows it: store, address, region, pieces, pickup time. One extra request per product (none for products sold online only).

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

Order of products, as on the website. Sorting is done by the shop, so it's free and fast.

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

Only these brands, e.g. 'Samsung', 'LG'. Case doesn't matter.

## `siteAvailability` (type: `array`):

Only products that ship now from the e-shop and/or are available in a store, as in the website's filter.

## `stores` (type: `array`):

Only products in stock in these stores, e.g. 'Brno', 'PLANEO Plzeň'. A town selects all its stores. Several values = any of them. With searches or lookups the actor reads the stock per store to check it.

## `labels` (type: `array`):

Only products with these website labels (the 'Štítky' filter of the category), e.g. 'Sleva na další produkt'. With searches and lookups the actor checks the labels shown on the product tiles.

## `parameterFilters` (type: `object`):

Filter by the category's parameters, as in the website's filter. Keys are parameter names, values are a value or a list of values (any of them). Example for TVs: {"Typ obrazovky": \["OLED", "QLED"], "Operační systém": "Google TV", "Rozlišení": "4K"}. Available names and values are listed in the log when a name isn't found.

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

Keep only products in stock for shipping (in the central warehouse). Store-only products are skipped.

## `availability` (type: `array`):

Keep only products with these availability states.

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

Keep only products shown with a crossed-out price and 'Ušetříte' (you save).

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

Keep only products discounted by at least this many percent (as shown by the shop).

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

Keep only products with a cheaper price with a discount code ('Koupit s kuponem'). The code is in couponCode.

## `minPrice` (type: `integer`):

Keep only products with price (incl. VAT) at least this.

## `maxPrice` (type: `integer`):

Keep only products with price (incl. VAT) at most this. Tip: combine with Sort by: Cheapest first.

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

Skip products of these brands, e.g. 'Sencor'. Case and diacritics don't matter.

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

Keep only products whose name contains at least one of these words (case and diacritics don't matter), e.g. 'OLED'.

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

Skip products whose name contains any of these words, e.g. 'držák'.

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

Keep only products rated at least this (0–5 stars). Products without ratings are skipped when set.

## `minReviewCount` (type: `integer`):

Keep only products with at least this many ratings.

## `energyClasses` (type: `array`):

Only these energy classes (from the energy label in the listing, or the parameters with details).

## `onlyWithEan` (type: `boolean`):

Skip products without an EAN (barcode). Reads the product pages (like "Add EAN and parameters").

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

Return only products that are new or whose price, availability, price before discount or discount-code price changed since the previous run with the same Monitoring key. Unchanged products are free.

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

Name of the saved state. Use a different key for each tracked set of products (e.g. 'tv-daily').

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

With monitoring: return new products and products whose price changed, not availability-only changes.

## `minPriceDropPercent` (type: `integer`):

With monitoring: return only products whose price dropped by at least this many percent (price drop alerts).

## `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 Planeo.cz about 4x faster: at most 120 requests per minute and 4 at a time instead of 30 per minute and 2 at a time. It stays polite: the moment the website answers "too many requests", "service unavailable", "forbidden", shows a challenge or slows down, the run switches back to the normal speed for the rest of the run; it waits when the website asks it to wait and never changes IP address to get around a limit. Extra charge "Fast mode" ($0.01 per 1 000 products, see the Pricing tab) only for products saved while the fast speed was on.

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

Safety limit for each category (24 products per page). 0 = no limit.

## `maxSearchPages` (type: `integer`):

Result pages (24 products each) read per search term. The website's search also lists loosely matching products further down.

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

Not needed: Planeo.cz works without a proxy. You can use Apify Proxy or your own proxies if you prefer.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.planeo.cz/televize"
    }
  ],
  "maxItems": 20,
  "maxItemsPerStartUrl": 0,
  "includeDetails": false,
  "includeDescription": false,
  "descriptionMaxLength": 200,
  "includeStoreAvailability": false,
  "sortBy": "recommended",
  "parameterFilters": {},
  "onlyInStock": false,
  "onlyDiscounted": false,
  "onlyWithCoupon": false,
  "onlyWithEan": false,
  "onlyNewOrChanged": false,
  "monitoringKey": "default",
  "onlyPriceChanges": false,
  "includeRemovedProducts": false,
  "fastMode": false,
  "maxPagesPerCategory": 50,
  "maxSearchPages": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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.planeo.cz/televize"
        }
    ],
    "maxItems": 20,
    "parameterFilters": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("tsutseisoftware/planeo-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.planeo.cz/televize" }],
    "maxItems": 20,
    "parameterFilters": {},
}

# Run the Actor and wait for it to finish
run = client.actor("tsutseisoftware/planeo-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.planeo.cz/televize"
    }
  ],
  "maxItems": 20,
  "parameterFilters": {}
}' |
apify call tsutseisoftware/planeo-scraper --silent --output-dataset

```

## MCP server setup

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