# Bazos.cz / Bazos.sk / Bazos.at / Bazos.pl Scraper (`crawlerbros/bazos-scraper`) Actor

Search the Bazos classifieds marketplace across CZ (bazos.cz), SK (bazos.sk), AT (bazos.at), and PL (bazos.pl) by keyword. Extract title, price + currency (CZK/EUR/PLN), locality, posted date, listing URL, thumbnail, category, description length. Optional minPrice/maxPrice filter.

- **URL**: https://apify.com/crawlerbros/bazos-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 19 total users, 2 monthly users, 60.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

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

Search the [Bazos](https://www.bazos.cz/) classifieds marketplace by keyword and extract every matching listing — title, price, locality, description, photos, and direct listing URL. Supports the Czech (`bazos.cz`), Slovak (`bazos.sk`), Austrian (`bazos.at`), and Polish (`bazos.pl`) variants. HTTP-only — no proxy, no login, no API key.

### What it does

You provide one or more search keywords; the actor runs each as a search on Bazos and returns deduplicated listings across all of them. Per listing it captures:

- **Title** — the headline of the ad
- **Price** — parsed numeric value + currency (CZK or EUR)
- **Locality** — city / district where the seller is based
- **Posted date** — the human-readable date Bazos shows on the listing
- **Description** — the snippet shown on the search-results card
- **Category** — auto-detected from the URL subdomain (`auto`, `mobil`, `reality`, `prace`, `elektro`, …)
- **Listing URL** — direct link to the full ad
- **Thumbnail** — first photo from the listing card

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `keywords` | array of strings (required) | `["iphone"]` | One or more search terms. Each runs as a separate Bazos search; results are deduped by listing URL across keywords. |
| `countryVariant` | enum: `CZ` / `SK` / `AT` / `PL` | `CZ` | Which Bazos to query. CZ → bazos.cz (CZK), SK → bazos.sk (EUR), AT → bazos.at (EUR), PL → bazos.pl (PLN). |
| `maxItems` | integer | `50` (1–1000) | Hard cap on total unique listings emitted across all keywords. |
| `maxPagesPerKeyword` | integer | `5` (1–50) | Per-keyword pagination cap. Each Bazos result page has ~20 listings. |
| `minPrice` | integer (optional) | – | Drop listings priced below this number (client-side filter). Listings without a parsed price are kept. |
| `maxPrice` | integer (optional) | – | Drop listings priced above this number. Listings without a parsed price are kept. |

#### Example input

```json
{
  "keywords": ["iphone 15", "macbook pro"],
  "countryVariant": "CZ",
  "maxItems": 100,
  "maxPagesPerKeyword": 5
}
```

### Output

One record per unique listing. Empty fields are omitted (no nulls).

```json
{
  "title": "iPhone 15 Pro 256GB Titanium",
  "description": "Záruka 2 roky, top stav, originální balení.",
  "descriptionLength": 41,
  "price": 24500,
  "currency": "CZK",
  "locality": "Praha 5",
  "postedText": "15.4. 2024",
  "category": "mobil",
  "listingId": "217954459",
  "listingUrl": "https://mobil.bazos.cz/inzerat/217954459/apple-iphone-15-plus-256gb-black.php",
  "thumbnailUrl": "https://mobil.bazos.cz/img/217954459-thumb.jpg",
  "countryVariant": "CZ",
  "matchedKeyword": "iphone 15",
  "scrapedAt": "2024-12-16T14:23:11+00:00"
}
```

#### Output fields

- **`title`** — headline of the ad.
- **`description`** — snippet shown on the search-results card (Bazos shows the first ~150 characters of the listing body).
- **`descriptionLength`** — derived character count of `description` (handy for filtering out near-empty listings).
- **`price`** — integer amount; absent when the seller selected "Dohodou" (negotiable) or "Zdarma" (free).
- **`currency`** — `"CZK"` for bazos.cz, `"EUR"` for bazos.sk and bazos.at, `"PLN"` for bazos.pl; absent when `price` is absent.
- **`locality`** — seller's city / district as shown on Bazos.
- **`postedText`** — Bazos's human-readable post date (e.g. `"15.4. 2024"`).
- **`category`** — Bazos's subdomain category: `auto`, `mobil`, `reality`, `prace`, `elektro`, `dum`, `hudba`, etc. Derived from the listing URL.
- **`listingId`** — Bazos's stable numeric ID for the listing.
- **`listingUrl`** — direct URL of the full ad.
- **`thumbnailUrl`** — first photo from the listing card (when present).
- **`countryVariant`** — `"CZ"`, `"SK"`, `"AT"`, or `"PL"`, matching the input.
- **`matchedKeyword`** — the search term that surfaced this listing.
- **`scrapedAt`** — ISO-8601 timestamp of extraction.

### Use cases

- **Lead generation** — track second-hand iPhone / car / property listings as they appear.
- **Price intelligence** — monitor average asking prices for a category across a marketplace.
- **Inventory enrichment** — populate a price-comparison or aggregator with Bazos's reach across CZ and SK.
- **Reseller research** — find listings whose locality matches your operating area.

### FAQ

**Does it need cookies, login, or proxy?**
No. Bazos search results are public; the actor uses a Chrome User-Agent and connects directly.

**How does pagination work?**
Bazos serves ~20 listings per page using a `crz` offset (page 2 = `crz=20`, page 3 = `crz=40`, etc.). The actor walks pages 1 through `maxPagesPerKeyword` for each keyword, stopping early if a page returns no new listings.

**What if my keyword has no results?**
The actor emits a single record `{"type": "bazos_scraper_error", "reason": "no_listings_found"}` and the run completes successfully (empty datasets aren't treated as failures). Try a broader keyword or switch the country variant.

**Can I search multiple Bazos variants in one run?**
Run the actor once per variant (CZ / SK / AT / PL). The data shapes are identical; you can merge the resulting datasets in your pipeline.

**Why are some listings missing prices?**
Bazos lets sellers list "Dohodou" (price negotiable) or "Zdarma" (free) instead of a number. In those cases `price` and `currency` are omitted from the record (per the omit-empty contract).

**Why don't I see the seller's phone number?**
Bazos requires a click-through and a CAPTCHA-like reveal step on the detail page; this scraper only walks the search-results page, which is fast and reliable. Contact details are out of scope.

# Actor input Schema

## `keywords` (type: `array`):

One or more keywords to search Bazos for. Each keyword runs as an independent search; results are deduplicated by listing URL across keywords.

## `countryVariant` (type: `string`):

Which Bazos to search. CZ = bazos.cz (Czech, prices in CZK). SK = bazos.sk (Slovak, prices in EUR).

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

Drop listings with parsed price below this. Listings without a price (Dohodou, Zdarma) are kept regardless. Currency follows countryVariant.

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

Drop listings with parsed price above this. Listings without a price are kept regardless.

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

Hard cap on the total number of unique listings emitted across all keywords. Bazos returns ~21 listings per page; the actor paginates as needed.

## `maxPagesPerKeyword` (type: `integer`):

Per-keyword pagination cap. Each Bazos result page has ~21 listings. Increase if you need deep results for popular queries.

## Actor input object example

```json
{
  "keywords": [
    "iphone"
  ],
  "countryVariant": "CZ",
  "maxItems": 50,
  "maxPagesPerKeyword": 5
}
```

# 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 = {
    "keywords": [
        "iphone"
    ],
    "countryVariant": "CZ",
    "maxItems": 50,
    "maxPagesPerKeyword": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/bazos-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 = {
    "keywords": ["iphone"],
    "countryVariant": "CZ",
    "maxItems": 50,
    "maxPagesPerKeyword": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/bazos-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 '{
  "keywords": [
    "iphone"
  ],
  "countryVariant": "CZ",
  "maxItems": 50,
  "maxPagesPerKeyword": 5
}' |
apify call crawlerbros/bazos-scraper --silent --output-dataset

```

## MCP server setup

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