# iSTYLE.cz Scraper ($1.75/1K): Apple Prices, EAN & Stock (`tsutseisoftware/istyle-scraper`) Actor

Scrape iSTYLE.cz (Apple Premium Reseller, Czech Republic) by collection, search, EAN, part number or product URL: price, discount, stock, EAN, Apple part number, open-box and refurbished offers. Filters, monitoring. Unofficial.

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

## Pricing

from $1.65 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## iSTYLE.cz Scraper: Apple Prices, Stock, EAN & Part Numbers

The **only iSTYLE.cz scraper** in Apify Store. Scrape Apple prices from **iSTYLE.cz**, an Apple Premium Reseller in the Czech Republic (iPhone, Mac, iPad, Apple Watch, AirPods and about 2 500 accessories from Epico, Spigen, Peak Design, JBL and others), from a **collection**, the **whole catalogue**, **search terms**, **product URLs**, or your own list of **EANs** or **Apple part numbers (MPNs)**. Built for **price monitoring and price comparison**: one row per colour and capacity, part numbers on every Apple product, and a monitoring mode that returns (and charges) only products whose price or availability changed. To compare one product across 9 Czech shops in one run, see the [Czech E-shop Price Comparison](https://apify.com/tsutseisoftware/czech-eshop-aggregator).

> **Česky:** Scraper a hlídač cen pro **iSTYLE.cz** (Apple Premium Reseller): cena, sleva, skladem, EAN, partnumber Apple, rozbalené a renovované kusy. Kolekce, celý katalog, vyhledávání, EAN, partnumber, filtry a monitoring změn cen. Výstup do Excelu, CSV nebo JSON. Podporu poskytujeme i česky.

### Why use this iSTYLE.cz scraper?

- 🍏 **Apple part numbers on every Apple product** (`MJRR4SX/A`, configure-to-order `Z1LA000CD`), without the shop's open-box prefixes, so you can match iSTYLE with Alza, Datart, Mironet and other shops. EAN on request or by lookup.
- 🏷️ **Prices as the shop shows them:** current price incl. VAT in whole crowns, the crossed-out price and the discount in their own fields, from **$1.75 per 1 000 products**, residential proxy included.
- ♻️ **Open-box ("otevřený") and refurbished ("renovovaný") offers** flagged in `condition` and `isUsedOrOpenBox`, with their own filters: only new, or only the cheaper second-hand offers.
- 🧩 **Specifications from the name:** storage, memory, chip, CPU and GPU cores, keyboard layout and display size of Macs; storage and colour of iPhones and iPads; case size, band size and connectivity of Apple Watch.
- 📉 **Monitoring and price alerts to Slack, Discord, Telegram or a webhook:** only new or changed products, with `previousPrice`, `priceChange` and `priceChangePercent`; removed and reappeared products on request.
- ⚡ **Fast and reliable:** the whole catalogue (about 5 500 products) in about 80 seconds, no browser; with the default settings every run in our tests completed.

### What data can you get?

Share of products with a value, measured on the whole catalogue (5 499 products) on 2026-11-09.

| Field | Example | Filled |
|---|---|---|
| Name, brand, SKU, category (product type) | Apple iPhone 18 Pro 256 GB burgundská červená, Apple, MJRR4SX/A, iPhone 18 Pro | 100 % |
| Price, currency | 34 990 CZK | 100 % |
| Crossed-out price, discount | 32 990 → 28 990 CZK, 12 % | discounted products (~21 % in November) |
| Availability, text | `in_stock`, "Skladem" | 100 % (~93 % in stock) |
| MPN (part number) | MJRR4SX/A | 100 % of Apple products except configure-to-order Macs with the shop's own code (CTO-…); ~40 % of accessories |
| Condition | `new`, `open_box`, `refurbished` | 100 % (~2 % open-box or refurbished) |
| Colour, capacity | burgundská červená, 256 GB | iPhones, iPads and Macs ~100 %; colour of ~70 % of all products |
| Specifications | `{"storage": "2 TB", "memory": "48 GB", "chip": "M5 Pro", "cpuCores": 18, …}` | devices (from the name) |
| Description | short plain text (up to 500 characters); the whole description as text, HTML or Markdown with **Description** | ~85 % |
| Updated | `2026-11-09T14:27:47+01:00` (when the shop last changed the product) | products from lists and searches |
| Image, tags, published date | image URL, `["BASE-PRODUCT", "NPI"]` | ~100 % |
| EAN *(Add EAN, lookups, product URLs)* | 195951415680 | every product read with these options |

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

### How to scrape iSTYLE.cz

1. Paste an iSTYLE.cz **collection URL**, e.g. `https://istyle.cz/collections/apl-ps-iphone-17-pro`, into **Collection, search or product URLs**. `https://istyle.cz/collections/all` is the whole catalogue, `https://istyle.cz/collections/rozbaleny-iphone` the open-box iPhones. Product URLs and search URLs work too. Or type **Search terms**, or paste **EANs** or **MPNs**.
2. Optionally set the **Filters** and **Max products**. Turn on **Add EAN (barcode)** if you need the EAN of listed products.
3. **Retry rejected requests from a new IP address** is **on by default**, so runs finish reliably ($0.003 per new address used, see [below](#the-shops-verification-page-and-retry-from-a-new-ip-address)). You can turn it off.
4. Click **Start** and download the results as JSON, CSV or Excel, or use the API.

**Tip:** the shop's menu leads to landing pages (`/pages/iphone`), which are not product lists. Use a collection URL or a search term instead, e.g. **Search terms** `["iphone 17 pro"]`.

### Use cases

Copy an input into the **JSON** tab of the input and adjust it.

**Track iPhone 17 Pro prices daily, only changes (schedule it):**

```json
{
  "startUrls": [{ "url": "https://istyle.cz/collections/apl-ps-iphone-17-pro" }],
  "maxItems": 0,
  "onlyNewOrChanged": true,
  "includeRemovedProducts": true,
  "monitoringKey": "iphone-17-pro"
}
```

**Compare prices with other shops by Apple part number:**

```json
{
  "mpns": ["MJRR4SX/A", "MG8G4ZD/A", "MFHP4ZM/A"],
  "excludeUsedOrOpenBox": true
}
```

**Open-box and refurbished bargains with at least 10 % off:**

```json
{
  "startUrls": [{ "url": "https://istyle.cz/collections/all" }],
  "onlyUsedOrOpenBox": true,
  "minDiscountPercent": 10,
  "onlyInStock": true,
  "maxItems": 0
}
```

**Apple discounts of 5 % or more straight to Telegram (schedule it daily):**

```json
{
  "startUrls": [{ "url": "https://istyle.cz/collections/all" }],
  "brands": ["Apple"],
  "maxItems": 0,
  "onlyNewOrChanged": true,
  "minPriceDropPercent": 5,
  "monitoringKey": "apple-drops",
  "telegramBotToken": "<YOUR_BOT_TOKEN>",
  "telegramChatId": "-1001234567890"
}
```

**Your assortment by EAN:**

```json
{
  "eans": ["195951415680", "195950051216"]
}
```

**MacBook Air 13" M5 under 35 000 CZK, new only:**

```json
{
  "searchQueries": ["macbook air 13 m5"],
  "maxPrice": 35000,
  "excludeUsedOrOpenBox": true,
  "maxItems": 50
}
```

**The whole catalogue with EANs (slow, about 50 minutes per 1 000 products):**

```json
{
  "startUrls": [{ "url": "https://istyle.cz/collections/all" }],
  "includeDetails": true,
  "maxItems": 0
}
```

#### The shop's verification page and "Retry from a new IP address"

iSTYLE.cz sometimes answers with a verification page instead of data, even to the Czech residential proxy that is set by default and included in the price. **Retry rejected requests from a new IP address** handles this:

- **On (default):** a rejected request is repeated from a new proxy address, **$0.003 per new address used**, nothing when the shop answers normally; it never solves the verification and keeps the same pace. With it on, every run in our tests completed. A short run usually costs $0–0.003 extra, the whole catalogue or a search $0.003–0.015; the most we measured was $0.054. Your maximum cost per run is respected: when it does not allow another new address, the run goes on as with the option off, and the status message says so.
- **Off:** a few cents cheaper, but the run may stop early (about 1 run in 5 in our tests failed or returned only a part, which also breaks scheduled runs). The log and the status message say so from the start of the run.
- It needs a proxy (the default one is fine); without Apify Proxy or your own proxies the option switches itself off and the log says so.

#### Search terms

Search terms search the **whole catalogue** (name, type, brand or SKU, accents ignored, about a minute for any number of terms); devices come first, then accessories, new products before open-box ones. Use **Name must not contain** (e.g. `kryt`) to drop accessories. **Max catalogue pages for searches** can limit the search to the newest products.

#### EANs and MPNs

Each EAN or part number returns only an exact match, with the EAN. When a new and an open-box offer share the EAN, the new one is returned (with **Only new** the open-box offers are never returned). A part number with another region suffix (`MJRR4CZ/A`) or the model alone (`MJRR4`) finds the same model.

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

**Only in stock**, **Only discounted**, **Min discount (%)**, **Min/Max price (CZK)**, **Brands**, **Exclude brands**, **Name must (not) contain**, **Categories (product types)** (e.g. "MacBook", "iPhone 17 Pro"), **Added in the last N days** (the shop's new products), **Tags** (the shop's tags, e.g. "NPI"), **Updated since** (a date or "24 hours", "7 days": products the shop changed), **Only new (no open-box or refurbished)** and **Only open-box or refurbished** are free: you don't pay for filtered-out products.

#### Description

**Description** chooses how the product description is saved: a short plain text (up to 500 characters, the default), the whole description as plain text, as clean HTML, or as Markdown (headings, paragraphs, lists and bold kept; scripts, images and styles dropped). No format costs more or slows the run.

#### Notifications (price alerts)

Fill in at least one channel and after each run the actor sends the saved products there: name, price, the price change (`was 14 990 CZK, -13.3 %`), availability and link, at most **Notifications: max products per message** (10 by default), then "…and N more". With **Monitoring: only new or changed products** (and **Monitoring: min price drop (%)**, **include removed products**) that is a ready price-drop, new-product or delisting alert: schedule the run and only the changes arrive; a run that saved nothing sends nothing. The webhook addresses are stored encrypted and never logged.

| Input | What to paste |
|---|---|
| **Notifications: Slack webhook URL** | an incoming webhook of your channel (`https://hooks.slack.com/services/…`) |
| **Notifications: Discord webhook URL** | a channel webhook (`https://discord.com/api/webhooks/…`) |
| **Notifications: Telegram bot token** + **Telegram chat ID** | the token from @BotFather and the chat, group or channel ID |
| **Notifications: webhook URL** | any HTTPS URL (Zapier, Make, n8n, your server): a POST with JSON `{title, summary, totalSaved, runUrl, datasetUrl, items}` |

A delivered notification costs **$0.001 per run** (not per channel). Nothing is charged when no channel is filled in, when the run saved nothing or failed, or when no channel accepted the message; a channel that fails never fails the run.

#### 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, crossed-out price or availability** changed. `previousPrice`, `priceChange` and `priceChangePercent` are filled when the price 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 (not when **Max products** or a page limit cut it short; the status message then says why). Use one **Monitoring key** per input.

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

You pay per saved product, plus small flat fees for what the run reads. Platform usage and the residential proxy are included. Filtered-out and unchanged products (in monitoring mode) are free.

| Plan | Price per 1 000 products |
|---|---|
| FREE | **$1.75** |
| BRONZE | **$1.73** |
| SILVER | **$1.70** |
| GOLD and higher | **$1.65** |

| Flat fee (the same on every plan) | Price | When |
|---|---|---|
| Run start | $0.01 | once per run |
| List page (`list-page`) | $0.0025 | each list page of a collection, the catalogue or a search that the shop answered (up to 250 products), so **$0.01 per 1 000 products read**, whether they are saved, filtered out or unchanged. A search term costs about $0.06 in list pages |
| Lookup without a saved product (`empty-lookup`) | $0.001 | an EAN, MPN or product URL that gave no row: not found, filtered out, already saved or unchanged in monitoring mode |
| Notification (`notification`) | $0.001 | only with a notification channel filled in: once per run whose notification was delivered |
| New IP address (`new-ip-retry`) | $0.003 | with **Retry rejected requests from a new IP address** (on by default): each new proxy address used for a request the shop rejected; nothing when the shop answers normally |

The EAN (**Add EAN**), found lookups and removed-product rows don't change the price per product. The flat fees cover runs that save little (a narrow filter, a monitoring run without changes, a search without results).

Typical runs (measured on Apify on 2026-11-10):

| Scenario | Price (FREE plan) | Typical time |
|---|---|---|
| 20 products from a collection (the prefilled input) | $0.0475 | ~5 s |
| The whole catalogue, 5 499 products | $9.69 | ~80 s |
| 1 000 products with the EAN | $1.77 | ~50 min |
| 1 search term, 10 products | $0.085 | ~80 s |
| 10 EANs or MPNs, all found | $0.0275 | ~1 min |
| Daily monitoring of the whole catalogue, nothing changed | $0.0675 | ~80 s |
| Daily monitoring of one collection, nothing changed | $0.0125 | ~5 s |

The prices above are without new IP addresses. With **Retry rejected requests from a new IP address** (on by default) add $0.003 for each new address used (see above). Turn the option off to never pay it, at the risk of a failed or partial run.

### Input example

```json
{
  "startUrls": [{ "url": "https://istyle.cz/collections/apl-ps-iphone-17-pro" }],
  "maxItems": 100,
  "onlyInStock": true
}
```

### Output example

An iPhone found by its EAN:

```json
{
  "id": "istyle:58676340850952",
  "source": "istyle.cz",
  "url": "https://istyle.cz/products/iphone-18-pro-256-gb-burgundska-cervena-mjrr4sx-a",
  "productId": "12235545411848",
  "variantId": "58676340850952",
  "productCode": "MJRR4SX/A",
  "name": "Apple iPhone 18 Pro 256 GB burgundská červená",
  "brand": "Apple",
  "ean": "195951415680",
  "mpn": "MJRR4SX/A",
  "category": "iPhone 18 Pro",
  "categoryPath": ["iPhone 18 Pro"],
  "price": 34990,
  "currency": "CZK",
  "priceBeforeDiscount": null,
  "discountPercent": null,
  "isDiscounted": false,
  "availability": "in_stock",
  "availabilityText": "Skladem",
  "condition": "new",
  "isUsedOrOpenBox": false,
  "imageUrl": "https://cdn.shopify.com/s/files/1/0780/2113/2322/files/iPhone_18_Pro_Burgundy_PDP_Image_Position_1_Transparent__sk-SK.png?v=1789038689",
  "variantTitle": null,
  "color": "burgundská červená",
  "capacity": "256 GB",
  "specifications": { "storage": "256 GB" },
  "description": "iPhone 18 Pro. 6,3palcový displej s ProMotion, 48Mpx hlavní Fusion fotoaparát s variabilní clonou, pořádný skok ve výdrži baterie a čip A20 Pro. …",
  "tags": ["BASE-PRODUCT", "NPI"],
  "publishedAt": "2026-09-09T22:16:58+02:00",
  "detailScraped": true,
  "matchedBy": "ean",
  "searchQuery": "195951415680",
  "position": null,
  "sourceUrl": "https://istyle.cz/search?q=195951415680&type=product",
  "scrapedAt": "2026-11-09T14:00:00Z",
  "changeType": null,
  "firstSeenAt": null,
  "previousPrice": null,
  "priceChange": null,
  "priceChangePercent": null,
  "removedAt": null
}
```

### Limitations

- **One row per variant.** At iSTYLE every colour and capacity is a product of its own with one variant, so a row is one sellable configuration with its own SKU, EAN and price.
- **EAN** needs **Add EAN** (slower: about 50 minutes per 1 000 products) or a lookup by EAN. Lookups and product URLs always include it.
- **Part numbers:** Apple products carry the Apple part number as their SKU. Configure-to-order Macs with the shop's own code (`CTO-MBP-14-…`) and accessories with the shop's code (`K-…`) have `mpn: null`; `productCode` always has the SKU.
- **Availability** is what the shop marks for the variant ("Skladem" or "Není skladem"). Stock per store, pieces and delivery dates are not returned.
- **Related products** are not returned.
- **Price** is in whole crowns, as the page shows it.
- **Category** is the shop's product type ("iPhone 17 Pro", "Obaly a kryty pro iPhone"), not a category tree.
- **Not sold separately:** insurance, services and spare parts that the shop sells only with another product are left out.
- **Landing pages** (`/pages/…`) are not product lists. Collection URL parameters for sorting and filtering are ignored (use the input filters).
- **Ratings and reviews** are not returned. Photos are returned as URLs; product photos and texts are copyrighted, so check the rights before you republish them.
- **Rejected requests:** see [the verification page](#the-shops-verification-page-and-retry-from-a-new-ip-address). If rejections continue, the run stops with what it has saved and says so. Products whose EAN couldn't be read are returned without it (`detailScraped: false`).

### For AI agents and API users

- **Minimal input:** `{"startUrls": [{"url": "https://istyle.cz/collections/apl-ps-iphone-17-pro"}], "maxItems": 20}`, or `{"searchQueries": ["airpods pro 3"], "maxItems": 10}`, or `{"eans": ["195951415680"]}`, or `{"mpns": ["MJRR4SX/A"]}`.
- One row = one product variant = one charge. The EAN, found lookups and removed rows don't change the price. Flat events: run start $0.01, `list-page` $0.0025 per list page answered, `empty-lookup` $0.001 per EAN, MPN or product URL without a saved row, `new-ip-retry` $0.003 per new address.
- `descriptionFormat`: `short` (default), `text`, `html` or `markdown` (same price and speed); filters `tags`, `updatedSince` (`"7 days"` or a date), `categories`, `publishedWithinDays`; price alerts with `slackWebhookUrl` / `discordWebhookUrl` / `telegramBotToken` + `telegramChatId` / `webhookUrl` ($0.001 per delivered run).
- **Reliability:** `retryFromNewIp` is `true` by default ($0.003 per new proxy address used). With `false` a run may stop early; the status message then says to turn it on. Keep the default `proxyConfiguration` (Apify Proxy, `RESIDENTIAL`, country `CZ`).
- `maxItems` counts saved products, `maxItemsPerStartUrl` limits each URL, search term or the code list.
- Prices are in CZK incl. VAT, whole crowns. `availability` is `in_stock`, `out_of_stock` or `unknown`. `condition` is `new`, `open_box` or `refurbished`.
- 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/istyle-scraper").call(run_input={
    "startUrls": [{"url": "https://istyle.cz/collections/apl-ps-iphone-17-pro"}],
    "maxItems": 100,
})
for product in client.dataset(run.default_dataset_id).iterate_items():
    print(product["name"], product["price"], product["mpn"], product["availability"])
```

#### JavaScript

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('tsutseisoftware/istyle-scraper').call({
    searchQueries: ['airpods pro 3'], maxItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((p) => `${p.name}: ${p.price} CZK`));
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/tsutseisoftware~istyle-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"eans": ["195951415680"], "mpns": ["MG8G4ZD/A"]}'
```

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` (log) | Use an iSTYLE.cz collection (`/collections/…`), search or product URL; landing pages (`/pages/…`) are not product lists. |
| `Ignored URL parameters …` (log) | Sorting and filter parameters of collection URLs are not used; use the input filters. |
| `no products: …` | The collection or search has no products (with these filters). |
| `not found: …` | The shop has no product with exactly this EAN or part number. |
| `… lookups found a product already saved in this run` | Two of your codes belong to the same product; it is saved once. |
| `… could not be loaded` | The collection or product doesn't exist (anymore); open the URL in your browser. |
| `… not read: listing data without the EAN returned instead` | The shop didn't answer some product data; run it again later for the EANs. |
| `searched only part of the catalogue` | Raise **Max catalogue pages for searches**. |
| `stopped at the page limit …` | Raise **Max pages per collection**. |
| `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. |
| `"Retry rejected requests from a new IP address" is off, so this run may fail …` (start of the run) | You turned the option off (it is on by default), or the run has no proxy. Nothing is wrong yet; turn it back on for reliable results. |
| `iSTYLE.cz is rejecting requests with a verification page, nothing was saved` / `the site started rejecting requests, so the run stopped early` | Keep **Retry rejected requests from a new IP address** on (the default, $0.003 per new address) and keep the default proxy. If it was on (`… new IP addresses were tried and charged`), the shop kept rejecting requests: try again later. `your maximum cost per run did not allow another new IP address`: raise the maximum cost per run. |
| `… requests were read from a new IP address` | Expected with the option on: these requests were rejected first and read from another address. |
| `… lookups without a saved product charged` | These EANs, MPNs or product URLs gave no row (not found, filtered out, already saved, unchanged); each costs $0.001. |
| `iSTYLE.cz is not answering or answers too slowly` / `the shop answered too slowly, so the run stopped early` | The shop (or your own proxy) did not answer in time, so the run stopped instead of waiting; what it had read is saved. Try again later with the default proxy. |
| `… 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. |

### Custom scrapers and changes

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

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

### More Czech & Slovak e-shop scrapers

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

- [Czech E-shop Price Comparison](https://apify.com/tsutseisoftware/czech-eshop-aggregator): one product compared across 9 Czech e-shops in one run: lowest price and its shop, price per shop, monitoring
- [Datart.cz Scraper](https://apify.com/tsutseisoftware/datart-scraper): electronics: prices, 30-day low, EAN, store availability
- [TSBOHEMIA.CZ Scraper](https://apify.com/tsutseisoftware/tsbohemia-scraper): IT & electronics: prices, discount codes, EAN, site filters
- [Planeo.cz Scraper](https://apify.com/tsutseisoftware/planeo-scraper): electronics & appliances: prices, discount codes, store pickup, EAN
- [Smarty.cz Scraper](https://apify.com/tsutseisoftware/smarty-scraper): electronics: prices, coupons, cashback, EAN, price history, store stock
- [BAUHAUS.cz Scraper](https://apify.com/tsutseisoftware/bauhaus-cz-scraper): DIY & garden: prices, unit prices, stock in 9 stores, variants, EAN
- [Mironet.cz Scraper](https://apify.com/tsutseisoftware/mironet-scraper): electronics: prices, store stock, delivery date, MPN, warranty, price history
- [Alza Scraper (CZ, SK, HU, AT, DE)](https://apify.com/tsutseisoftware/alza-scraper): electronics: prices, coupons, ratings, reviews, pickup points, MPN
- [NAY.sk Scraper (Slovakia)](https://apify.com/tsutseisoftware/nay-sk-scraper): electronics: prices in EUR, discount codes, stock in 54 stores, EAN
- [BAUHAUS.sk Scraper (Slovakia)](https://apify.com/tsutseisoftware/bauhaus-sk-scraper): DIY & garden: EUR prices, Bratislava store stock, variants, EAN
- [Planeo.sk Scraper (Slovakia)](https://apify.com/tsutseisoftware/planeo-sk-scraper): electronics & appliances: EUR prices, discount codes, cashback, stock in 69 stores, EAN
- [TSBOHEMIA.SK Scraper (Slovakia)](https://apify.com/tsutseisoftware/tsbohemia-sk-scraper): IT & electronics: EUR prices, discount codes, EAN, lookups
- [Smarty.sk Scraper (Slovakia)](https://apify.com/tsutseisoftware/smarty-sk-scraper): electronics: EUR prices, coupons, cashback, stock in Slovak stores, EAN
- [OnlineShop.cz Scraper](https://apify.com/tsutseisoftware/onlineshop-scraper): electronics & appliances: prices, 30-day low, discount codes, EAN, stock
- [Mobil Pohotovost Scraper](https://apify.com/tsutseisoftware/mobil-pohotovost-scraper): phones, tablets and watches, new, like new and used: prices, EAN, MPN, condition, stock, monitoring

### FAQ

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

The actor reads only publicly available product data (names, prices, availability, part numbers, EANs), without logging in, at most 20 requests per minute. It slows down when the website asks and never solves captchas or other challenges; with **Retry rejected requests from a new IP address** on (the default) it repeats a rejected request from another proxy address at the same pace. It returns no personal data. The website's terms of use may limit automated access, and you are responsible for how you use the data, e.g. that you don't republish copyrighted photos and texts. If in doubt, consult a lawyer.

#### Do I need a proxy?

Yes, iSTYLE.cz needs a residential proxy. It is set by default (Czech Republic) and its cost is included in the price. **Retry rejected requests from a new IP address** is on by default too ($0.003 per new address used).

#### Why did my run fail with "rejecting requests"?

The shop answered with a verification page. If you turned **Retry rejected requests from a new IP address** off (or removed the proxy), turn it back on: the actor then asks again from another address ($0.003 per new address used) instead of stopping. With the option on this happens only when the shop keeps rejecting new addresses, or when your maximum cost per run does not allow another address; try again later or raise the limit.

#### Why is the EAN empty?

Listed products come without the EAN by default. Turn on **Add EAN (barcode)**, or look products up by **EANs**; product URLs include it too.

#### Why is the MPN empty for some Macs?

Configure-to-order Macs that the shop lists under its own code (`CTO-…`) have no Apple part number on iSTYLE.cz. Their SKU is in `productCode`, and the configuration is in `specifications`.

#### Is this for iSTYLE.sk too?

No, only for istyle.cz (Czech Republic, prices in CZK).

#### 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 iSTYLE CZ, s.r.o., the operator of iSTYLE.cz, or by Apple. This tool is also known as an iSTYLE.cz API, iSTYLE price tracker or "hlídač cen iSTYLE".

# Actor input Schema

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

iSTYLE.cz URLs: a collection (e.g. https://istyle.cz/collections/apl-ps-iphone-17-pro, https://istyle.cz/collections/rozbaleny-iphone for open-box iPhones, https://istyle.cz/collections/all for the whole catalogue), search results (https://istyle.cz/search?q=airpods) or a product (https://istyle.cz/products/iphone-17-pro-mg8g4sx-a). Landing pages (/pages/…) are not product lists: use search terms for them.

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

Searches the whole catalogue (name, type, brand, SKU or tags, accents ignored, about a minute for any number of terms). Devices come first (e.g. "iPhone 17 Pro"), then accessories (cases, straps). Up to 20 terms per run.

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

EAN / UPC barcodes (check digit verified), e.g. 195951415680. Only an exact match is returned. New products are preferred over open-box ones with the same EAN.

## `mpns` (type: `array`):

Manufacturer part numbers, e.g. MJRR4SX/A or the model alone MJRR4 (another region suffix such as MJRR4CZ/A finds the same model). Only an exact model match is returned.

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

Maximum number of products saved (and charged) in total. 0 = no limit.

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

Maximum number of products from each start URL or search term (and from all EANs or all MPNs). 0 = no limit.

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

Adds the EAN to listed products. Slower: about 50 minutes per 1 000 products instead of about a minute for the whole catalogue. Lookups by EAN or MPN and product URLs always include the EAN.

## `descriptionFormat` (type: `string`):

How the product description is saved. No format costs more or slows the run.

## `retryFromNewIp` (type: `boolean`):

On by default. iSTYLE.cz sometimes answers with a verification page instead of data, even to residential proxies. On: a rejected request is repeated from a new proxy address, $0.003 per new address used, nothing when the shop answers normally; it never solves the verification and keeps the same pace. A short run usually costs $0-0.003 extra; the most we measured was $0.054. Your maximum cost per run is respected. Off: a few cents cheaper, but the run may stop early. Needs a proxy (the default one is fine).

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

Only products the shop shows as "Skladem".

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

Only products with a crossed-out price.

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

Only products with at least this discount.

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

Lowest price incl. VAT.

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

Highest price incl. VAT.

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

Only these brands (the shop's vendor), e.g. Apple, Epico, Spigen, JBL. Case and diacritics are ignored.

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

Never these brands.

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

Any of these words (case and diacritics ignored), e.g. "256 GB".

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

None of these words (case and diacritics ignored), e.g. "kryt".

## `categories` (type: `array`):

Only products whose category (the shop's product type, the `category` field) contains one of these texts, e.g. "iPhone 17 Pro", "MacBook", "Obaly a kryty". Case and diacritics are ignored.

## `publishedWithinDays` (type: `integer`):

Only products the shop published in the last N days (the `publishedAt` field), e.g. 7 for this week's new products. 0 or empty = any time.

## `tags` (type: `array`):

Only products with at least one of these shop tags (the `tags` field), e.g. "NPI" (new product introductions), "BASE-PRODUCT". Whole tag, case and diacritics ignored.

## `updatedSince` (type: `string`):

Only products the shop changed since a date (2026-11-01) or within a period (24 hours, 7 days, 2 weeks), by the `updatedAt` field of the shop's lists. Products read one by one (EANs, MPNs, product URLs) have no update time and pass.

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

Drops open-box ("otevřený") and refurbished ("renovovaný") offers.

## `onlyUsedOrOpenBox` (type: `boolean`):

Only open-box ("otevřený") and refurbished ("renovovaný") offers, which are usually cheaper.

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

Saves (and charges) only products that are new or whose price, crossed-out price or availability changed since the previous run with the same monitoring key. Ideal for scheduled runs.

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

Name of the saved state. Use a different key for each tracked list. Empty = "default". The value is stored encrypted.

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

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

## `minPriceDropPercent` (type: `number`):

Only products whose price fell by at least this many percent since the previous run.

## `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.

## `slackWebhookUrl` (type: `string`):

Incoming webhook of your Slack channel (https://hooks.slack.com/services/...). Stored encrypted.

## `discordWebhookUrl` (type: `string`):

Webhook of your Discord channel (https://discord.com/api/webhooks/...). Stored encrypted.

## `telegramBotToken` (type: `string`):

Token of your Telegram bot (from @BotFather). Used with "Telegram chat ID". Stored encrypted.

## `telegramChatId` (type: `string`):

Chat, group or channel ID the bot writes to (e.g. -1001234567890).

## `webhookUrl` (type: `string`):

Any HTTPS URL (Zapier, Make, n8n, your server): gets a POST with JSON {title, summary, totalSaved, runUrl, datasetUrl, items}.

## `notificationLimit` (type: `integer`):

How many products are listed in one notification (the rest as "…and N more").

## `notifyOnlyChanges` (type: `boolean`):

Send nothing when the run saved no product (e.g. a monitoring run without changes).

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

Pages of up to 250 products read per collection (40 = 10 000 products, more than the whole catalogue).

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

How much of the catalogue search terms (and many MPNs) search, in pages of up to 250 products, newest products first. 40 covers the whole catalogue; a lower number searches only the newer part.

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

iSTYLE.cz needs a residential proxy. The default is Apify Proxy with residential IPs in the Czech Republic, included in the price. Even residential addresses are sometimes rejected: see "Retry rejected requests from a new IP address". You can also use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://istyle.cz/collections/apl-ps-iphone-17-pro"
    }
  ],
  "searchQueries": [],
  "maxItems": 20,
  "maxItemsPerStartUrl": 0,
  "includeDetails": false,
  "descriptionFormat": "short",
  "retryFromNewIp": true,
  "onlyInStock": false,
  "onlyDiscounted": false,
  "excludeUsedOrOpenBox": false,
  "onlyUsedOrOpenBox": false,
  "onlyNewOrChanged": false,
  "onlyPriceChanges": false,
  "includeRemovedProducts": false,
  "notificationLimit": 10,
  "notifyOnlyChanges": true,
  "maxPagesPerCategory": 40,
  "maxSearchPages": 40,
  "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://istyle.cz/collections/apl-ps-iphone-17-pro"
        }
    ],
    "searchQueries": [],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "CZ"
    }
};

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

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

```

## MCP server setup

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