# Bazar.sk Scraper — Slovak classifieds, every category (`richardsolar/bazar-sk-scraper`) Actor

Scrape bazar.sk, Slovakia's general classifieds site. Keyword, any of 650 categories, location and radius, price, advert type, condition and seller type, filtered by the site. Prices, towns, seller profiles, photos, promoted flags and an incremental mode for new adverts. From $1 per 1000 adverts.

- **URL**: https://apify.com/richardsolar/bazar-sk-scraper.md
- **Developed by:** [Richard Solar](https://apify.com/richardsolar) (community)
- **Categories:** E-commerce, Lead generation, Real estate
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 advert (basic)s

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

Bazar.sk Scraper extracts classified adverts from **bazar.sk**, Slovakia's general classifieds site — around 400,000 live adverts across cars, real estate, phones, electronics, furniture, animals, services and everything else.

Search the way the site itself does. Keyword, category, location and radius, price range, advert type, condition, seller type and sort order all go to the server, so you fetch what you asked for rather than filtering a firehose afterwards.

No account, no cookies, no setup.

### Why this one

- **Every filter the site has.** All 19 sections and 631 subcategories, location with a radius, price range, sell / wanted / give-away, used / new, private / company, and four sort orders — all applied by the site.
- **Promoted adverts are flagged.** Paid TOP adverts are pinned to the top of every results page. `isPromoted` marks them, and `excludePromoted` drops them.
- **Monitoring built in.** A scheduled run returns only adverts posted since the last one.
- **The run tells you when it breaks.** Every field has an expected fill rate. If the site changes its markup, the run says which fields stopped filling instead of quietly returning empty columns.

### How much does it cost?

You pay per advert returned. Proxy traffic and compute are included.

| Mode                   | Price            | What you get                                                                                     |
| ---------------------- | ---------------- | ------------------------------------------------------------------------------------------------ |
| `scrapeDetails: false` | **$1 per 1,000** | Title, short text, price, town, advert type, category, thumbnail, promoted flag                  |
| `scrapeDetails: true`  | **$4 per 1,000** | Everything — full description, posting date, condition, category attributes, seller, every photo |

bazar.sk refuses connections from datacenter addresses, so every request goes through Apify's residential proxy, which is billed by traffic. List-only mode reads one results page per 32 adverts; details mode opens every advert as well, which is why it costs four times as much. Use list-only mode when title, price, town, type and thumbnail are enough.

`maxItems` is enforced as adverts are collected, not trimmed afterwards, so the Actor never returns — or bills — more than you asked for.

### Input examples

**Everything in one subcategory**

```json
{
  "categories": ["mobily/apple-iphone"],
  "maxItems": 200
}
```

**A keyword in several categories, cheapest first, with a price range**

```json
{
  "keywords": ["iphone 15"],
  "categories": ["mobily", "elektro"],
  "priceMin": 200,
  "priceMax": 600,
  "sortBy": "cheapest",
  "maxItems": 100
}
```

**Used items from private sellers within 30 km of Košice**

```json
{
  "categories": ["sport/cyklistika"],
  "location": "t2970",
  "distanceKm": 30,
  "condition": "used",
  "sellerType": "private"
}
```

**Specific adverts or results pages**

```json
{
  "startUrls": [
    { "url": "https://mobily.bazar.sk/39721967-iphone-15-256gb/" },
    { "url": "https://reality.bazar.sk/byty/predaj/?p[param4]=3" }
  ]
}
```

A results-page URL is paged by extending itself, so every filter in it is kept.

### Monitoring: only what is new

Turn on `monitorMode` and schedule the run. The Actor remembers every advert it has returned in a named key-value store and skips those next time — they are not opened and not charged.

- `monitorStoreName` — leave empty for one store named after the Actor. Give two schedules two names when they watch different searches, or each will hide the other's adverts.
- `monitorRetentionDays` — how long an id is remembered (default 90), so the store does not grow forever.

### Output example

```json
{
  "listingId": "39721967",
  "url": "https://mobily.bazar.sk/39721967-iphone-15-256gb/",
  "categoryMain": "mobily",
  "categorySlug": "apple-iphone",
  "categoryLabel": "Apple iPhone",
  "categoryPath": "Mobily › Apple iPhone",
  "title": "Iphone 15 256GB",
  "description": "Predám iPhone 15 v kapacite 256 GB\n\nSom jeho prvý a jediný majiteľ. …",
  "offerType": "sell",
  "offerTypeText": "predaj",
  "condition": "used",
  "price": 380,
  "priceText": "380 €",
  "city": "Bratislava III - Nové Mesto",
  "locationCode": "t10",
  "isPromoted": false,
  "isCompany": false,
  "sellerName": "Katarina",
  "sellerId": "6430663639376432…",
  "sellerUrl": "https://www.bazar.sk/inzerent/6430663639376432…/",
  "sellerRating": "Nehodnotený",
  "sellerMemberSince": "2026-10",
  "sellerAdCount": 1,
  "publishedAt": "2026-10-01",
  "attributes": {},
  "mainImage": "https://img.unitedclassifieds.sk/foto/…",
  "photoCount": 4,
  "galleryUrl": "https://www.bazar.sk/foto/iphone-15-256gb/39721967/#foto-1",
  "sourceUrl": "https://mobily.bazar.sk/39721967-iphone-15-256gb/",
  "scrapedAt": "2026-10-07T17:49:44.323Z"
}
```

### What can you use it for?

- **Price research** — what used phones, cars or flats actually ask for, by region and condition.
- **Deal alerts** — a scheduled monitor run on a narrow search delivers only new adverts.
- **Market analysis** — supply by category and town, private sellers against companies.

### Tips

#### Scope to a category

A keyword search across the whole site returns adverts from every section, and promoted adverts from anywhere. Picking a category is the cheapest way to cut irrelevant results.

#### Location codes

The site identifies places by its own codes: `t` and a number for a town, `d` and a number for a district. Pick the place on bazar.sk and copy the `p[location]` value from the address bar. Every row carries its town's code in `locationCode`, so one run also teaches you the codes.

#### Advert types

`sell`, `buy` and `giveaway` filter on the site, within a category — the site has no advert-type filter across the whole site, so `offerType` needs at least one category. Real estate also has rentals and services have offers; those come back as `rent` and `offer` in `offerType` and are included under "All types".

#### Category attributes

Many categories add their own details — a bicycle's type and brand, a car's model. In detail mode they come back in `attributes`, keyed by the site's Slovak label: `{ "Druh": "Bicykle", "Značka": "Author" }`.

#### Proxy

Keep the default — Apify Proxy, group RESIDENTIAL, country SK. bazar.sk drops connections from datacenter addresses, Apify's datacenter proxy included, so any other setting fails every request.

### FAQ

#### Can I get the seller's phone number?

No. bazar.sk serves phone numbers as images, deliberately, to stop them being harvested. You get the seller's name as displayed, profile URL, rating, join month and how many adverts they have live.

#### Why is `price` sometimes null?

Because the advert says "dohodou" — price by agreement — rather than a number. `priceText` keeps the label so you can tell that apart from a missing value.

#### Why does `images` hold only one photo?

A results row shows one photo (a promoted row three) and a detail page one; the full gallery is a separate page per advert. `photoCount` says how many there are and `galleryUrl` links to them. Photo URLs are signed and may stop working after a while — download them if you need to keep them.

#### Is `publishedAt` accurate?

To the day. The site prints a date and no time. It only appears in detail mode.

#### Why can't I pick the jobs section?

Its results pages use a different layout from the rest of the site, which this Actor does not read yet.

#### Is scraping this legal?

Scraping publicly available data is generally legal, but this Actor collects personal data such as seller names. You are responsible for having a lawful basis to process it under GDPR, and for complying with the site's terms. If you are unsure, take legal advice — and consider turning listing details off if you only need prices.

#### Something looks wrong

Report it on the **Issues** tab. The repository checks the live site daily, so markup changes are usually caught before users notice.

# Actor input Schema

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

Search terms. Each one runs as its own search and they share the listing cap. Leave empty to browse a category, or everything.

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

What to search. Pick a whole category, or one of its subcategories — the categories are listed first, then every subcategory as `Category › Subcategory`. A value is the category key on its own, or `category/subcategory` for one level down: `mobily` for all of Mobily, `mobily/apple-iphone` for Mobily › Apple iPhone. Each choice runs as its own search and they share the listing cap. Leave empty to search everything. The jobs section is not supported.

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

The site's own location code: `t` plus a number for a town, `d` plus a number for a district, `c1` for all of Slovakia. Pick the place on bazar.sk and copy the `p[location]` value from the address bar — `t2970` is Košice. Leave empty for everywhere.

## `distanceKm` (type: `integer`):

Distance around the location. Only used together with a location. 0 leaves it to the site.

## `priceMin` (type: `integer`):

Applied by the site, as its own price filter does.

## `priceMax` (type: `integer`):

Applied by the site. A maximum below the minimum fails the run rather than returning an empty dataset.

## `offerType` (type: `string`):

Whether the advert sells, asks to buy, or gives something away. Needs at least one category — bazar.sk filters advert type only within a category, and the run fails rather than return unfiltered rows. Real estate and services use further types of their own (rent, offer); those are returned under "All types".

## `condition` (type: `string`):

Used or new, as the seller declared it.

## `sellerType` (type: `string`):

Private sellers, companies, or both.

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

Applied by the site, not afterwards.

## `excludePromoted` (type: `boolean`):

Paid adverts are pinned to the top of every results page. They are always flagged as isPromoted; turn this on to drop them entirely.

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

Hard cap on listings returned, shared across every keyword and category. Enforced as listings are collected, so you are never billed for overshoot.

## `maxPagesPerSearch` (type: `integer`):

0 means no limit. Each page holds 32 listings.

## `scrapeDetails` (type: `boolean`):

Adds the full description, posting date, condition, category path, the seller's name, rating and join date, and the photo count. Results pages already carry the title, price, town, advert type and thumbnail, and list-only runs use about 30x fewer requests.

## `monitorMode` (type: `boolean`):

Skip listings an earlier run already returned. Skipped listings are not opened and not charged. Leave off for one-off runs.

## `monitorStoreName` (type: `string`):

Named key-value store holding the ids already returned. Leave empty to use one named after the Actor. Give two schedules two different names when they watch different searches, or each will hide the other’s listings.

## `monitorRetentionDays` (type: `integer`):

How long an id stays remembered. Older ids are dropped, so the store does not grow forever.

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

Listing or results-page URLs to scrape directly. Passing these replaces the generated search unless you also give a keyword or category.

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

bazar.sk drops connections from datacenter addresses, Apify's datacenter proxy included. Keep the residential group with country SK; with anything else every request fails.

## `minCleanFieldRatio` (type: `number`):

Advanced. Every field has an expected fill rate; the run warns and names any field that drops below its own. Leave at 1 and the run only warns. Lower it to fail the run when more than this fraction of fields are affected.

## Actor input object example

```json
{
  "keywords": [
    "iphone"
  ],
  "categories": [
    "mobily/apple-iphone"
  ],
  "location": "",
  "distanceKm": 0,
  "offerType": "all",
  "condition": "all",
  "sellerType": "all",
  "sortBy": "newest",
  "excludePromoted": false,
  "maxItems": 20,
  "maxPagesPerSearch": 0,
  "scrapeDetails": true,
  "monitorMode": false,
  "monitorStoreName": "",
  "monitorRetentionDays": 90,
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "SK"
  },
  "minCleanFieldRatio": 1
}
```

# Actor output Schema

## `results` (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 = {
    "keywords": [
        "iphone"
    ],
    "categories": [
        "mobily/apple-iphone"
    ],
    "offerType": "all",
    "sortBy": "newest",
    "maxItems": 20,
    "scrapeDetails": true,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "SK"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("richardsolar/bazar-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 = {
    "keywords": ["iphone"],
    "categories": ["mobily/apple-iphone"],
    "offerType": "all",
    "sortBy": "newest",
    "maxItems": 20,
    "scrapeDetails": True,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "SK",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("richardsolar/bazar-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 '{
  "keywords": [
    "iphone"
  ],
  "categories": [
    "mobily/apple-iphone"
  ],
  "offerType": "all",
  "sortBy": "newest",
  "maxItems": 20,
  "scrapeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "SK"
  }
}' |
apify call richardsolar/bazar-sk-scraper --silent --output-dataset

```

## MCP server setup

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