# TSBOHEMIA.SK Scraper (Slovakia): Prices, EAN & Discounts (`tsutseisoftware/tsbohemia-sk-scraper`) Actor

Scrape TSBOHEMIA.SK (Slovak IT & electronics shop) by category, search, order code, EAN or URL: EUR prices, 30-day low, discount codes, availability, EAN, part number. Website filters, sorting, monitoring. Unofficial.

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

## TSBOHEMIA.SK Scraper (Slovakia): Prices, EAN & Discounts

Scrape products and prices from **TSBOHEMIA.SK**, the Slovak e-shop of the IT and electronics retailer TS Bohemia. Use a **category URL**, **product URLs**, a **search term**, or look products up by **order code, EAN or part number**. For each product you get the name, brand, **EAN**, part number, the current price in **EUR** (with and without the Slovak VAT), the **lowest price in the last 30 days**, **public discount codes and the price with the code**, promotions, availability, labels and energy class. Optionally you also get the technical parameters, warranty and all product images.

Built for **price monitoring** (sledovanie cien): 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**.

Looking for the Czech shop? Use the [TSBOHEMIA.CZ Scraper](https://apify.com/tsutseisoftware/tsbohemia-scraper) (same output format, prices in CZK).

### Why use this TSBOHEMIA.SK scraper?

- 🔢 **EAN and part number for every product**, already in the listing (no extra request). Match TSBOHEMIA.SK products with other Slovak shops or your catalogue.
- 🔎 **Lookups by order code, EAN or part number.** Paste a list of up to 200 codes and get exactly those products, each marked with `matchedBy`.
- 🎟️ **Discount codes.** Many products are cheaper "s kódom" (with a code). You get `couponPrice`, `couponCode` and `couponValidUntil`, so you see the real lowest price.
- 🏷️ **Real discounts.** `isDiscounted` and `discountPercent` compare the price with the **lowest price of the last 30 days** ("Bežná cena"), as the shop shows it under EU rules.
- 💶 **Slovak prices, as on the website:** EUR with the Slovak VAT (23 %), and the price without VAT.
- 🎛️ **The website's own filters:** brand, store availability (e-shop or a store), labels (clearance, last pieces, new…) and **any category parameter** (screen size, Smart TV, weight range…). Or just paste a URL with filters set on the website.
- 📉 **Monitoring mode and price drop alerts.** Only new or changed products, with `previousPrice`, `priceChange` and `priceChangePercent`; removed and reappeared products on request.
- ⚡ **Optional fast mode**, about 5× faster, for a tiny extra charge.

### What data can you get?

| Field | Example |
|---|---|
| Name, brand | 43" SAMSUNG UE43M70H (2026), SAMSUNG |
| EAN, part number, order code | 8806097966722, UE43M70H, 195566 |
| Price incl. / without VAT | 459.27 EUR, 373.39 EUR |
| Lowest price in 30 days | 342.03 EUR |
| Discounted, discount | false, null |
| Price with code, code, valid until | 358.97 EUR, TSB1026-SAMTVCZ-A, 2026-10-29 |
| Availability | in_stock (Skladom na predajni: Olomouc, Pavlovičky) |
| Stores with stock | 1 (Olomouc, Pavlovičky) |
| Labels, energy class | Posledné kusy, F |
| Category path | Elektronika › Televízory |
| Parameters (optional) | Uhlopriečka obrazovky: 139 cm (55"), Smart TV: Áno, … |
| Warranty, images (optional) | 24 months, 6 image URLs |

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

### How to scrape TSBOHEMIA.SK

1. **Category:** open TSBOHEMIA.SK, go to a category, e.g. `https://www.tsbohemia.sk/televizie_c5622`, and paste the URL into **Category, product or search URLs**. Product URLs (`…_d561377`) work too. A parent category such as *Počítače a notebooky* is scraped through its subcategories.
2. **Or search:** type what you're looking for into **Search**, e.g. `samsung qled`. Results come in the shop's relevance order.
3. **Or look up exact products:** put order codes into **Order codes (Objednávací kód)** (the number after *Objednávací kód* on the product page), barcodes into **EANs** or manufacturer codes into **Part numbers (MPN)**.
4. Optionally narrow it down with **Site filters** (brand, store, labels, parameters) and **Filters**, set **Max products**, and turn on **Add specifications, warranty and images** if you need them.
5. Click **Start** and download the results as JSON, CSV or Excel, or use the API.

**Tip:** set filters on the website (brand, screen size…) and paste the URL including the part after `#`, e.g. `https://www.tsbohemia.sk/televizie_c5622#brands=109&par-0-2177=Áno`. The actor applies the same filters. A URL sorted by price on the website is sorted by the actor (see *Sorting by price or discount*).

### Use cases

**Daily price monitoring of a category**, including products that disappeared. Schedule it every morning:

```json
{
  "startUrls": [{ "url": "https://www.tsbohemia.sk/televizie_c5622" }],
  "maxItems": 0,
  "onlyNewOrChanged": true,
  "includeRemovedProducts": true,
  "monitoringKey": "tv-daily"
}
```

**Price drop alerts** of at least 10 %:

```json
{
  "startUrls": [{ "url": "https://www.tsbohemia.sk/televizie_c5622" }],
  "maxItems": 0,
  "onlyNewOrChanged": true,
  "monitoringKey": "tv-drops",
  "minPriceDropPercent": 10
}
```

**Track your own list of products by EAN** (e.g. to compare with other Slovak shops):

```json
{
  "eans": ["8806097090953", "8806097966722"],
  "productCodes": ["170268"],
  "onlyNewOrChanged": true,
  "monitoringKey": "my-products"
}
```

**55" Samsung and LG Smart TVs shipping from the e-shop, up to 700 EUR:**

```json
{
  "startUrls": [{ "url": "https://www.tsbohemia.sk/televizie_c5622" }],
  "brands": ["Samsung", "LG"],
  "stores": ["e-shop"],
  "parameterFilters": { "Uhlopriečka obrazovky": ["138 cm (55\")", "139 cm (55\")", "140 cm (55\")"], "Smart TV": "Áno" },
  "maxPrice": 700
}
```

**Clearance and discount codes:** `"labels": ["Výprodej"]` or `"onlyWithCoupon": true`.

### Input

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

| Input | What it does |
|---|---|
| **Brands** | Only these brands, e.g. `Samsung`, `LG`. |
| **Available in store** | `e-shop` (ships now) and/or stores. TSBOHEMIA.SK lists the shop's stores in the Czech Republic: `Brno`, `Olomouc`, `Ostrava`. |
| **Labels** | `Výprodej` (all clearance), `Posledné kusy`, `Výpredaj`, `Použité`, `Rozbalené zlacnené`, `Novinka`, `Predobjednávka`… |
| **Parameter filters** | Any parameter of the category's filter (Slovak names): `{"Name": "value"}`, `{"Name": ["value 1", "value 2"]}` or `{"Name": {"min": 1, "max": 10}}` for numeric ones. |
| **Sort by** | The shop's order: *Recommended* (default) or *Best sellers*. Or sorted by the actor: *Cheapest first*, *Most expensive first*, *Biggest discount first*, *Cheapest incl. discount codes* (see below). |

Names are matched without case and diacritics; a unique beginning is enough (`uhlopriecka`). 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.

#### Sorting by price or discount (extra charge)

The shop doesn't provide sorting by price for automated access, so the actor sorts by itself: it reads **the whole category** (up to **Max pages per category**), applies your filters, sorts the products and saves the first **Max products**. Example: the 10 cheapest 55" TVs shipping from the e-shop.

- **It costs a little more:** besides the price per saved product, each listing page read for sorting (24 products) is charged as a **"Sorting page"** event, **$0.002 per page**. Sorting the TV category (about 20 pages) adds about $0.04.
- **It takes longer:** the actor reads every page at the gentle pace of 12 requests per minute (2 requests per page), e.g. about 3–4 minutes for 480 TVs (under a minute in fast mode).
- Use filters (brand, parameters, store) to make the listing smaller: fewer pages to read means a cheaper and faster run.
- Your **maximum cost per run** is respected: if it would run out, the actor stops reading more pages, keeps enough budget for the products and sorts what it has read.
- *Recommended* and *Best sellers* are free and fast (the shop does the ordering).

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

| Input | Example |
|---|---|
| **Only products in stock**, **Availability** | in stock / on order / on request / pre-order |
| **Only discounted products**, **Min discount (%)** | price below the 30-day low, at least 15 % off |
| **Only products with a discount code** | `couponCode` is set |
| **Min price (EUR)**, **Max price (EUR)** | 300 – 900 |
| **Exclude brands**, **Name must contain**, **Name must not contain** | `OLED`, not `stojan` |
| **Exclude used and open-box products**, **Only products with EAN**, **Energy classes** | `A`, `B` |

#### Lookups by order code, EAN or part number

Each code is searched on TSBOHEMIA.SK and only products with **exactly** that order code, EAN or part number are returned, with `matchedBy` set to `productCode`, `ean` or `partNumber`. An EAN or a part number can return two products (e.g. a product and its "EU" twin with the same EAN). Codes that don't exist are listed in the status message (*not found: …*); codes that can't be valid (e.g. an EAN with a wrong check digit) are skipped with a warning and listed as *not valid, skipped: …*, and the rest of the run goes on. At most 200 codes per run; each lookup takes 3 requests.

#### Fast mode (small extra charge)

Normal speed: at most **12 requests per minute**, one at a time. **Fast mode**: at most **60 per minute**, 2 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", "forbidden", "service unavailable", shows a challenge or slows down; products saved after that have no fast-mode charge.

#### Other inputs

**Advanced**: **Max pages per category** (24 products per page), **Max pages per search** (at most 5), **Include subcategories** and **Proxy configuration** (defaults to Apify residential proxy in Slovakia, 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, discount status or price with a code** changed. **Monitoring: only price changes** narrows it to price changes, **Monitoring: min price drop (%)** to price drops.

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

### How much does it cost to scrape TSBOHEMIA.SK?

You pay per saved product; the platform usage and the residential proxy are 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 |

Sorting by price or discount adds **$0.002 per listing page read** (see above). A product saved with its product page (details, lookups) costs a little more, because the page goes through the residential proxy. A removed-product row is saved and charged like a product (without the product page). Filtered-out and unchanged products (in monitoring mode) are free. There is also a tiny start fee of $0.00005 per run.

| Scenario | Requests | Time (normal / fast mode) | Price (FREE plan) |
|---|---|---|---|
| 20 products from a category | 3 | ~15 s / ~5 s | $0.02 |
| 1 000 products from a category | ~85 | ~7 min / ~1.5 min | $0.95 |
| 100 products with parameters, warranty and images | ~110 | ~9 min / ~2 min | $0.19 |
| 50 EAN lookups | ~150 | ~13 min / ~3 min | $0.10–0.19 |
| 10 cheapest TVs (sorting ~480 products) | ~41 | ~3–4 min / ~1 min | $0.01 + ~$0.04 sorting |

### Input example

```json
{
  "startUrls": [{ "url": "https://www.tsbohemia.sk/televizie_c5622" }],
  "searchQueries": ["samsung qled"],
  "eans": ["8806097090953"],
  "maxItems": 100,
  "brands": ["Samsung"],
  "onlyInStock": true,
  "includeDetails": false
}
```

### Output example

```json
{
  "id": "tsbohemia-sk:591103",
  "source": "tsbohemia.sk",
  "url": "https://www.tsbohemia.sk/43-samsung-ue43m70h-2026_d591103",
  "productId": 591103,
  "productCode": "195566",
  "partNumber": "UE43M70H",
  "ean": "8806097966722",
  "name": "43\" SAMSUNG UE43M70H (2026)",
  "brand": "SAMSUNG",
  "category": "Televízory",
  "categoryPath": ["Elektronika", "Televízory"],
  "mainCategory": "Elektronika",
  "price": 459.27,
  "priceWithoutVat": 373.39,
  "currency": "EUR",
  "lowestPrice30Days": 342.03,
  "isDiscounted": false,
  "discountPercent": null,
  "couponPrice": 358.97,
  "couponCode": "TSB1026-SAMTVCZ-A",
  "couponValidUntil": "2026-10-29T22:59:59Z",
  "promoLabel": null,
  "promoEndsAt": null,
  "availability": "in_stock",
  "availabilityText": "Skladom na predajni: Olomouc, Pavlovičky",
  "onlineAvailabilityText": null,
  "storeCount": 1,
  "storeNames": ["Olomouc, Pavlovičky"],
  "labels": [],
  "isUsedOrOpenBox": false,
  "energyClass": "F",
  "shortDescription": "Televízor – Mini LED, 109 cm, 4K Ultra HD, 50/60 Hz, DVB-T2/S2/C, …",
  "imageUrl": "https://interlink-static3.tsbohemia.cz/43-samsung-ue43m70h-2026_ig591103.jpg",
  "position": 1,
  "warrantyMonths": null,
  "specifications": null,
  "images": null,
  "description": null,
  "detailScraped": false,
  "matchedBy": null,
  "changeType": null,
  "firstSeenAt": null,
  "previousPrice": null,
  "priceChange": null,
  "priceChangePercent": null,
  "removedAt": null,
  "sourceUrl": "https://www.tsbohemia.sk/televizie_c5622",
  "scrapedAt": "2026-10-19T08:00:00Z"
}
```

### Limitations

- **Speed:** at most 12 requests per minute (60 in fast mode): about 140 products per minute from listings (2 requests per 24 products), 12 per minute with details. This is on purpose, to keep the load on the shop low.
- **Stores:** TSBOHEMIA.SK shows stock in the shop's stores in the Czech Republic (Brno, Olomouc, Ostrava); it has no stores in Slovakia. `storeNames` lists the stores the shop names on the product tile; `storeCount` can be higher.
- **Sorting** by price or discount reads the whole category first (slower, charged per page read). With **Max pages per category** lower than the category size, only the products on the pages read are sorted.
- **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 5). For large or scheduled runs, use category URLs or lookups.
- **Search results and lookups have no category** unless you turn on **Add specifications, warranty and images**.
- **Some texts are not translated by the shop**: e.g. the label group "Výprodej" and the energy label title are in Czech on TSBOHEMIA.SK too, and are returned as the website shows them.
- **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.
- If the site rejects a request, it 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 detail couldn't be read are returned with the listing data (`detailScraped: false`). A rejected lookup stops the remaining lookups of the run.

### For AI agents and API users

- **Minimal input:** `{"searchQueries": ["samsung qled"], "maxItems": 20}`, `{"eans": ["8806097090953"]}` or `{"startUrls": [{"url": "https://www.tsbohemia.sk/televizie_c5622"}], "maxItems": 20}`.
- One row = one product = one charge (+ the fast-mode event when fast mode is on). `includeDetails: true` adds 1 request per product, same price per product. `sortBy` `cheapest`, `mostExpensive`, `biggestDiscount` or `cheapestWithCode` also charges one `sorting-page` event per listing page read.
- 24 products per listing page. `maxItems` counts saved products, `maxItemsPerStartUrl` limits each search term, URL or lookup.
- Prices are in EUR incl. 23 % VAT. `availability` is one of `in_stock`, `on_order`, `on_request`, `preorder`, `out_of_stock`, `unknown`. `matchedBy` is `productCode`, `ean`, `partNumber` or null.
- 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/tsbohemia-sk-scraper").call(run_input={
    "startUrls": [{"url": "https://www.tsbohemia.sk/televizie_c5622"}],
    "maxItems": 100,
})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(product["name"], product["price"], product["couponPrice"], product["ean"])
```

#### JavaScript

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('tsutseisoftware/tsbohemia-sk-scraper').call({ eans: ['8806097090953'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((p) => `${p.name}: ${p.price} EUR`));
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/tsutseisoftware~tsbohemia-sk-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"startUrls": [{"url": "https://www.tsbohemia.sk/televizie_c5622"}], "maxItems": 20}'
```

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 TSBOHEMIA.SK category (`…_c123`), product (`…_d123`) or search URL. For www.tsbohemia.cz use the TSBOHEMIA.CZ Scraper. |
| `not found: …` | No product on TSBOHEMIA.SK has exactly this order code, EAN or part number. |
| `not valid, skipped: …` | The value can't be an order code, EAN or part number (e.g. a wrong EAN check digit); fix it, the other codes were looked up. |
| `unknown brand / 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 has the requested brand, label or parameter value. |
| `… only lists subcategories` | Turn on **Include subcategories**, or use a subcategory URL. |
| `TSBOHEMIA.SK is rejecting requests` | Keep the default **Proxy configuration**; otherwise try again later. |
| `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** reached); removed products are checked in a complete run. |
| `… listing pages could not be read, so the results may be incomplete` | The site didn't answer some pages; run it again later for complete results. |
| `Saved 0 products (new or changed since last run)` | Nothing changed since the previous monitoring run; that's expected. |

