# Bazos Scraper: bazos.cz, bazos.sk, bazos.pl, bazos.at + alerts (`datahamster/bazos-classifieds`) Actor

Bazos scraper for bazos.cz, bazos.sk, bazos.pl and bazos.at: search by keyword, section, town radius and price. Flat rows with parsed price and price type, town and postcode, section, view count, TOP flag, posted date and photo. Monitor mode alerts on new ads and price cuts. No login, no proxy.

- **URL**: https://apify.com/datahamster/bazos-classifieds.md
- **Developed by:** [Viktor Dubnytskiy](https://apify.com/datahamster) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 result items

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Bazos Scraper: bazos.cz, bazos.sk, bazos.pl, bazos.at + alerts

A Bazos scraper for the biggest free classifieds site of Czechia and Slovakia and its Polish and Austrian editions: **bazos.cz**, **bazos.sk**, **bazos.pl** and **bazos.at**. Search by keyword, section (rubrika), town radius and price, and every ad comes back as one flat row — or, in monitor mode, only the ads that are new or changed price since your last run.

### What you get — example output

One row per ad. Real values from the example dataset (site `sk`, query `bicykel`):

| Field | Example value | What it is |
|---|---|---|
| `id` | `bazos-sk-195074652` | Stable row key (`bazos-<site>-` + ad id) |
| `title` | `BISTRO SK BOLT FOOD TOP ZÁROBKY` | Ad headline |
| `price` / `priceLabel` | `2200` / `2 200 €` | Price parsed to a number, plus the label Bazos prints |
| `priceType` | `fixed` | `fixed`, `negotiable`, `free` or `in_text` — Bazos lets sellers write prices freely |
| `city` / `postcode` | `Bratislava` / `811 01` | Town and postcode from the ad |
| `section` | `praca` | Bazos rubrika the ad sits in (`categoryPath` matches) |
| `views` | `440` | How many times the ad has been viewed — a demand signal Bazos shows publicly |
| `isTop` | `true` | Whether the seller paid to pin the ad at the top |
| `postedDate` | `4.9. 2026` | Posting date as Bazos prints it |

Full field list: `id`, `url`, `platform`, `country`, `title`, `description`, `price`, `currency`, `priceLabel`, `priceNegotiable`, `priceType`, `categoryPath`, `section`, `city`, `postcode`, `images[]`, `isPromoted`, `isTop`, `views`, `postedDate`, `query`, `rank`, `source`, `scrapedAt`.

### Use cases

- **Resale and sourcing**: watch a keyword inside a radius around your town and get alerted when something cheap appears.
- **Price research**: pull a rubrika with parsed prices and view counts to see what sells and at what level in CZ/SK.
- **Car and property watching**: follow the `auto` or `reality` sections with price bounds and be notified on every price cut.

### How it works

Bazos serves plain HTML with no anti-bot wall, so the actor fetches search pages directly — no login, no cookies, no proxy. Pick a `site`, give keywords and optionally a `section`, a `location` with `radiusKm`, and price bounds; each query is paginated 20 ads per page until `maxPages` or `maxItems`. Prices written as text ("dohodou", "zdarma") are classified in `priceType` instead of being dropped. In `monitor` mode only new and re-priced ads are pushed, optionally summarised to a webhook or Telegram chat.

### Input

| Field | Meaning | Default |
|---|---|---|
| `site` | `cz`, `sk`, `pl` or `at` — one edition per run | `cz` |
| `queries` | Keywords, e.g. `["kolo"]`; each is paginated separately | `["kolo"]` |
| `section` | Bazos rubrika, e.g. `auto`, `reality`, `elektro`; `www` = all | `www` |
| `location` | Postcode or town for a radius search, e.g. `Praha` | — |
| `radiusKm` | Radius around `location` in km | `25` |
| `priceFrom` / `priceTo` | Price range in the site's currency, e.g. `1000` / `20000` | — |
| `sortBy` | `newest`, `price_asc`, `price_desc`, `views` | `newest` |
| `maxPages` | Pages per query, 20 ads each | `5` |
| `maxItems` | Stop after this many ads | `20` |
| `mode` | `scrape`, or `monitor` for new/changed only | `scrape` |
| `webhookUrl`, `telegramBotToken`, `telegramChatId` | Where monitor-mode change summaries are sent | — |

### Pricing

| Event | Price |
|---|---|
| result | $0.001 per listing ($1 per 1,000) |
| monitor-check | $0.005 per monitor run |
| change | $0.001 per new/changed listing |

Charged only for listings actually pushed — an empty run costs you nothing. No proxy needed.

### Why this actor

- All four Bazos editions behind one input, with the same schema for each.
- Free-text prices are classified (`priceType`) instead of thrown away, so "dohodou" ads stay usable.
- `views` and `isTop` are kept — Bazos publishes view counts, which is rare and makes demand measurable.
- Radius search by town or postcode, plus section and price filters.
- Monitor mode with new-ad and price-drop alerts, delivered by webhook or Telegram.

### Limits

- Listing detail pages are not opened: seller name and phone are not included (`url` leads to the ad).
- Bazos does not publish coordinates, so `lat` / `lon` stay empty; use `city` and `postcode` instead.
- One run covers one site; schedule one Task per country to cover all four.

### FAQ

**Can I monitor new listings for a search?** Yes. Save the input as a Task, set `mode: monitor` and schedule it — each run returns only ads that appeared or changed price since the previous run, and can POST a summary to `webhookUrl` or a Telegram chat.

**Which Bazos sites are supported?** bazos.cz (Czechia, CZK), bazos.sk (Slovakia, EUR), bazos.pl (Poland, PLN) and bazos.at (Austria, EUR). Pick one per run with the `site` field.

**Can I search only around my town?** Yes — set `location` to a town name or postcode and `radiusKm` to the distance, e.g. 25.

### Changelog

- 0.1: initial release.

***

If this actor saved you time, please leave a review on its Store page — it is the main way other buyers find it. Bug reports and field requests are welcome in the **Issues** tab.

# Actor input Schema

## `site` (type: `string`):

Which Bazos edition to search. Accepted codes: cz (bazos.cz, Czechia, CZK), sk (bazos.sk, Slovakia, EUR), pl (bazos.pl, Poland, PLN), at (bazos.at, Austria, EUR). One run covers one site. Example: "cz".

## `queries` (type: `array`):

Keywords to search, one string per phrase, each paginated separately. Example: \["kolo", "horske kolo"].

## `section` (type: `string`):

Bazos section (rubrika) to search inside; "www" searches all sections. Accepted values: www, auto, deti, dum, elektro, foto, hudba, knihy, mobil, motorky, nabytek, obleceni, pc, prace, reality, sluzby, sport, stroje, vstupenky, zvirata, ostatni. Example: "auto".

## `location` (type: `string`):

Postcode or town name for a radius search, as written on the site. Example: "Praha" or "11000". Optional; used together with radiusKm.

## `radiusKm` (type: `integer`):

Search radius around location, in kilometres. Example: 25. Ignored unless location is set.

## `priceFrom` (type: `integer`):

Minimum price, whole number in the site's currency (CZK on bazos.cz, EUR on bazos.sk and bazos.at, PLN on bazos.pl). Example: 1000. Optional.

## `priceTo` (type: `integer`):

Maximum price, whole number in the site's currency. Example: 20000. Optional.

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

Result order: newest (newest first), price\_asc (cheapest first), price\_desc, views (most viewed first). Example: "newest".

## `maxPages` (type: `integer`):

How many result pages to fetch per query, 20 ads per page. Example: 5.

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

Stop the run after this many ads; you are charged only for ads actually pushed. Example: 20.

## `mode` (type: `string`):

scrape = return all matching ads; monitor = return only ads that are new or changed price since the previous run of this saved Task. Example: "scrape".

## `monitorKey` (type: `string`):

Optional state key for monitor mode when the actor is started directly instead of from a saved Task; any stable string, e.g. "kolo-cz".

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

Optional HTTPS URL that receives a POST with the monitor-mode change summary (JSON). Example: "https://hooks.example.com/bazos".

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

Optional Telegram bot token used to send monitor-mode change summaries. Format: "123456789:AA...".

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

Optional Telegram chat id that receives monitor-mode summaries. Example: "-1001234567890".

## Actor input object example

```json
{
  "site": "cz",
  "queries": [
    "kolo"
  ],
  "section": "www",
  "radiusKm": 25,
  "sortBy": "newest",
  "maxPages": 5,
  "maxItems": 20,
  "mode": "scrape"
}
```

# Actor output Schema

## `results` (type: `string`):

All pushed rows (dataset, JSON)

## `resultsTable` (type: `string`):

Dataset in the Console viewer

## `runSummary` (type: `string`):

RUN\_SUMMARY record (pushed, skipped, emptyReason)

# 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 = {
    "site": "cz",
    "queries": [
        "kolo"
    ],
    "section": "www",
    "maxItems": 20,
    "mode": "scrape"
};

// Run the Actor and wait for it to finish
const run = await client.actor("datahamster/bazos-classifieds").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 = {
    "site": "cz",
    "queries": ["kolo"],
    "section": "www",
    "maxItems": 20,
    "mode": "scrape",
}

# Run the Actor and wait for it to finish
run = client.actor("datahamster/bazos-classifieds").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 '{
  "site": "cz",
  "queries": [
    "kolo"
  ],
  "section": "www",
  "maxItems": 20,
  "mode": "scrape"
}' |
apify call datahamster/bazos-classifieds --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datahamster/bazos-classifieds"
        }
    }
}
```

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/QSgVwyXrHHWEUqaH3/builds/OyhrNwxdX45ImhGCW/openapi.json
