# Shoptet Products Scraper (`cz_data_tools/shoptet-products-scraper`) Actor

Extract product names, prices, stock and codes from any e-shop built on Shoptet (Czechia, Slovakia, Hungary). Fast, polite, no browser.

- **URL**: https://apify.com/cz_data_tools/shoptet-products-scraper.md
- **Developed by:** [CZ Data Tools](https://apify.com/cz_data_tools) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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.

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

## Shoptet Products Scraper

Extract product data from any e-shop built on **[Shoptet](https://www.shoptet.cz)**, the platform behind ~45,000 online stores in Czechia, Slovakia and Hungary. Give it a shop URL and get a clean table of products: name, price incl. VAT, currency, availability, stock quantity, product code, category, manufacturer and variants.

No browser, no login, no proxies. One parser works for every Shoptet store because they all share the same platform.

### What does Shoptet Products Scraper do?

- Finds all product pages of a Shoptet e-shop from its sitemap.
- Extracts **price incl. VAT** (lowest and highest price for products with variants), **currency** (CZK, EUR, HUF), **availability**, **stock quantity**, **product code**, **EAN** where published, **category path**, **manufacturer** and **image URL**.
- Returns **every variant** with its own code, stock, price and availability.
- Scrapes several shops in one run, in parallel.

### Why scrape Shoptet stores?

- **Competitor price monitoring.** Track prices and stock of competing Shoptet shops daily.
- **Out-of-stock alerts.** See when a competitor runs out of a product, a good moment to adjust your own price.
- **Reseller / MAP monitoring.** Check that resellers of your brand keep the recommended prices.
- **Market research.** Map assortments, price levels and categories of Czech and Slovak e-shops.
- **Catalogue audits.** Get a full product list of your own shop for checking in a spreadsheet.

### How to scrape a Shoptet e-shop

1. Click **Try for free**.
2. Paste one or more shop homepage URLs, e.g. `https://www.example.cz`.
3. Set **Max products per shop** (`0` = whole catalogue).
4. Click **Start** and download the results as Excel, CSV or JSON, or read them through the API.

Not sure whether a shop runs on Shoptet? Shoptet shops load their files from `cdn.myshoptet.com`, and many show "Provozováno na Shoptet" in the footer. If a URL isn't a Shoptet store, the run tells you and skips it.

### How much does it cost to scrape Shoptet?

You pay **$2 per 1,000 products** (plus a tiny start fee). Examples:

| Job | Products | Price |
|---|---|---|
| Quick sample of a shop | 100 | $0.20 |
| Full catalogue of a mid-size shop | 3,000 | $6 |
| Daily check of 3 competitors × 300 products | 900 / day | $1.80 / day |

Set a **maximum cost per run** in Run options and the scraper stops when it reaches it. You're never charged more than that.

### Input

| Field | Description | Default |
|---|---|---|
| `shopUrls` | Homepage URLs of Shoptet e-shops, e.g. `https://www.example.cz` | — |
| `maxProductsPerShop` | Stop after this many products per shop, `0` = all | `100` |
| `requestDelaySecs` | Seconds between two requests to the same shop (min. 1) | `1` |

```json
{
    "shopUrls": ["https://classic.shoptet.cz"],
    "maxProductsPerShop": 100
}
```

### Output

One item per product:

```json
{
    "url": "https://classic.shoptet.cz/interier-a-bydleni-komody/komoda-nara/",
    "shop": "classic.shoptet.cz",
    "productId": 317,
    "code": "317/BIL",
    "name": "Komoda NARA",
    "manufacturer": "NARA",
    "category": "Interiér a bydlení | Komody",
    "price": 7899,
    "priceMax": 7899,
    "currency": "CZK",
    "availability": "InStock",
    "availabilityText": null,
    "stockQuantity": 10,
    "hasVariants": true,
    "variants": [
        { "code": "317/BIL", "quantity": 6, "price": 7899, "availability": "InStock" },
        { "code": "317/HNE", "quantity": 4, "price": 7899, "availability": "InStock" }
    ],
    "ean": null,
    "imageUrl": "https://cdn.myshoptet.com/usr/classic.shoptet.cz/user/shop/big/317_komodkaa1.png",
    "scrapedAt": "2026-10-24T19:48:12.258Z"
}
```

| Field | Meaning |
|---|---|
| `price` / `priceMax` | Price incl. VAT. When variants cost differently, `price` is the lowest and `priceMax` the highest. |
| `availability` | schema.org state (`InStock`, `OutOfStock`, `PreOrder`, …). `InStock` if any variant is in stock. `null` if the shop doesn't state it. |
| `availabilityText` | The shop's own wording, e.g. "Skladem" or "Doručení do 24 hodin". Products with variants have it per variant only. |
| `stockQuantity` | Total units in stock, when the shop publishes it (many shops don't, then `null`). |
| `variants` | Code, stock quantity, price and availability of each variant. |

### Price monitoring: schedules and integrations

- **Schedule** the scraper (e.g. every morning) in Apify Schedules to build a price and stock history.
- Send results to **Google Sheets**, **Make**, **Zapier**, **Slack** or a webhook with Apify integrations.
- Call it from your code through the **Apify API**, or let an **AI agent** use it through the Apify MCP server.

### How it works

1. Reads the shop's `robots.txt` and the sitemap it declares.
2. Picks product pages from the sitemap.
3. Reads the structured product data each Shoptet product page publishes.

It requests one page per shop per second, respects `robots.txt` and identifies itself with its own user agent. When a shop blocks it, the run reports the error and moves on. It never tries to get around the block. Some shops forbid product crawling in their `robots.txt`; such shops return no products.

**Run time:** about one product per second per shop. Several shops run in parallel. A shop with 3,000 products takes roughly an hour, so raise the run timeout for full catalogues. Data scraped before a timeout is kept.

### FAQ

**Is it legal to scrape Shoptet stores?**
The scraper only reads public pages, collects factual data (prices, stock, codes) and no personal data, follows `robots.txt` and keeps a low request rate. How you use the data is your responsibility. See *Fair use* below.

**Does it work for Slovak and Hungarian Shoptet shops?**
Yes. It works for any Shoptet shop, and prices come in the shop's currency (CZK, EUR, HUF…).

**Why did a shop return no products?**
Either it isn't a Shoptet store, its `robots.txt` disallows crawling product pages, or it blocked the request. The run log says which.

**Can I get the description and images of products?**
No, on purpose. Descriptions and photos can be copyrighted. You get the image URL only.

### Fair use and legal notes

- The scraper collects **factual data only**: prices, availability, codes and categories. It does **not** copy product descriptions or download images (only the image URL is returned). It does **not** collect reviews, discussions or any personal data.
- Only publicly accessible pages are visited. There is no login and no circumvention of blocks, CAPTCHAs or rate limits.
- You are responsible for using the data lawfully. In particular, don't use it to copy and republish a shop's catalogue, which can be protected as a database under EU law. Also respect the terms of the shops you monitor.
- This actor is **not affiliated with, endorsed by or connected to Shoptet a.s.** "Shoptet" is used only to describe compatibility.

### Limitations

- Variant names (e.g. size "M") are not included yet, only variant codes.
- Products that a shop leaves out of its sitemap are not found.

### Česky

**Scraper pro Shoptet.** Stáhne produkty z libovolného e-shopu na Shoptetu: název, cenu s DPH, dostupnost, počet kusů skladem, kód, EAN, kategorii, výrobce a varianty. Hodí se na **hlídání cen konkurence**, sledování skladovosti, kontrolu doporučených cen u prodejců nebo průzkum trhu. Funguje pro české, slovenské i maďarské e-shopy na Shoptetu. Platíte jen za stažené produkty ($2 za 1 000), stahuje ohleduplně (respektuje robots.txt, 1 požadavek za sekundu na e-shop) a jen faktická data.

# Actor input Schema

## `shopUrls` (type: `array`):

Homepage URLs of e-shops running on Shoptet, e.g. https://www.example.cz. Product pages are discovered from the shop's sitemap.

## `maxProductsPerShop` (type: `integer`):

Stop after this many products per shop. 0 = all products.

## `requestDelaySecs` (type: `integer`):

Politeness limit: each shop gets at most one request per this many seconds, so shops are never overloaded. Several shops are scraped in parallel.

## Actor input object example

```json
{
  "shopUrls": [
    "https://classic.shoptet.cz"
  ],
  "maxProductsPerShop": 100,
  "requestDelaySecs": 1
}
```

# Actor output Schema

## `products` (type: `string`):

Scraped products: name, price incl. VAT (min/max for variants), currency, availability, stock quantity, code, category, manufacturer, variants and URLs.

# 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 = {
    "shopUrls": [
        "https://classic.shoptet.cz"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cz_data_tools/shoptet-products-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 = { "shopUrls": ["https://classic.shoptet.cz"] }

# Run the Actor and wait for it to finish
run = client.actor("cz_data_tools/shoptet-products-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 '{
  "shopUrls": [
    "https://classic.shoptet.cz"
  ]
}' |
apify call cz_data_tools/shoptet-products-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cz_data_tools/shoptet-products-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/GzpCvC0DYwlqdfbO2/builds/uAVZQxLQuck3udZSG/openapi.json