### More Czech & Slovak e-shop scrapers

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

- [Datart.cz Scraper](https://apify.com/tsutseisoftware/datart-scraper): electronics: prices, 30-day low, EAN, store availability
- [TSBOHEMIA.CZ Scraper](https://apify.com/tsutseisoftware/tsbohemia-scraper): IT & electronics: prices, discount codes, EAN, site filters
- [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
- [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 TSBOHEMIA.SK?

The actor collects only publicly available product data (prices, availability, codes, parameters) that anyone sees on the website without logging in, and no personal data: no reviews, questions or contacts. It reads the same public data the website itself loads, does not log in, makes at most 12 requests per minute by default (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 or photos. If unsure, consult a lawyer.

#### Do I need a proxy?

It's already set up. TSBOHEMIA.SK rejects requests from data-center IP addresses (including Apify's own servers), so the default **Proxy configuration** is Apify Proxy with residential IPs in Slovakia. The proxy is included in the price per product. Keep the default unless you have your own Slovak proxies.

#### Is TSBOHEMIA.SK the same as TSBOHEMIA.CZ?

The same shop and the same catalogue, run by the same company, with Slovak texts, prices in EUR and the Slovak VAT. Product ids, EANs and part numbers are the same, so you can match the two shops directly. For the Czech shop use the [TSBOHEMIA.CZ Scraper](https://apify.com/tsutseisoftware/tsbohemia-scraper).

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

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

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

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

#### Something doesn't work

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

Unofficial, not affiliated with or endorsed by T.S.BOHEMIA a.s. (Olomouc, Czech Republic), the operator of TSBOHEMIA.SK. This tool is also known as a TSBOHEMIA.SK API, TS Bohemia SK price tracker or "sledovanie cien TS Bohemia".

# Actor input Schema

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

TSBOHEMIA.SK category URLs (e.g. https://www.tsbohemia.sk/televizie_c5622), product URLs (…\_d561377) or search URLs (https://www.tsbohemia.sk/search?query=…). Tip: set filters on the website and paste the URL including the part after # (e.g. …\_c5622#brands=109\&par-0-6399=Android); the actor applies them. Parent categories that only list subcategories are scraped through their subcategories.

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

Search terms, e.g. 'samsung qled', 'notebook lenovo'. Results come in the shop's relevance order. At most 10 terms per run; for large or scheduled runs prefer category URLs. To find exact products, use the order code, EAN or part number fields below.

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

Look up products by the shop's order code, the number after 'Objednávací kód' on the product page (e.g. 169608). One product per code. Together with EANs and part numbers at most 200 per run.

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

Look up products by EAN barcode (8, 12, 13 or 14 digits, e.g. 8806097090953). The check digit is verified. All products with this EAN are returned (e.g. a product and its EU-version twin).

## `partNumbers` (type: `array`):

Look up products by the manufacturer's part number (e.g. QE55S90F). Spaces, dots, dashes and case don't matter.

## `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`):

Read each product's detail to add the technical parameters, warranty length, all product images and the exact category path. Slower: one extra request per product (the actor makes at most 12 requests per minute, 60 in fast mode).

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

Add the first ~200 characters of the product description. Reads the product detail (like "Add specifications, warranty and images"), so it is slower.

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

Recommended and Best sellers are the shop's own order. The other options are sorted by the actor: it reads the whole listing (up to Max pages per category), applies the filters, sorts and saves the first Max products, so the run takes longer and costs more: each listing page read for sorting (24 products) is charged as a 'Sorting page' event (see Pricing). Cheapest incl. discount codes uses the lower of price and price with a code. Search results are sorted too.

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

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

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

Only products in stock in these places: 'e-shop' (ships now) and/or store names. TSBOHEMIA.SK lists the shop's stores in the Czech Republic: 'Brno', 'Olomouc', 'Ostrava'. Several values = any of them.

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

Only products with these website labels, e.g. 'Výprodej' (all clearance: last pieces, used, sale), 'Posledné kusy', 'Výpredaj', 'Použité', 'Rozbalené zlacnené', 'Novinka', 'Predobjednávka'. Several values = any of them.

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

Filter by the category's parameters, as in the website's filter (Slovak names). Keys are parameter names, values are a value, a list of values (any of them), or {"min": number, "max": number} for numeric parameters. Example for TVs: {"Uhlopriečka obrazovky": \["139 cm (55")", "164 cm (65")"], "Smart TV": "Áno", "Hmotnosť \[kg]": {"max": 15}}. Available names and values are listed in the log when a name isn't found.

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

Keep only products marked 'Skladom' (in stock in the e-shop or in a store).

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

Keep only products with these availability states.

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

Keep only products whose price is below the lowest price of the last 30 days (the website shows a % discount).

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

Keep only products discounted by at least this many percent against the 30-day low.

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

Keep only products that have a cheaper price with a discount code. The code is in couponCode.

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

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

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

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

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

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

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

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

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

Skip products whose name contains any of these words.

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

Skip products labelled 'Použité' (used) or 'Rozbalené zlacnené' (opened, discounted).

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

Skip products without an EAN (barcode), e.g. for matching with other shops.

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

Keep only products with these energy classes, e.g. 'A', 'B'. Products without an energy label are skipped when set.

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

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

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

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

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

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

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

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

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

With monitoring: also return products of the previous run that are no longer listed (changeType 'removed', with removedAt and the last known name, price and URL), and mark products that come back as 'reappeared'. Checked only after a run that read everything it was asked for. Removed rows are saved (and charged) like products.

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

Up to 60 requests per minute (2 at a time) instead of 12 (1 at a time), about 5x faster. Costs a little extra per product saved at the fast speed (see Pricing). The run switches back to the normal speed for the rest of the run as soon as the site answers 'too many requests', 'forbidden', shows a challenge or slows down; products saved after that have no fast-mode charge.

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

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

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

How many result pages (24 products each) to read for each search term. At most 5.

## `includeSubcategories` (type: `boolean`):

When a URL is a parent category that only lists subcategories (e.g. 'Počítače a notebooky'), scrape its subcategories.

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

TSBOHEMIA.SK rejects requests from data-center IP addresses, so the default is Apify Proxy with residential IPs in Slovakia. You can also use your own Slovak proxies.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.tsbohemia.sk/televizie_c5622"
    }
  ],
  "maxItems": 20,
  "maxItemsPerStartUrl": 0,
  "includeDetails": false,
  "includeDescription": false,
  "parameterFilters": {},
  "onlyInStock": false,
  "onlyDiscounted": false,
  "onlyWithCoupon": false,
  "excludeUsedOrOpenBox": false,
  "onlyWithEan": false,
  "onlyNewOrChanged": false,
  "monitoringKey": "default",
  "onlyPriceChanges": false,
  "includeRemovedProducts": false,
  "fastMode": false,
  "maxPagesPerCategory": 50,
  "maxSearchPages": 2,
  "includeSubcategories": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "SK"
  }
}
```

# 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.tsbohemia.sk/televizie_c5622"
        }
    ],
    "maxItems": 20,
    "parameterFilters": {},
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "SK"
    }
};

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

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

```

## MCP server setup

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