# Smarty.cz Scraper: Prices, Stock, EAN & Filters (`tsutseisoftware/smarty-scraper`) Actor

Scrape Smarty.cz (Czech phone, gaming & electronics retailer) by category, search, order code, EAN or product URL: price with and without VAT, discounts, discount codes, cashback, stock per store, dispatch date, EAN, parameters, price history. Site filters, monitoring, fast mode. Unofficial.

- **URL**: https://apify.com/tsutseisoftware/smarty-scraper.md
- **Developed by:** [Tomáš Buchta](https://apify.com/tsutseisoftware) (community)
- **Categories:** E-commerce
- **Stats:** 1 total users, 0 monthly users, 93.8% 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

## Smarty.cz Scraper: Prices, Stock, EAN & Filters

Scrape products and prices from **Smarty.cz**, a Czech retailer of phones, tablets, gaming, computers and accessories with stores across the Czech Republic. Use a **category URL**, **product URLs**, **search queries**, **order codes** or **EANs**. For each product you get the name, brand, **price with and without VAT**, **price before discount and discount %**, **discount codes and the price with the code**, **cashback and the price after cashback**, availability and stock, **dispatch and release dates**, labels, gift with purchase, energy class, colour variants, key parameters and rating. Optionally you also get the **EAN (barcode)**, **MPN**, **warranty**, full technical parameters, the **price history** and the **stock in each store**.

Built for **price monitoring**: schedule it daily in monitoring mode and you get, and pay for, only products whose price or availability changed.

> Smarty.cz here is the Czech electronics retailer (Smarty CZ a.s.), not the US address-verification company Smarty.

### What's new

- **October 2026: lookups, removed products and fast mode.**
  - **Order codes and EANs:** look up up to 100 products per run by Smarty order code or EAN (barcode, with or without leading zeros). EANs are confirmed on the product page; `matchedBy` says which input found the product.
  - **Monitoring: include removed products:** products that disappeared since the previous run come back once as `changeType: "removed"` (with their last known values and `removedAt`), and as `"reappeared"` when they are back.
  - **Fast mode:** about 5× faster (60 requests per minute, 2 at a time) for $0.01 per 1,000 products; it falls back to the normal speed by itself when the site pushes back.
  - Store names in **Add stock in stores** no longer end with a stray comma ("Ostatní prodejny", "Dodavatelé").
  - Nothing changes for existing inputs: the new options are off by default, and the output only gains the empty fields `matchedBy` and `removedAt`.
- **October 2026: Smarty.sk Scraper.** The same scraper for the Slovak shop, with EUR prices, Slovak stores and EAN/code lookups: [Smarty.sk Scraper](https://apify.com/tsutseisoftware/smarty-sk-scraper).
- **Steadier long runs:** memory stays flat on runs with thousands of products (proxy connections are now closed when idle).
- **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.
- **Search, discount codes, cashback, gift value, energy class, colour variants and release dates** straight from the listing, plus optional **price history** and **stock in each store**.

### Why use this Smarty.cz scraper?

- 🏷️ **Prices as shown on the website:** price incl. VAT, price without VAT, crossed-out price and discount %, each in its own numeric field.
- 🎟️ **Promotions as data:** discount codes (`couponCode`, `couponPrice`), cashback (`cashbackCzk`, `priceAfterCashback`) and gift value (`giftValueCzk`), read from the listing without extra requests.
- 📦 **Availability as data:** `availability` (in stock, store only, at the supplier, in transit, pre-order…), `stockText` ("> 5 ks"), `dispatchDate` and `releaseDate` as ISO dates.
- 🎛️ **The website's own filters and sorting:** brand, in stock (total / e-shop / Prague within 120 minutes), **stock in specific stores**, price range, new goods only and **any parameter of the category** (operating system, RAM, 5G, colour…). Sorting by price or newest is done by the shop, so it's free and fast. Or just paste a URL with filters set on the website.
- 🔎 **Search, order codes and EANs:** up to 10 search queries and 100 order code / EAN lookups per run.
- 🔢 **EAN and MPN** (optional) for matching products with other shops.
- 📈 **Optional price history and store stock** for each product.
- 📉 **Monitoring mode and price drop alerts.** Only new or changed products, with `previousPrice`, `priceChange` and `priceChangePercent`, and optionally `removed` and `reappeared` products.
- ⚡ **Light.** No browser: one listing page gives 24 products. Optional **fast mode** about 5× faster for a tiny extra charge.

### What data can you get?

| Field | Example |
|---|---|
| Name, brand, order code | Apple iPhone 17 Pro 256GB kosmicky oranžový, Apple, 278120 |
| Price incl. / without VAT | 29 990 CZK, 24 785 CZK |
| Price before discount, discount | 32 990 CZK, 9 % |
| Discount code, price with the code | EXTRA5 (5 %), 20 187 CZK |
| Cashback, price after cashback | 2 000 CZK, 5 990 CZK |
| Availability, stock | in_stock (Skladem celkem > 5 ks) |
| Dispatch, release date | Dnes → 2026-10-13; V prodeji od 23.10.2026 → 2026-10-23 |
| Labels, gift | Akce, Upgrade bonus 1 500 Kč; Dárek k nákupu v hodnotě 499 Kč (499) |
| Energy class, colour variants | A; Béžová, Grafitová (with product URLs) |
| Used / open-box | `isUsedOrOpenBox`, `conditionLabel` ("Použité", "Rozbalené", "Zánovní") |
| Key parameters | Velikost RAM: 12 GB, Velikost úložiště: 256 GB, … |
| Rating | 4.2 |
| EAN, MPN (optional) | 4711085949493, SLEG-860-1000GCS |
| Warranty (optional) | 60 months (businesses 60 months) |
| Parameters, category path (optional) | Kapacita disku: 1000 GB, …; Počítače, komponenty a IT › Komponenty › … |
| Price history (optional) | 2026-09: 5 790 CZK, 2026-10: 3 990 CZK, … |
| Stock in stores (optional) | Brno - Olympia: Skladem celkem > 5 ks, pickup Do 60 min |

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

### How to scrape Smarty.cz

1. Open Smarty.cz, go to a category, e.g. `https://www.smarty.cz/mobily-4c13740`, and paste the URL into **Category or product URLs**. Product URLs (e.g. `https://www.smarty.cz/ADATA-LEGEND-860-M-2-PCIe-4-0-1TB-4p208447`) and search URLs (`https://www.smarty.cz/Vyhledavani?query=powerbanka`) work too. Or type words into **Search queries**, or codes into **Order codes** / **EANs**.
2. Optionally choose **Sort by** (e.g. *Cheapest first*), **Site filters** (brand, availability, stores, parameters, new goods only) and **Filters**, and set **Max products** (and **Max products per URL** for several categories). Turn on **Add EAN, warranty and parameters**, **Add price history** or **Add stock in stores** 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.smarty.cz/mobily-4c13740?s=p#pr=833&st=1` (Apple, in stock, cheapest first). The actor keeps them.

### Use cases (ready-made inputs)

**The 20 cheapest phones in stock:**

```json
{
  "startUrls": [{ "url": "https://www.smarty.cz/mobily-4c13740" }],
  "sortBy": "cheapest",
  "siteAvailability": ["in_stock"],
  "excludeUsedOrOpenBox": true,
  "maxItems": 20
}
```

**Products with cashback** (price after cashback included):

```json
{
  "startUrls": [{ "url": "https://www.smarty.cz/mobily-4c13740" }],
  "onlyWithCashback": true,
  "maxItems": 0
}
```

**Discount codes** across accessories (`couponCode`, `couponDiscount`, `couponPrice`):

```json
{
  "startUrls": [{ "url": "https://www.smarty.cz/prislusenstvi-4c13747" }],
  "onlyWithCoupon": true,
  "maxPagesPerCategory": 10,
  "maxItems": 0
}
```

**Look up your product list by EAN or order code** (e.g. to compare with your own prices; EAN lookups also return warranty and parameters):

```json
{
  "eans": ["195950627398", "4711085949493"],
  "orderCodes": ["278120", "P77778"]
}
```

**Watch prices below your target price** (schedule daily; you get a product when its price drops by 5 % or more and it is at most 15 000 CZK; the first run only records the current prices):

```json
{
  "startUrls": [{ "url": "https://www.smarty.cz/mobily-4c13740#pr=833" }],
  "maxPrice": 15000,
  "onlyNewOrChanged": true,
  "monitoringKey": "apple-under-15000",
  "minPriceDropPercent": 5,
  "maxItems": 0
}
```

**Daily price monitoring of a whole category, with removed products:**

```json
{
  "startUrls": [{ "url": "https://www.smarty.cz/mobily-4c13740" }],
  "maxItems": 0,
  "onlyNewOrChanged": true,
  "includeRemovedProducts": true,
  "monitoringKey": "phones-daily"
}
```

**A large category with EAN and parameters, in fast mode** (about 5× faster, +$0.01 per 1,000 products):

```json
{
  "startUrls": [{ "url": "https://www.smarty.cz/mobily-4c13740" }],
  "includeDetails": true,
  "fastMode": true,
  "maxItems": 500
}
```

**5G Android phones, cheapest first:**

```json
{
  "startUrls": [{ "url": "https://www.smarty.cz/mobily-4c13740" }],
  "sortBy": "cheapest",
  "parameterFilters": { "Operační systém": "Android", "Nejrychlejší datová síť": "5G", "Typ produktu": "Mobilní telefony" },
  "maxItems": 20
}
```

**Search for products:**

```json
{
  "searchQueries": ["usb-c kabel", "powerbanka"],
  "maxSearchPages": 2,
  "brands": ["Apple", "Anker"]
}
```

**Products in stock in Brno stores, with stock per store:** `"stores": ["Brno"], "includeStoreStock": true`.

**Discounts overview with EAN for matching:** `"onlyDiscounted": true, "includeDetails": true`.

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

| Input | What it does |
|---|---|
| **Sort by** | Recommended (TOP), Cheapest first, Most expensive first, Newest first. |
| **Brands** | Only these brands, e.g. `Apple`, `Samsung`. |
| **Available** | In stock in total, in stock in the e-shop, Prague within 120 minutes. |
| **In stock in store** | Specific stores, e.g. `Brno - Olympia`, or `Brno` for all Brno stores. |
| **Parameter filters** | Any filter of the category: `{"Name": "value"}`, `{"Name": ["value 1", "value 2"]}` or ranges `{"Velikost RAM": "8-16"}`. "Typ produktu" (product type) works too. |
| **Exclude used and open-box products** | Uses the website's "Stav zboží" filter where the category has used or open-box goods, and the product labels everywhere. |
| **Min / Max price** | Also passed to the shop's price filter when the category has one. |

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. The shop's brand filter lists only the most common brands of a category; for other brands the actor filters the products itself (reading more pages).

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

| Input | Example |
|---|---|
| **Only products in stock**, **Availability** | in stock / store only / at the supplier / in transit / pre-order / unknown |
| **Only discounted products**, **Min discount (%)** | crossed-out price, at least 15 % off |
| **Min price (CZK)**, **Max price (CZK)** | 5 000 – 15 000 |
| **Exclude brands**, **Name must contain**, **Name must not contain** | `256GB`, not `pouzdro` |
| **Labels** | `Akce`, `Cashback`, `Novinka` |
| **Only products with a discount code**, **Only products with cashback** | `couponCode` / `cashbackCzk` is set |
| **Energy classes** | `A`, `B` |
| **Min rating**, **Min number of ratings**, **Only products with EAN** | 4.5, 5 |

When a filter needs the product page (**Min number of ratings**, **Only products with EAN**), the actor keeps reading the listing until **Max products** is reached.

**Speed and advanced:** **Fast mode** (see below), **Max requests per minute (normal speed)** (default 12, max. 20) and **Max pages per category** (24 products per page).

#### Search, order codes and EANs

**Search queries** (or search URLs in **Category or product URLs**) work like the website's search box: at most **10 queries per run**, 2–100 characters each, and **Max pages per search** result pages (24 products each, default 2, max. 5). When the site redirects a query to a category (e.g. "iphone") or a product list ("powerbanka"), that page is read instead, within the same page limit. Site filters and sorting apply to search results too; on product-type lists the site has no store, stock or parameter filter, so such a search is skipped with a message when you use them.

**Search pages are loaded through Apify Proxy residential IPs (Czech Republic)**, like the rest of the run with the default **Proxy configuration**. If the site rejects a search page (also on a second attempt 30 seconds later), the actor stops searching (and looking up codes) for the rest of the run and says so.

**Order codes** ("Objednací kód" on the product page, e.g. `278120`, `P77778`) and **EANs** are looked up through the website's search, at most **100 per run** together. An order code is matched on the first results page (2 requests); an EAN is confirmed on the product page (3 requests; new goods are preferred over used ones with the same EAN, and EANs are matched with or without leading zeros). Found products have `matchedBy` set to `orderCode` or `ean`; codes that aren't found are listed in the status message. When an order code and an EAN lead to the same product, it is returned once.

#### Optional extras (one extra request per product each)

- **Add EAN, warranty and parameters:** reads the product page (EAN, MPN, warranty, technical parameters, category path, number of ratings).
- **Add price history:** the monthly prices from the product's "Vývoj ceny" tab (`priceHistory`: month, price and, when the chart shows it, the competitors' average price). Smarty.cz compiles this history and says the chart is illustrative and doesn't show every price change, so the actor doesn't derive "lowest price" values from it. Use it for your own analysis, not for republishing.
- **Add stock in stores:** the store popup (`storeStock`: store or warehouse name, stock text as shown, `inStock`, pickup time). No addresses or coordinates.

Each extra adds one request per product, so with the default speed (12 requests per minute) 100 products with all three extras take about 25 minutes. The price per product stays the same.

#### Fast mode (small extra charge)

Normal speed: one request at a time, at most 12 requests per minute (raise it to 20 with **Max requests per minute (normal speed)**). **Fast mode**: at most 60 requests per minute, 2 at a time; it switches back to the normal speed for the rest of the run as soon as Smarty.cz rejects a request, shows a challenge, asks to wait (`Retry-After`) or slows down, and when your maximum cost per run doesn't cover the extra charge. Requests are spread over short proxy sessions in both modes. You pay the extra charge only for products saved while the fast speed was on.

#### 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 or price before discount** changed. **Monitoring: only price changes** narrows it to price changes, **Monitoring: min price drop (%)** to price drops. With **Monitoring: include removed products**, products that are no longer listed are returned once as `"removed"` (with their last known name, price and URL, and `removedAt`), and when they come back as `"reappeared"`. Removed products are checked only when the run read the whole listing (no **Max products** or page limit reached, no rejected pages). For monitoring, use category URLs rather than search queries.

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

You pay per saved product. Filtered-out and unchanged products (in monitoring mode) are free, and there are no extra charges for search, price history or store stock. A product saved with its product page (EAN and parameters, lookups) costs a little more, because the page goes through the residential proxy. The proxy is included.

| Plan | Per 1 000 products | + with the product page (details, lookups) | + Fast mode |
|---|---|---|---|
| FREE | **$0.95** | +$0.95 | +$0.01 |
| BRONZE | **$0.93** | +$0.93 | +$0.01 |
| SILVER | **$0.90** | +$0.90 | +$0.01 |
| GOLD and higher | **$0.85** | +$0.85 | +$0.01 |

That is $0.00095 per product on the Free plan (+$0.00095 with its product page), and $0.00001 per product for fast mode. See the **Pricing** tab for the current prices. To keep the load on the shop low, the actor makes one request at a time and at most 12 requests per minute by default (max. 20); fast mode allows 60 per minute. Typical runs:

| Scenario | Requests | Time (normal / fast mode) | Price (FREE plan) |
|---|---|---|---|
| 20 products from a category | 1 | a few seconds | ~$0.02 |
| 1 000 products from a category | ~42 | ~4 min / ~1 min | ~$0.95 |
| 100 products with EAN and parameters | ~105 | ~9 min / ~2 min | ~$0.19 |
| 100 products with EAN, price history and store stock | ~305 | ~25 min / ~5 min | ~$0.19 |
| 10 EAN lookups | ~30 | ~3 min / ~30 s | ~$0.02 |
| 1 search query, 2 pages (48 products) | 3 | ~15 seconds | ~$0.05 |

### Input example

```json
{
  "startUrls": [{ "url": "https://www.smarty.cz/mobily-4c13740" }],
  "maxItems": 100,
  "sortBy": "cheapest",
  "brands": ["Samsung", "Xiaomi"],
  "includeDetails": false
}
```

### Output example

```json
{
  "id": "smarty:253146",
  "source": "smarty.cz",
  "url": "https://www.smarty.cz/ADATA-LEGEND-860-M-2-PCIe-4-0-1TB-4p208447",
  "orderCode": "253146",
  "productId": "208447",
  "ean": "4711085949493",
  "mpn": "SLEG-860-1000GCS",
  "name": "ADATA LEGEND 860 M.2 PCIe 4.0 1TB",
  "brand": "ADATA",
  "category": "SSD disky",
  "categoryPath": ["Počítače, komponenty a IT", "Komponenty", "Disky a SSD", "Interní", "SSD", "PCIe 4.0"],
  "price": 3990,
  "priceWithoutVat": 3298,
  "currency": "CZK",
  "priceBeforeDiscount": 7590,
  "discountPercent": 47,
  "isDiscounted": true,
  "cashbackCzk": null,
  "priceAfterCashback": null,
  "couponCode": null,
  "couponDiscount": null,
  "couponPrice": null,
  "isUsedOrOpenBox": false,
  "conditionLabel": null,
  "availability": "in_stock",
  "availabilityText": "Skladem celkem > 5 ks",
  "stockText": "> 5 ks",
  "dispatchText": "Dnes",
  "dispatchDate": "2026-10-13",
  "releaseDate": null,
  "rating": 5.0,
  "reviewCount": 7,
  "labels": [],
  "giftText": null,
  "giftValueCzk": null,
  "energyClass": null,
  "colorVariants": null,
  "keyParameters": null,
  "imageUrl": "https://doc.smarty.cz/pic/QIAB000P01-600-600.webp",
  "position": null,
  "warrantyMonths": 60,
  "warrantyMonthsBusiness": 60,
  "specifications": { "Kapacita disku": "1000 GB", "Rychlost čtení disku": "6000 MB/s", "Formát disku": "M.2 2280" },
  "description": null,
  "priceHistory": [
    { "month": "2026-09", "price": 5790, "competitorAveragePrice": null },
    { "month": "2026-10", "price": 3990, "competitorAveragePrice": null }
  ],
  "storeStock": [
    { "store": "Centrální sklad - Praha Zličín", "stockText": "Skladem celkem > 5 ks", "inStock": true, "pickupText": "Do 60 min" },
    { "store": "Brno - Olympia", "stockText": "Není skladem", "inStock": false, "pickupText": "Zítra po 16:00" }
  ],
  "detailScraped": true,
  "changeType": null,
  "firstSeenAt": null,
  "previousPrice": null,
  "priceChange": null,
  "priceChangePercent": null,
  "matchedBy": null,
  "removedAt": null,
  "sourceUrl": "https://www.smarty.cz/ADATA-LEGEND-860-M-2-PCIe-4-0-1TB-4p208447",
  "scrapedAt": "2026-10-13T10:00:00Z"
}
```

From category and search pages, `ean`, `mpn`, `warrantyMonths`, `specifications`, `categoryPath` and `reviewCount` are `null` unless **Add EAN, warranty and parameters** is on; `priceHistory` and `storeStock` are `null` unless their option is on. `keyParameters`, `giftText`, `colorVariants` and `position` come from listing pages.

### Limitations

- **Requests are spread over several proxy IPs.** Each proxy session (its own IP address and cookies) makes at most 3 requests, and the run uses up to 5 sessions at a time.
- **Challenges are never solved.** If Smarty.cz rejects a request (Cloudflare "Just a moment…"), the actor asks once more after 30 seconds from the same IP address and session (never from another IP); this recovers short-lived rejections. A listing page rejected twice is skipped and the actor goes on with the next page, so the results can be incomplete (with gaps in the sorted order); the status message says how many pages could not be read. After 3 rejections in a row the run stops and returns what it has. A product whose page, price history or store stock was rejected is returned with the data read so far (`detailScraped: false` without the product page), as long as it passes your filters.
- **Search and lookups** use residential proxy IPs and are limited to 10 queries (5 pages each) and 100 codes per run; if a search page is rejected twice, searching stops for the run. A code is found only when the website's search finds it.
- **EAN, MPN, warranty and parameters** are on the product page only: turn on **Add EAN, warranty and parameters** (one extra request per product). For product URLs and EAN lookups they are always included.
- **Price before discount** is the crossed-out price shown by the shop. The shop doesn't say whether it is a 30-day lowest price or a recommended price, so the actor returns it as is. **Price with the code** is shown by the shop on some products; otherwise it is computed from the label (e.g. 20 % off the price, rounded to whole CZK).
- **Availability `unknown`** also covers products where the shop says "Expedice bude upřesněna" (dispatch to be specified); **`preorder`** covers "V prodeji od …" and the label "Brzy v prodeji".
- **Used goods** in the "Použité" categories often show a "from" price (several pieces in different condition); the actor returns that lowest price.
- **Rating** on listing pages is the average shown by the shop; the number of ratings comes from the product page. Reviews themselves are not collected.
- **Sorting with equal prices:** the shop doesn't order products with the same price consistently between pages, so a product at a page boundary can occasionally be missed in very long sorted runs.
- **Descriptions:** only a ~200-character excerpt (**Add a short description excerpt**). Images are returned as URLs; product photos and texts are copyrighted, so check the rights before you republish them.

### For AI agents and API users

- **Minimal input:** `{"startUrls": [{"url": "https://www.smarty.cz/mobily-4c13740"}], "maxItems": 20}`, `{"searchQueries": ["powerbanka"], "maxItems": 20}` or `{"eans": ["195950627398"]}`.
- One row = one product = one charge (+ the fast-mode event when fast mode is on). Optional extras add 1 request per product each, same price per product.
- 24 products per listing page. `maxItems` counts saved products, `maxItemsPerStartUrl` limits each URL, search query or lookup.
- Prices are in CZK. `availability` is one of `in_stock`, `in_store_only`, `at_supplier`, `in_transit`, `preorder`, `out_of_stock`, `unknown`.
- `id` is `smarty:<order code>` and stays the same between runs. Monitoring state is kept per `monitoringKey` between runs of the same user.
- `matchedBy` (`orderCode` / `ean`) is set only for lookups, `removedAt` only for removed and reappeared products in monitoring mode.

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("tsutseisoftware/smarty-scraper").call(run_input={
    "startUrls": [{"url": "https://www.smarty.cz/mobily-4c13740"}],
    "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/smarty-scraper').call({
    searchQueries: ['powerbanka'], 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 … not a category … or product URL` | Use a Smarty.cz category URL (…-4c<number>), product URL (…-4p<number>) or search URL (/Vyhledavani?query=…). |
| `unknown store / parameter / 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 or search has the requested value. |
| `… listing pages could not be read, so the results may be incomplete` | Smarty.cz rejected some pages; run it again later for complete results. |
| `searching stopped because Smarty.cz rejected a search page` | Try later, or use the category the search would lead to. |
| `Search is temporarily disabled` | Use category or product URLs. |
| `… could not be loaded` | The category or product doesn't exist anymore; open the URL in your browser. |
| `Smarty.cz is rejecting requests` | Keep the default proxy configuration (Apify Proxy) and try again later. |
| `Saved 0 products (new or changed since last run)` | Nothing changed since the previous monitoring run; that's expected. |
| `not found: …` | Smarty.cz has no product with that order code or EAN (or doesn't show it in its search). |
| `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 the whole listing (e.g. Max products reached); use `"maxItems": 0` for monitoring with removed products. |

### 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
- [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 Smarty.cz?

The actor collects only publicly available product data (prices, availability, labels, parameters, EAN shown on the product page, the price history tab and the store stock popup) and no personal data: no reviews, questions or contacts. It does not log in, makes one request at a time and at most 12 per minute by default (20 at most; 60 in fast mode, with automatic slow-down), and never solves captchas or other challenges. How you use the data is your responsibility. Use it for price monitoring and analysis, and don't republish the catalogue, texts, photos or the price history. If unsure, consult a lawyer.

#### Do I need a proxy?

It's already set up. Smarty.cz rejects requests from Apify's own server IP addresses and from several shared data-center proxy IPs, so the default **Proxy configuration** is Apify Proxy with residential IPs in the Czech Republic. The proxy is included in the price per product. Keep the default unless you have your own Czech proxies.

#### Can I look up products by EAN or order code?

Yes: put them into **EANs** or **Order codes** (up to 100 per run). The actor uses the website's search, so a product is found when the website's search finds it; EANs are confirmed on the product page and the product comes with EAN, warranty and parameters. Codes that aren't found are listed in the status message and cost nothing.

#### 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, price history or long EAN lists, when the time matters. It switches back to the normal speed (no extra charge) as soon as the website pushes back.

#### 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 Smarty CZ a.s., the operator of Smarty.cz. It is also known as a Smarty API, Smarty price tracker or "hlídač cen Smarty".

# Actor input Schema

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

Smarty.cz category URLs (e.g. https://www.smarty.cz/mobily-4c13740), product URLs (e.g. https://www.smarty.cz/ADATA-LEGEND-860-M-2-PCIe-4-0-1TB-4p208447) or search URLs (https://www.smarty.cz/Vyhledavani?query=powerbanka). Tip: set filters and sorting on the website and paste the URL (e.g. …/mobily-4c13740?s=p#pr=833\&st=1); the actor keeps them.

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

Search Smarty.cz like in the website's search box, e.g. 'powerbanka', 'usb-c kabel'. At most 10 queries per run, 2–100 characters each. Search pages are loaded through Apify Proxy residential IPs (Czech Republic); category and product pages still use the proxy below. When the site redirects a query to a category or product, that page is read instead (within Max pages per search).

## `orderCodes` (type: `array`):

Look up products by Smarty order code ("Objednací kód" on the product page, e.g. 278120 or P77778), through the website's search (Apify Proxy residential IPs, like search queries). At most 100 order codes and EANs together per run. Each found product is returned with matchedBy: "orderCode".

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

Look up products by EAN (barcode, 8–14 digits with a valid check digit, with or without leading zeros), through the website's search and the product page (to confirm the EAN; new goods first). Each found product is returned with EAN, warranty and parameters and matchedBy: "ean".

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

How many result pages (24 products each) to read for each search query, at most 5.

## `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), MPN (manufacturer part number), warranty, technical parameters, category path and number of ratings. Slower: one extra request per product (at most 20 requests per minute).

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

Add the first ~200 characters of the product summary. Reads the product page (like "Add EAN, warranty and parameters"), so it is slower.

## `includePriceHistory` (type: `boolean`):

Add the monthly prices from the product's "Vývoj ceny" tab (and the competitors' average price when the chart shows it). Optional and slower: one extra request per product. The history is compiled by Smarty.cz; use it for your own analysis, not for republishing.

## `includeStoreStock` (type: `boolean`):

Add the stock in each Smarty store and warehouse as shown in the website's store popup (store name, stock text, pickup time). Optional and slower: one extra request per product.

## `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. 'Apple', 'Samsung'. Case doesn't matter. The shop filters the most common brands of the category; for other brands the actor filters the products itself.

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

Only products in stock, as in the website's filter: in stock in total (warehouse or stores), in stock in the e-shop warehouse, or deliverable in Prague within 120 minutes.

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

Only products in stock in these stores, e.g. 'Brno - Olympia' or just 'Brno' (all Brno stores). Several values = any of them.

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

Filter by the category's parameters, as in the website's filter panel. Keys are filter names, values are a value or a list of values (any of them); ranges as "min-max". Example for phones: {"Operační systém": "Android", "Nejrychlejší datová síť": "5G", "Velikost RAM": "8-16", "Typ produktu": "Mobilní telefony"}. Available names and values are listed in the log when a name isn't found.

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

Skip used, open-box (rozbalené) and like-new (zánovní) products. Uses the website's "Stav zboží" filter where the category has one, and the product labels everywhere.

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

Keep only products shown as in stock ('Skladem …'). Store-only, supplier and in-transit 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.

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

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

## `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. 'Aligator'. 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. '256GB'.

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

Skip products whose name contains any of these words, e.g. 'pouzdro'.

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

Keep only products with a label containing one of these words, e.g. 'Akce', 'Cashback', 'Novinka', 'Poslední šance'.

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

Keep only products with a discount code label, e.g. "Sleva 20 % s kódem EXTRA20" (see couponCode and couponPrice in the output).

## `onlyWithCashback` (type: `boolean`):

Keep only products with a cashback promotion (see cashbackCzk and priceAfterCashback in the output).

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

Keep only products with one of these energy classes (shown on the product tile, e.g. phones and TVs). Products without an energy class are skipped when set.

## `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. Reads the product pages (like "Add EAN, warranty and parameters").

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

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

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

Return only products that are new or whose price, availability or price before discount 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. 'phones-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`):

With monitoring: also return products that disappeared since the previous run (changeType: "removed", with their last known values), and products that are back ("reappeared"). Checked only when the run read everything (no Max products or page limit reached, no rejected pages).

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

About 5× faster: up to 60 requests per minute, 2 at a time, for a small extra charge per product saved at that speed (see Pricing). Switches back to the normal speed (no extra charge) as soon as Smarty.cz rejects a request, shows a challenge or slows down.

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

To keep the load on the shop low the actor makes one request at a time, by default at most 12 per minute (max. 20). Fast mode ignores this.

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

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

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

Smarty.cz rejects requests from Apify's own IP addresses and from several shared data-center proxy IPs, so the default is Apify Proxy with residential IPs in the Czech Republic. Requests are spread over a few proxy sessions (a different IP every 3 requests). You can also use your own Czech proxies.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.smarty.cz/mobily-4c13740"
    }
  ],
  "maxSearchPages": 2,
  "maxItems": 20,
  "maxItemsPerStartUrl": 0,
  "includeDetails": false,
  "includeDescription": false,
  "includePriceHistory": false,
  "includeStoreStock": false,
  "sortBy": "recommended",
  "parameterFilters": {},
  "excludeUsedOrOpenBox": false,
  "onlyInStock": false,
  "onlyDiscounted": false,
  "onlyWithCoupon": false,
  "onlyWithCashback": false,
  "onlyWithEan": false,
  "onlyNewOrChanged": false,
  "monitoringKey": "default",
  "onlyPriceChanges": false,
  "includeRemovedProducts": false,
  "fastMode": false,
  "maxRequestsPerMinute": 12,
  "maxPagesPerCategory": 50,
  "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.smarty.cz/mobily-4c13740"
        }
    ],
    "maxItems": 20,
    "parameterFilters": {},
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "CZ"
    }
};

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

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

```

## MCP server setup

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