# OnlineShop.cz Scraper ($1.75/1K): Prices, EAN & Monitoring (`tsutseisoftware/onlineshop-scraper`) Actor

Scrape OnlineShop.cz (Czech electronics and home appliance e-shop) by category, brand, search or EAN: price with the discount code, regular price, lowest price in 30 days, stock, EAN, rating and specifications. Monitoring returns only changed or removed products. Unofficial.

- **URL**: https://apify.com/tsutseisoftware/onlineshop-scraper.md
- **Developed by:** [Tsutsei Software](https://apify.com/tsutseisoftware) (community)
- **Categories:** E-commerce, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.65 / 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

## OnlineShop.cz Scraper: Prices, EAN & Price Monitoring

Scrape products and prices from **OnlineShop.cz**, a large Czech e-shop with home appliances, electronics, tyres, garden and sport goods. Use a **category URL** (also with the website's own filters and sorting), a **category overview**, a **brand page**, the **sale and unpacked sections**, **search terms**, **product URLs** or your own list of **EANs**. For each product you get the name, brand, **EAN**, the price you pay (with the **discount code** the buy button applies), the regular price, the **lowest price of the last 30 days and the real discount**, the price without VAT, stock with pieces and dispatch time, rating, energy class, labels and the unpacked/used condition. Optionally you also get all **technical parameters** and the description from the product page.

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**.

**$1.75 per 1 000 products** (EAN included), with platform usage and the residential proxy included in the price.

> **Česky:** Scraper a hlídač cen pro **OnlineShop.cz**: cena se slevovým kódem, běžná cena, nejnižší cena za 30 dní a skutečná sleva, EAN, sklad, hodnocení, energetická třída a parametry. Kategorie (i s filtry webu), značky, výprodej a rozbalené zboží, hledání, odkazy na produkty a vyhledání podle EAN. Monitoring vrací jen změněné nebo odstraněné produkty. Výstup do Excelu, CSV nebo JSON. Podporu poskytujeme i česky.

### Why use this OnlineShop.cz scraper?

- 🔢 **EAN at no extra cost.** Rows from categories and brands have the EAN of almost every product (95 % of the rows in our test runs), so you can match OnlineShop.cz with other shops or your catalogue at the base price.
- 🏷️ **The price you really pay.** Many products are sold "with a code" (*Koupit s kódem*): the buy button applies the code, so `price` is the price with the code, `couponCode` is the code and `priceBeforeDiscount` the regular price (*Běžná cena*).
- 📉 **Real discounts, not marketing.** `discountPercent` and `isDiscounted` compare the price with the **lowest price of the last 30 days**, as the website shows it under EU law (Omnibus). `lowestPrice30Days` is in every row where the website shows it.
- 🔔 **Monitoring mode and price drop alerts.** Only new or changed products, with `previousPrice`, `priceChange` and `priceChangePercent`, optionally removed and reappeared products, or only drops of at least X %.
- 🎛️ **The website's own filters.** Paste a URL with filters and sorting set on OnlineShop.cz, or use **Brands**, **Min/Max price** and **Sort by**: the website applies them itself, so runs are faster and cheaper.
- 🧮 **Filters you don't pay for.** In stock, discounted, min discount, price range, brands, name keywords, no unpacked or used goods.
- ⚡ **Light and quick.** 1 000 products from categories in about 1.5 minutes, about 30 s with the optional **fast mode** (a tiny extra charge). Works out of the box: the residential proxy it needs is set by default and included in the price.

### What data can you get?

| Field | Example |
|---|---|
| Name, brand, product ID and code | Pračka AEG LFR73164OC 7000 ProSteam® UniversalDose, AEG, 1077590, KOD-0107-7590 |
| EAN | 7332543974429 |
| Price, price without VAT | 13 990 CZK, 11 561.98 CZK |
| Discount code, regular price | BLACKHIT, 21 390 CZK |
| Lowest price in 30 days, real discount | 15 990 CZK, 12 % |
| Availability, pieces, dispatch | in_stock, 50, "Skladem > 50 ks | odešleme zítra do 14:40" |
| Rating, reviews | 5.0, 13 |
| Category, category path | Pračky s předním plněním › Velké elektro › Pračky, sušičky › Pračky › Přední plnění |
| Energy class, labels | A; "–12 % BLACK FRIDAY!", "přivezeme, zapojíme" |
| Unpacked or used, condition, new price | true, "Rozbaleno", 10 379 CZK |
| Price after cashback | 35 990 CZK |
| Parameters, description, MPN (with details) | Celkový objem: 483, … |
| Search term or EAN that found it | `searchQuery`, `matchedBy` |

### How to scrape OnlineShop.cz

1. Open the actor in Apify Console and paste one or more OnlineShop.cz URLs into **Category, brand, search or product URLs**, or type **Search terms**, or paste **EANs**.
2. Set **Max products** and, if you need the parameters and description, turn on **Include details**.
3. Optionally set filters, monitoring and the speed.
4. Click **Start** and download the results as Excel, CSV, JSON or HTML, or get them through the API.

### Use cases

#### Price list of a category

All American fridges with EAN, price, regular price and stock:

```json
{
  "startUrls": [{ "url": "https://www.onlineshop.cz/americke-lednice/" }],
  "maxItems": 0
}
```

#### Daily price monitoring with price drop alerts

Run it on a schedule; each run returns only products whose price dropped by at least 5 % since the previous run, plus the ones that disappeared (the first run only remembers the prices and returns nothing):

```json
{
  "startUrls": [{ "url": "https://www.onlineshop.cz/pracky-predni-plneni/" }],
  "maxItems": 0,
  "onlyNewOrChanged": true,
  "minPriceDropPercent": 5,
  "includeRemovedProducts": true,
  "monitoringKey": "washing-machines"
}
```

#### Cheapest TVs of selected brands, new only

```json
{
  "startUrls": [{ "url": "https://www.onlineshop.cz/televize/" }],
  "brands": ["Samsung", "LG", "TCL"],
  "maxPrice": 15000,
  "sortBy": "price-asc",
  "excludeUsedOrOpenBox": true,
  "onlyInStock": true,
  "maxItems": 50
}
```

#### Search with full parameters

```json
{
  "searchQueries": ["iphone 17", "robotický vysavač"],
  "includeDetails": true,
  "maxItems": 100
}
```

#### Check your own product list by EAN

```json
{
  "eans": ["6921727078506", "7332543974429", "5901292530389"]
}
```

#### Unpacked and returned goods (bazaar) of a category

```json
{
  "startUrls": [{ "url": "https://www.onlineshop.cz/bazar/?cat=11" }],
  "maxItems": 100
}
```

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

Set filters and sorting on OnlineShop.cz and paste the URL: brand, parameter, price and sorting filters are kept. **Brands** and **Min/Max price** in the input are passed to the website's own filters for you (**Brands** in a category with more than one page costs one extra page), and **Sort by** replaces the URL's order. Every filter is also checked on each product before it is saved.

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

**Only in stock**, **Only discounted**, **Min discount (%)**, **Min/Max price**, **Brands**, **Exclude brands**, **Name must contain**, **Name must not contain** and **Exclude used and open-box products**. "In stock" means the stock line says *Skladem*, including goods in the supplier's warehouse (*Skladem dodavatel*, *(ext)*), which the website ships within days.

#### EAN lookups

A row is saved only when the product page shows exactly that EAN (`matchedBy: "ean"`, with the product page data). EANs that OnlineShop.cz doesn't sell are listed in the status message and cost nothing.

#### Fast mode (small extra charge)

Fast mode reads up to about 3× faster and drops back to the normal speed for the rest of the run at the first sign of load (no fast-mode charge from then on). 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, regular price or availability** changed. New reviews, labels, stock counts, dispatch times or a new discount code with the same price don't count as a change. **Monitoring: only price changes** narrows it to price changes, **Monitoring: min price drop (%)** to price drops. Use category URLs rather than search terms for monitoring: searches show at most about 60–70 results.

**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"`. Removed products are checked only after a run that read everything it was asked for (not when **Max products**, **Max products per URL**, 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 OnlineShop.cz?

You pay per saved product. Platform usage **and the residential proxy** are included. Filtered-out products and unchanged products (in monitoring mode) are not charged as products (see the page fees below).

| Plan | Per 1 000 products | + with the product page (**Include details**, product URLs) | + found by an EAN lookup | + Fast mode |
|---|---|---|---|---|
| FREE | **$1.75** | +$0.75 | +$0.80 | +$0.01 |
| BRONZE | **$1.73** | +$0.75 | +$0.80 | +$0.01 |
| SILVER | **$1.70** | +$0.75 | +$0.80 | +$0.01 |
| GOLD and higher | **$1.65** | +$0.75 | +$0.80 | +$0.01 |

A product saved with its product page costs a little more. A product found by an EAN lookup includes its product page and is charged the lookup instead (not both). Removed-product rows are charged like other products.

**Monitoring mode:** unchanged products are free, but each listing page the run reads to check them costs **$0.60 per 1 000 pages** (one page = 24 products, so about $0.025 per 1 000 products checked). **Extra pages (outside monitoring):** pages read beyond what the saved products need cost **$0.60 per 1 000 pages** (`extra-page`): for example a filter that reads many pages for few products, or EANs that are not found. A normal run pays nothing here. See the **Pricing** tab for the current prices.

Typical runs:

| Scenario | Price (FREE plan) | Typical time (normal / fast mode) |
|---|---|---|
| 100 products from a category | $0.18 | a few seconds |
| 1 000 products from categories | $1.75 | ~1.5 minutes / ~30 s |
| 1 search term (up to ~60–70 products) | up to $0.12 | a few seconds |
| 100 products with parameters and description | $0.25 | ~3.5 minutes / ~1.2 minutes |
| 100 EANs, all found | $0.26 | ~7 minutes / ~2.5 minutes |

Fast mode adds $0.01 per 1 000 products.

### Input example

```json
{
  "startUrls": [{ "url": "https://www.onlineshop.cz/americke-lednice/" }],
  "searchQueries": ["iphone 17"],
  "maxItems": 100,
  "includeDetails": false,
  "onlyInStock": false,
  "onlyNewOrChanged": false
}
```

### Output example

Real output with **Include details** (parameters and description shortened):

```json
{
  "id": "onlineshop:1077590",
  "source": "onlineshop.cz",
  "url": "https://www.onlineshop.cz/pracky-predni-plneni/pracka-aeg-lfr73164oc-7000-prosteam-universaldose-1077590P.html",
  "productId": "1077590",
  "productCode": "KOD-0107-7590",
  "name": "Pračka AEG LFR73164OC 7000 ProSteam® UniversalDose",
  "brand": "AEG",
  "ean": "7332543974429",
  "mpn": null,
  "category": "Pračky s předním plněním",
  "categoryPath": ["Velké elektro", "Pračky, sušičky", "Pračky", "Přední plnění"],
  "price": 13990,
  "priceWithoutVat": 11561.98,
  "currency": "CZK",
  "priceBeforeDiscount": 21390,
  "lowestPrice30Days": 15990,
  "discountPercent": 12,
  "isDiscounted": true,
  "couponCode": "BLACKHIT",
  "couponPrice": 13990,
  "priceAfterCashback": null,
  "promoLabel": null,
  "availability": "in_stock",
  "availabilityText": "Skladem > 50 ks | odešleme zítra do 14:40",
  "stockQuantity": 50,
  "isUsedOrOpenBox": false,
  "conditionText": null,
  "newProductPrice": null,
  "rating": 5,
  "reviewCount": 13,
  "labels": ["–12 % BLACK FRIDAY!", "black friday", "přivezeme, zapojíme", "doživotní záruka ökoinvertor"],
  "energyClass": "A",
  "shortDescription": "Pračka - energetická třída A, kapacita 10 kg, český popis programů, 1 600 ot./min, 12 programů, …",
  "imageUrl": "https://static.onlineshop.cz/data/eshop_online/product/1077590/pracka-aeg-lfr73164oc-7000-prosteam-universaldose.jpg",
  "warrantyMonths": null,
  "specifications": {
    "Počet přihrádek dávkovače pracího prostředku": "4",
    "Prací programy": "MixLoad 69min, Eco 40-60, Bavlna, Syntetika, Jemné prádlo, Vlna, …"
  },
  "description": "Pračka\n\nLFR73164OC\n\nTřída energetické účinnosti A\n\nMaximální kapacita (kg) 10\n\n…",
  "detailScraped": true,
  "matchedBy": null,
  "searchQuery": null,
  "position": 1,
  "changeType": null,
  "firstSeenAt": null,
  "previousPrice": null,
  "priceChange": null,
  "priceChangePercent": null,
  "removedAt": null,
  "sourceUrl": "https://www.onlineshop.cz/pracky-predni-plneni/",
  "scrapedAt": "2026-11-09T13:42:33Z"
}
```

### Limitations

- **Search** shows all its results on one page, at most about 60–70 products per term (the website's limit). When the website opens a category for a term (e.g. `lednice`), that category is read up to **Max pages per search**. For complete lists and monitoring, use category or brand URLs. At most 20 search terms per run.
- **Search results have no EAN and no category path** unless you turn on **Include details**. Rows from categories and brands include the EAN.
- **Warranty:** the website doesn't state the standard warranty per product, so `warrantyMonths` is filled only when the product parameters name it (rare). **MPN** is filled only when the parameters name a manufacturer's code (notebooks usually do, most other goods don't); the model is usually part of the name.
- **Parameters:** most product pages have a parameter table; some list the parameters as text in the description, which the actor turns into the same name: value pairs. Some pages (often small appliances and headphones) have only a marketing description: in our test runs 65–90 % of product pages had parameters, depending on the category (`specifications` is null otherwise).
- `priceWithoutVat` is filled for rows from categories, brands and searches; rows from a product URL or an EAN lookup alone have it as null.
- **Reviews:** only the average rating and the number of reviews, never review texts or reviewer names.
- **Images** are returned as URLs only. Product photos are copyrighted, so check the rights before you republish them.
- A page the website rejects is retried once a little later, never from another IP address; if rejections continue, the run stops with what it has saved and says so. Products whose page couldn't be read are returned with the listing data (`detailScraped: false`, no product page charge).

### For AI agents and API users

- **Minimal input:** `{"startUrls": [{"url": "https://www.onlineshop.cz/americke-lednice/"}], "maxItems": 20}`, `{"searchQueries": ["iphone 17"], "maxItems": 20}` or `{"eans": ["6921727078506"]}`.
- One row = one product = one charge, + `product-details` for a row with its product page, + `product-lookup` for a row found by an EAN (instead of `product-details`), + `fast-mode` when fast mode is on. In monitoring mode also `monitoring-page` per listing page read. Per run, `monitoring-page` (monitoring mode) or `extra-page` (otherwise) for pages read beyond the saved products.
- A row always has every field (null or an empty list when not read).
- `maxItems` counts saved products, `maxItemsPerStartUrl` limits each URL, search term or the EAN list.
- Prices are in CZK including VAT. `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("tsutseisoftware/onlineshop-scraper").call(run_input={
    "startUrls": [{"url": "https://www.onlineshop.cz/americke-lednice/"}],
    "maxItems": 100,
})
for product in client.dataset(run.default_dataset_id).iterate_items():
    print(product["name"], product["ean"], product["price"], product["discountPercent"])
```

#### JavaScript

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('tsutseisoftware/onlineshop-scraper').call({ searchQueries: ['iphone 17'], 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 an OnlineShop.cz category, category overview, brand, sale, search or product URL (filters and sorting set on the website are fine). |
| `not found: …` | The EAN isn't sold on OnlineShop.cz (or the product page shows another EAN). |
| `none of the brands … is in this listing` | The category has no product of these brands; check the spelling against the website's brand filter. |
| `the website shows at most one page of results per search` | Use a category or brand URL for more products. |
| `fast mode: N products, then the normal speed because …` | The website 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** was reached); raise the limits for monitoring runs. |
| `… could not be loaded` | The category or product doesn't exist anymore; open the URL in your browser. |
| `OnlineShop.cz is rejecting requests` | Try again later, with the default proxy setting. |
| `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):

- [Czech E-shop Price Comparison](https://apify.com/tsutseisoftware/czech-eshop-aggregator): one product compared across 9 Czech e-shops in one run: lowest price and its shop, price per shop, monitoring
- [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
- [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
- [Mobil Pohotovost Scraper](https://apify.com/tsutseisoftware/mobil-pohotovost-scraper): phones, tablets and watches, new, like new and used: prices, EAN, MPN, condition, stock, monitoring
- [iSTYLE.cz Scraper](https://apify.com/tsutseisoftware/istyle-scraper): Apple products: prices, EAN, Apple part number, open-box and refurbished offers, stock, monitoring

### Custom scrapers and changes

Need a custom version of this actor, another field or filter, or a scraper for a different website? Write to **info@tsutsei-software.com** with the website, the data you need and how often, and we will reply with a fixed quote. We work mainly with clients from the Czech Republic and from outside the EU.

More about us and all our actors: [tsutsei-software.com](https://tsutsei-software.com).

### FAQ

#### Is it legal to scrape OnlineShop.cz?

The actor collects only publicly available product data (prices, availability, parameters, the number of reviews) and no personal data: no review texts, no reviewer names, no contact details. It reads only publicly available data, without logging in, at most 30 requests per minute (90 in fast mode), slows down when the website asks, never changes IP address to get around a limit and never solves captchas or other challenges. The website's terms of use may restrict automated access; how you use the data is your responsibility (GDPR, database rights). Use it for price monitoring and analysis, and don't republish the catalogue or photos. If unsure, consult a lawyer.

#### Do I need a proxy?

OnlineShop.cz needs a residential proxy. It is set by default and its cost is included in the price. Keep the default **Proxy configuration**.

#### Why is the price lower than the regular price on the website?

Many products are sold "with a code": the website's buy button (*Koupit s kódem*) puts the code into the cart automatically, so that is the price a customer pays. You get the code in `couponCode` and the regular price in `priceBeforeDiscount`.

#### 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 page details and long EAN lists, when the time matters.

#### 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 SHOP TRADING, s.r.o., the operator of OnlineShop.cz. It is also known as an OnlineShop.cz API, OnlineShop.cz price tracker or "hlídač cen OnlineShop".

# Actor input Schema

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

OnlineShop.cz category URLs (e.g. https://www.onlineshop.cz/americke-lednice/), category overviews (https://www.onlineshop.cz/elektronika/, its categories are read one after another), brand pages (https://www.onlineshop.cz/xiaomi/), sale sections (https://www.onlineshop.cz/vyprodej/, /bazar/ for unpacked goods), search URLs (https://www.onlineshop.cz/vyhledavani/?q=...) or product URLs. Tip: set filters and sorting on the website and paste the URL; the actor keeps them.

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

Words to search for on OnlineShop.cz, e.g. "iphone 17". The website shows up to about 60-70 results per search; when it opens a category instead (e.g. "lednice"), that category is read up to "Max pages per search". At most 20 terms.

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

Your own list of EANs (barcodes). Each one is confirmed on the product page (rows with matchedBy "ean", the product page data included). Each product found is charged as "Product lookup" ($0.80 per 1 000, see the Pricing tab) instead of "Product details"; EANs not sold on OnlineShop.cz cost nothing and are listed in the status message. At most 1 000 per run.

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

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

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

Maximum number of products from each start URL, search term or the EAN list (0 = no limit). Useful with several categories in one run.

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

Also reads each product page: all technical parameters, description, MPN (when given) and the EAN and category for search results. Charged as "Product details" ($0.75 per 1 000 products with a product page, see the Pricing tab). Rows from categories already include the EAN, price, stock, rating and energy class without it.

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

Maximum length of the product description (with details). 0 = no description.

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

Order of listing pages (the website's own sorting). With a price filter, "Cheapest first" reads fewer pages.

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

Only products in stock ("Skladem").

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

Only products with a real discount: a price lower than the lowest price of the last 30 days (as the website shows it, EU Omnibus), including discount-code prices.

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

Only products with at least this discount (against the 30-day low, as the website shows it).

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

Only products with at least this price (incl. VAT, with the discount code).

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

Only products with at most this price.

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

Only these brands, e.g. Samsung, Hisense (case and diacritics don't matter). In a category with more than one page, the website's brand filter is used.

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

Leave out these brands.

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

Only products whose name contains at least one of these words.

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

Leave out products whose name contains any of these words (e.g. kryt, obal for accessories).

## `excludeUsedOrOpenBox` (type: `boolean`):

Leave out unpacked, returned and used goods (the website's "Rozbaleno" offers).

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

Return (and pay for) only products that are new or whose price, regular price or availability changed since the previous run with the same monitoring key. Ideal for scheduled price monitoring. Unchanged products are free; each listing page read to check them is charged as "Monitoring page" ($0.60 per 1 000 pages of 24 products, see the Pricing tab).

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

Name of the saved monitoring state. Use a different key for each set of categories you monitor. Empty = "default". The value is stored encrypted.

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

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

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

Return only products whose price dropped by at least this many percent since the previous run (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`):

Fast mode reads up to about 3x faster and drops back to the normal speed for the rest of the run at the first sign of load. It 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`):

Maximum listing pages read from each category or brand URL (24 products per page).

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

Maximum pages read per search term. A real search shows all its results (up to about 60-70) on one page; this matters when the website opens a category for the search term.

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

Speed limit at the normal speed (all requests together).

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

OnlineShop.cz needs a residential proxy. It is set by default and its cost is included in the price. You can also use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.onlineshop.cz/americke-lednice/"
    }
  ],
  "maxItems": 20,
  "maxItemsPerStartUrl": 0,
  "includeDetails": false,
  "descriptionMaxLength": 1000,
  "sortBy": "default",
  "onlyInStock": false,
  "onlyDiscounted": false,
  "excludeUsedOrOpenBox": false,
  "onlyNewOrChanged": false,
  "onlyPriceChanges": false,
  "includeRemovedProducts": false,
  "fastMode": false,
  "maxPagesPerCategory": 50,
  "maxSearchPages": 2,
  "maxRequestsPerMinute": 30,
  "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.onlineshop.cz/americke-lednice/"
        }
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "CZ"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tsutseisoftware/onlineshop-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.onlineshop.cz/americke-lednice/" }],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "CZ",
    },
}

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

```

## MCP server setup

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