# Datart.cz Scraper: Prices, EAN & Price Monitoring (`tsutseisoftware/datart-scraper`) Actor

Scrape Datart.cz (Czech electronics e-shop) by category (with the website's filters), search, product code or EAN: price, real discount vs. 30-day low, discount codes, stock per store, EAN and specifications. Monitoring returns only changed or removed products. Unofficial.

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

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

Scrape products and prices from **Datart.cz**, one of the largest electronics e-shops in the Czech Republic. Use a **category URL** (also with the website's own filters and sorting), a **category overview**, **product URLs**, a **search term**, or your own list of **Datart product codes or EANs**. For each product you get the name, brand, current price, **lowest price in the last 30 days and the real discount**, availability online and in stores, delivery date, rating, labels and the bazaar condition. Optionally you also get the **EAN (barcode)**, full technical specifications, the **discount code and the price with it** ("Cena s kódem"), the promotion end, energy class, warranty, description and documents, and the **stock in each Datart store** with the home delivery options.

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: the website's filters, lookups, store stock, removed products and fast mode.** All of it is optional; without the new inputs a run returns exactly what it did before (new fields are added at the end of each row, empty when not used).
  - **Website filters and sorting:** paste a URL with filters set on Datart.cz (`…/filter/…`), or use **Sort by**, **Condition**, **Bazaar state**, **In stock in these stores** and **Parameter filters** (any parameter of the filter panel). Datart.cz applies them itself, so pages contain only matching products.
  - **Category overviews** such as `https://www.datart.cz/tv-audio-video`: their categories are read one after another.
  - **Product codes and EANs:** look up your own product list (`matchedBy`); each EAN is confirmed on the product page.
  - **More from the product page:** discount code and the price with it, promotion label and end, energy class, warranty, description and documents (energy label sheet, manuals); filters **Only with EAN**, **Energy classes**, **Min warranty (months)** and **Only with a discount code**.
  - **Stock per store:** every Datart store with pieces and pickup time, plus home delivery options with dates and prices.
  - **Monitoring: include removed products:** products that disappeared since the previous run (`changeType: "removed"`) and the ones that came back (`"reappeared"`).
  - **Fast mode** for a small extra charge ($0.01 per 1 000 products): about 2x faster, back to the normal speed as soon as the website pushes back.
  - **Lighter next pages:** the next listing pages come as the small JSON answer the website's own "next page" button gets (about 4x less data, the same products).
- **October 2026: NAY.sk Scraper.** Datart's Slovak sister shop (NAY) has its own scraper with the same output, EUR prices, stock in 54 stores and EAN/code lookups: [NAY.sk Scraper](https://apify.com/tsutseisoftware/nay-sk-scraper).
- **Correct decimal prices and large counts:** prices with cents ("299,90") and product counts with a thousands space ("1 218") are read correctly.
- **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.

### Why use this Datart scraper?

- 🏷️ **Real discounts, not marketing.** `isDiscounted` and `discountPercent` compare the price with the **lowest price of the last 30 days**, the way EU law (Omnibus) requires shops to show discounts.
- 🔢 **EAN for every product** (optional). Match Datart products with other shops or your own catalogue.
- 📉 **Monitoring mode and price drop alerts.** Only new or changed products, with `previousPrice`, `priceChange` and `priceChangePercent`. You can also ask for drops of at least X %.
- 🏬 **Store availability as numbers.** `storeCount` (stores with stock) and `deliveryDate` as an ISO date, not just text.
- 🎛️ **The website's own filters and sorting.** Any parameter of the filter panel (display technology, screen size… also ranges), condition (new or bazaar) and bazaar state, in stock in a given store, brands, price range and stock, applied by Datart.cz itself. Or just paste a URL with filters set on the website.
- 🏬 **Stock in each Datart store** (Praha, Brno, Ostrava…): pieces, unpacked pieces, pickup time, and the home delivery options with dates and prices.
- 🔢 **Your own product list:** Datart product codes or **EANs**, found with the website's search; the product page confirms each EAN.
- 🧮 **Filters you don't pay for.** In stock, discounted, price range, brands, name keywords, rating, labels, energy class, warranty, discount code.
- ⚡ **Fast and light.** No browser: one category page gives 22 products, and the next pages come as a small JSON answer. Optional **fast mode** about 2x faster for a tiny extra charge. Works out of the box with the default proxy setting.

### What data can you get?

| Field | Example |
|---|---|
| Name, brand, product code | Televize TCL 98P8K, TCL, TCL98P8K |
| Price, lowest price in 30 days | 36 490 CZK, 39 990 CZK |
| Discounted, discount | true, 8 % |
| Availability | in_stock (Ihned k odeslání) |
| Stores with stock | 1 (Skladem v 1 prodejně) |
| Delivery date | 2026-10-10 |
| Rating, reviews | 4.9, 298 |
| Category path | TV, foto, audio, video › Televize |
| Labels | PRODLOUŽENÁ ZÁRUKA, + dárek |
| Condition, bazaar price from | new / likeNew (zánovní), 24 990 CZK |
| EAN (optional) | 5901292525859 |
| Specifications (optional) | Technologie displeje: LED, … |
| Price with code, code, promotion end (optional) | 25 066 CZK, 2269DATN15H, 2026-10-30 |
| Energy class, warranty, documents, description (optional) | F, 24 months, energy label sheet and manual (PDF) |
| Stock per store, delivery options (optional) | Praha 1 - Národní třída: 2 pieces, pickup 2026-10-20 09:30; Balíkovna na adresu: free, tomorrow |
| Search term or code that found it | `searchQuery`, `matchedBy` |

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

### How to scrape Datart.cz

1. **Category:** open Datart.cz, go to a category, e.g. `https://www.datart.cz/televize.html`, and paste the URL into **Category, product or search URLs**. Category overviews (`https://www.datart.cz/tv-audio-video`) and product URLs work too.
2. **Or search:** type what you're looking for into **Search**, e.g. `lg oled` or `pračka bosch`. Results come in the shop's relevance order. **Or look up** your own list in **Product codes** or **EANs**. You can combine all of these in one run.
3. Set **Max products** (and optionally **Max products per search or URL**), turn on **Add EAN and specifications** or **Add stock per store** if you need them, and add filters.
4. 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.datart.cz/televize.html/filter/v:-4:-835/o:3` (Samsung, cheapest first). The actor keeps them.

### Use cases

**Daily price monitoring of a category.** Schedule it every morning:

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

**Discount alerts:** products that got at least 10 % cheaper since the last run.

```json
{
  "startUrls": [{ "url": "https://www.datart.cz/pracky.html" }],
  "onlyNewOrChanged": true,
  "minPriceDropPercent": 10
}
```

**Current deals in a category:** discounted products with at least 15 % off the 30-day low.

```json
{
  "startUrls": [{ "url": "https://www.datart.cz/notebooky.html" }],
  "onlyDiscounted": true,
  "minDiscountPercent": 15
}
```

**Cheapest Samsung OLED TVs in stock, filtered by Datart.cz itself:**

```json
{
  "startUrls": [{ "url": "https://www.datart.cz/televize.html" }],
  "brands": ["Samsung"],
  "parameterFilters": { "Technologie displeje": ["OLED"] },
  "onlyInStock": true,
  "sortBy": "cheapest",
  "maxItems": 50
}
```

**Price check of your own product list by EAN** (each EAN is confirmed on the product page):

```json
{
  "eans": ["8806096768006", "8806096705766"],
  "productCodes": ["LGG43QNED87B"]
}
```

**Bazaar bargains: like new and unpacked products with the price of the new one:**

```json
{
  "startUrls": [{ "url": "https://www.datart.cz/televize.html" }],
  "productCondition": "bazaar",
  "bazaarStates": ["likeNew", "unpacked"],
  "maxItems": 100
}
```

**Where to buy today: stock in Prague stores with discount codes:**

```json
{
  "startUrls": [{ "url": "https://www.datart.cz/mobilni-telefony.html" }],
  "availableInStores": ["Praha"],
  "includeDetails": true,
  "includeStoreAvailability": true,
  "maxItems": 50
}
```

**Assortment tracking: new, changed, removed and returning products of a category:**

```json
{
  "startUrls": [{ "url": "https://www.datart.cz/tv-audio-video" }],
  "maxItems": 0,
  "onlyNewOrChanged": true,
  "includeRemovedProducts": true,
  "monitoringKey": "tv-audio-assortment"
}
```

**Find products and their EAN by name:**

```json
{
  "searchQueries": ["lg oled 55", "samsung qled 65"],
  "maxItemsPerStartUrl": 10,
  "includeDetails": true
}
```

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

**Sort by**, **Condition**, **Bazaar state**, **In stock in these stores** and **Parameter filters** are taken from the filter panel of each listing, so Datart.cz sends only matching products. With any of them (or with **Apply brand, price and stock filters on the website**), **Only these brands**, **Exclude brands**, **Min/Max price** and **Only products in stock** go to the website too. Names that a listing doesn't have are reported in the log together with the options it has. The actor checks the products again. Without these inputs, the filters below work exactly as before, on every listing page.

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

| Filter | Example |
|---|---|
| **Only products in stock** | only products that ship now |
| **Only discounted products**, **Min discount (%)** | price below the 30-day low, at least 15 % off |
| **Min price (CZK)**, **Max price (CZK)** | 10 000 – 30 000 |
| **Only these brands**, **Exclude brands** | LG, Samsung / Hisense |
| **Name must contain**, **Name must not contain** | OLED / rozbaleno |
| **Min rating**, **Min number of reviews** | 4.5, 10 |
| **Only with labels** | doprava zdarma |
| **Exclude second-hand and opened products** | skip "bazar" products |
| **Only with EAN**, **Energy classes**, **Min warranty (months)**, **Only with a discount code** | need the product page, so they turn on **Add EAN and specifications**; places freed by filtered-out products are filled with the next products |

#### Product codes and EANs

**Product codes** (the end of the `id` field, e.g. `LGGOLED55B65`) and **EANs** are looked up with the website's search, one at a time with a short pause (up to 500 per run). A code must match exactly. An EAN is confirmed on the product page, so each EAN costs one product page read and the row always has the details. Codes that aren't found are listed in the status message.

#### Fast mode (small extra charge)

Normal speed: up to 120 requests per minute, 3 at a time (the speed the actor always had). **Fast mode**: up to 240 per minute, 6 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. It waits when the website asks it to wait and never changes the IP address to get around a limit.

Safety limits in **Advanced**: **Max pages per category** (22 products per page) and **Max pages per search**. **Description length** limits the description. **Proxy configuration** defaults to Apify residential proxy in the Czech Republic (see the FAQ).

#### 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, 30-day lowest price or discount status** changed. New reviews, labels or delivery estimates don't count as a change. **Monitoring: only price changes** narrows it to price changes. **Monitoring: min price drop (%)** returns only price drops. For monitoring, use category URLs rather than search terms: categories have no search limits and give stable 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 search or 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 Datart.cz?

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

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

A product saved with its product page (**Add product page details**, lookups by code or EAN) costs a little more, because the page goes through the residential proxy. Stock per store and removed-product rows don't change the price. See the **Pricing** tab for the current prices.

Typical runs:

| Scenario | Requests to Datart.cz | Typical time (normal / fast mode) |
|---|---|---|
| 100 products from a category | 5 listing pages | a few seconds |
| 1 000 products from categories | ~46 listing pages | under a minute |
| 100 products with EAN and specifications | 5 listing pages + 100 product pages | ~1 minute / ~30 s |
| 100 products with details and stock per store | 5 listing pages + 200 | ~2 minutes / ~1 minute |
| 100 EANs | ~200 (search + product page each) | ~6 minutes (lookups run one at a time) |
| 5 search terms, 2 pages each | 10 search pages | ~1 minute (searches are deliberately paced) |

### Input example

```json
{
  "searchQueries": ["lg oled"],
  "startUrls": [{ "url": "https://www.datart.cz/televize.html" }],
  "maxItems": 100,
  "includeDetails": false,
  "onlyInStock": false,
  "onlyNewOrChanged": false
}
```

### Output example

Real output (specifications and the specification summary shortened):

```json
{
  "id": "datart:TCL98P8K",
  "source": "datart.cz",
  "url": "https://www.datart.cz/televize-tcl-98p8k",
  "productCode": "TCL98P8K",
  "internalId": "1908197",
  "name": "Televize TCL 98P8K",
  "brand": "TCL",
  "category": "Televize",
  "categoryPath": [
    "TV, foto, audio, video",
    "Televize"
  ],
  "price": 36490.0,
  "currency": "CZK",
  "lowestPrice30Days": 39990.0,
  "isDiscounted": true,
  "isRefurbished": false,
  "newProductPrice": null,
  "discountPercent": 8.0,
  "availability": "in_stock",
  "availabilityText": "Ihned k odeslání",
  "storeAvailabilityText": "Skladem v 1 prodejně",
  "storeCount": 1,
  "deliveryText": "u vás již 10. 10. 2026",
  "deliveryDate": "2026-10-10",
  "rating": null,
  "reviewCount": null,
  "labels": [
    "+ dárek"
  ],
  "specSummary": "248 cm (98\") úhlopříčka • rozlišení: 4K Ultra HD • DVB-C, DVB-S2, DVB-T2 (H.265) • QLED • …",
  "imageUrl": "https://image.datart.cz/foto/500/3/5/5/product_7264553.jpg",
  "ean": "5901292525859",
  "specifications": {
    "Technologie displeje": "LED",
    "Úhlopříčka obrazovky": "248 cm (98\")",
    "Rozlišení displeje": "4K Ultra HD"
  },
  "detailScraped": true,
  "sourceUrl": "https://www.datart.cz/televize.html",
  "scrapedAt": "2026-10-09T12:41:58Z",
  "position": 7,
  "changeType": null,
  "firstSeenAt": null,
  "previousPrice": null,
  "priceChange": null,
  "priceChangePercent": null
}
```

### Limitations

- **Search** reads at most 10 search terms per run and **Max pages per search** pages per term (24 products per page; default 2, at most 10). Searches run one after another with a short pause. For large or scheduled runs, use category URLs. **Product codes and EANs** use the search too, one at a time; if the site rejects the search, searches and lookups stop for the rest of the run.
- **Website filters** need the filter panel of the listing's first page, so a filtered listing costs one extra page. A filter value that a listing doesn't offer is reported in the log (with the options it has) and checked by the actor instead.
- A search for a **brand only** (e.g. `samsung`) leads to the brand's page, which has no product list. The actor tells you so; use a more specific term (`samsung televize`) or a category URL. A search that leads straight to a category (e.g. `televize`) continues with that category, limited by **Max pages per search**.
- **Search results have no category** in the listing; turn on **Add EAN and specifications** to get it from the product page.
- **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.
- **Second-hand and opened products** ("bazar") show the price of a new product instead of the 30-day low: you get it as `newProductPrice` (`lowestPrice30Days` is null, `isRefurbished` is true).
- `deliveryDate` is the estimated delivery date, or for products on order the expected restocking date ("očekáváme …").
- 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:** `{"searchQueries": ["lg oled"], "maxItems": 20}`, `{"startUrls": [{"url": "https://www.datart.cz/televize.html"}], "maxItems": 20}` or `{"eans": ["8806096768006"]}`.
- One row = one product = one charge (+ the `fast-mode` event when fast mode is on). `includeDetails: true` adds 1 request per product (EAN, specifications, discount code, documents…), `includeStoreAvailability: true` another one; same price per product.
- New fields are added after the original ones; a row always has every field (null or an empty list when not read).
- Listing pages: 22 products (category), 24 (search). `maxItems` counts saved products, `maxItemsPerStartUrl` limits each search term or URL.
- Prices are in CZK including VAT. `availability` is one of `in_stock` (ships now), `in_store_only` (not shippable, but some stores have it), `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>/datart-scraper").call(run_input={
    "startUrls": [{"url": "https://www.datart.cz/televize.html"}],
    "maxItems": 100,
})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(product["name"], product["price"], product["discountPercent"])
```

#### JavaScript

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('<username>/datart-scraper').call({ searchQueries: ['lg oled'], 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 Datart.cz category, category overview, product or search URL (filters and sorting set on the website are fine). |
| `unknown … (options here: …)` | A website filter name or value that this listing doesn't have; pick one of the listed options. |
| `not found: …` | The product code or EAN isn't on Datart.cz (codes must match exactly). |
| `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. |
| `… leads to the brand page …` | Use a more specific search term or a category URL. |
| `Datart.cz is rejecting requests right now` | Try again later. |
| `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):

- [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

### FAQ

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

The actor collects only publicly available product data (prices, availability, stock per store, parameters, documents) and no personal data. It does not log in and never solves captchas or other challenges. Note that the site's robots.txt asks crawlers not to use its search pages; the **Search** field does use them (slowly and with limits), while category and product URLs don't. How you use the data is your responsibility. 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?

It's already set up. Datart.cz rejects requests from data-center IP addresses (including Apify's own servers), 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.

#### 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, stock per store and long EAN lists, when the time matters. Without it the actor works as it always did.

#### 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 HP TRONIC Zlín, spol. s r.o., the operator of Datart.cz. It is also known as a Datart API, Datart price tracker or "hlídač cen Datart".

# Actor input Schema

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

Search terms, e.g. 'lg oled', 'pračka bosch' or an EAN. Results come in the shop's relevance order. At most 10 terms per run; searches run one after another with a short pause, so prefer category URLs for large or scheduled runs.

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

Datart.cz category URLs (e.g. https://www.datart.cz/televize.html), category overviews (https://www.datart.cz/tv-audio-video, its categories are read one after another), product URLs or search result URLs (https://www.datart.cz/vyhledavani?q=...). Tip: set filters and sorting on the website and paste the URL (…/filter/…); the actor keeps them. ?page=N starts at that page.

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

Datart product codes (the end of the id field, e.g. LGGOLED55B65). Each is looked up with the website's search, one at a time; only an exact code match is returned (matchedBy "productCode").

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

EAN barcodes (check digit verified). The website's search finds the product and its product page confirms the EAN (one product page per EAN, so details are included; matchedBy "ean"). Up to 500 codes and EANs together per run.

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

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

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

Limit for each search term and 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 EAN (barcode), full technical specifications, description, documents (energy label sheet, manuals), energy class, warranty, discount code and its price ("Cena s kódem"), promotion end and, for search results, the category. Slower: one extra request per product. Turned on automatically by filters that need it.

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

Maximum characters of the product description (with "Add EAN and specifications"). 0 = the whole text.

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

Stock in each Datart store as the website's "where to pick it up" window shows it (pieces, unpacked pieces, pickup time, delivery to the store) and the home delivery options with dates and prices. One extra request per product.

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

The website's sorting. "Default" keeps the sort of the URL (otherwise the website's "Doporučujeme"; relevance for searches).

## `applyFiltersOnWebsite` (type: `boolean`):

Uses the website's own filters for "Only these brands", "Exclude brands", "Min/Max price", "Only products in stock" and "Exclude second-hand and opened products" (fewer pages to read when the filters are narrow; "position" is then the position in the filtered list). Always on when Condition, Bazaar state, In stock in these stores or Parameter filters are used.

## `productCondition` (type: `string`):

The website's "Stav zboží": new products or bazaar offers (second-hand, opened, with defects).

## `bazaarStates` (type: `array`):

The website's "Bazar - stav zboží" (any of the chosen).

## `availableInStores` (type: `array`):

The website's "Dostupnost na prodejně" filter, e.g. "Praha 1 - Palladium", "Brno", "Ostrava"; part of the name is enough (several stores = any of them).

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

The listing's parameter filters by name as the filter panel shows them, e.g. {"Technologie displeje": \["OLED"], "Úhlopříčka obrazovky": \["65" (163 – 165 cm)"]}; ranges as {"min": 100, "max": 125}. Unknown names or values are reported in the log with the options.

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

Keep only products that can be ordered and shipped now (availability in_stock). Store-only and out-of-stock products are skipped.

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

Keep only products whose price is below the lowest price of the last 30 days (the shop shows the old price crossed out).

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

Keep only discounted products with at least this discount against the lowest price of the last 30 days.

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

Skip products cheaper than this.

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

Skip products more expensive than this.

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

Keep only products of these brands, e.g. LG, Samsung. Case-insensitive.

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

Skip products of these brands.

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

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

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

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

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

Keep only products with at least this average rating (0-5), e.g. 4.5.

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

Keep only products with at least this many reviews.

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

Keep only products with one of these shop labels, e.g. 'doprava zdarma'.

## `excludeRefurbished` (type: `boolean`):

Skip second-hand, opened and refurbished products (Datart 'bazar'), whose crossed-out price is the price of a new product.

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

Only products with an EAN (turns on "Add EAN and specifications").

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

Only these energy classes (turns on "Add EAN and specifications").

## `minWarrantyMonths` (type: `integer`):

Only products with at least this warranty (turns on "Add EAN and specifications").

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

Only products whose page shows a discount code ("Cena s kódem"; turns on "Add EAN and specifications").

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

Return (and pay for) only products that are new or whose price, availability or 30-day lowest price changed since the previous run with the same monitoring key. Ideal for scheduled price monitoring of categories.

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

Name of the saved monitoring state. Use a different key for each set of categories you monitor.

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

In monitoring mode, return updated products only when their price changed (new products are still returned). Every returned product has previousPrice, priceChange and priceChangePercent.

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

In monitoring mode, return only products whose price dropped by at least this percentage since the last run. Great for discount 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 Datart.cz about 2x faster: at most 240 requests per minute and 6 at a time instead of 120 per minute and 3 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 listing pages per category (22 products per page). 0 = no limit.

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

How many result pages to read for each search term (24 products per page, at most 10 pages).

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

Datart.cz rejects requests from data-center IP addresses, so the default is Apify Proxy with residential IPs in the Czech Republic. You can also use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.datart.cz/televize.html"
    }
  ],
  "maxItems": 20,
  "maxItemsPerStartUrl": 0,
  "includeDetails": false,
  "descriptionMaxLength": 1000,
  "includeStoreAvailability": false,
  "sortBy": "default",
  "applyFiltersOnWebsite": false,
  "productCondition": "any",
  "parameterFilters": {},
  "onlyInStock": false,
  "onlyDiscounted": false,
  "excludeRefurbished": false,
  "onlyWithEan": false,
  "onlyWithCoupon": false,
  "onlyNewOrChanged": false,
  "monitoringKey": "default",
  "onlyPriceChanges": false,
  "includeRemovedProducts": false,
  "fastMode": false,
  "maxPagesPerCategory": 50,
  "maxSearchPages": 2,
  "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.datart.cz/televize.html"
        }
    ],
    "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/datart-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.datart.cz/televize.html" }],
    "maxItems": 20,
    "parameterFilters": {},
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "CZ",
    },
}

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

```

## MCP server setup

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