# Kufar Scraper — Belarus Classified Ads, Prices & Sellers (`logiover/kufar-belarus-classifieds-scraper`) Actor

Scrape Kufar.by, Belarus's largest classifieds site. Extract title, description, price in both roubles and US dollars, category, region and address, seller type, listing date, photos and the per-category attribute set such as rooms, area, mileage or condition. No API key.

- **URL**: https://apify.com/logiover/kufar-belarus-classifieds-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

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/platform/actors/running/actors-in-store#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

## Kufar Scraper — Belarus Classified Ads, Prices & Sellers

Belarus's largest classifieds site in rows: every ad priced in both roubles and dollars, with its category attributes, seller type and exact address.

### What does the Kufar Scraper do?

This Actor collects live ads from **Kufar.by**, the marketplace Belarusians use for property, cars, phones and almost everything else. Kufar answers its own search endpoint with the ad objects its app renders, so this Actor reads structured records rather than parsing markup — which is why the per-category attribute set arrives intact: rooms and floor area on a flat, mileage and year on a car, condition on a phone.

Two prices come back on every row, and that is deliberate. Kufar publishes the Belarusian rouble figure alongside its own dollar conversion, and in a currency that moves, a dataset carrying only one of the two is hard to compare week to week. Pagination is a cursor rather than a page number, so the crawl follows the tokens the site hands back and stops when it stops offering one.

### Who is it for?

- **Resellers and arbitrage traders** watching Belarusian second-hand prices.
- **Property analysts** — the flats category alone carries over 25,000 live ads with rooms, area and address.
- **Market researchers** studying a market with almost no open data.
- **Lead-generation teams** using the business-versus-private seller split.
- **Automotive analysts** using the cars category, where mileage and year arrive as attributes.

### Use cases

- Track flat prices per district in Minsk, in both roubles and dollars, week over week.
- Split any category by business and private sellers to size the professional share.
- Watch the rouble-to-dollar gap on identical goods as an informal FX signal.
- Build a car price curve by year and mileage from the vehicles category.
- Monitor new ads in a category daily for sourcing.
- Feed an AI agent live Belarusian prices for valuation questions.

### Why use this Kufar Scraper?

- **Dual-currency pricing on every row** — the rouble figure and Kufar's own dollar conversion.
- **Per-category attributes preserved** — rooms, area, mileage, condition, whatever that category defines.
- **Cursor pagination followed properly**, so deep runs keep returning new ads.
- **19 verified categories**, from flats and cars to phones, furniture and animals.
- **Business-seller flag and seller ID** on every ad.
- **Keyless and login-free** — nothing to register, nothing to rotate.

### What data can you extract?

One row per ad. Anything the source left blank comes back as `null`.

| Field | Type | Description |
|---|---|---|
| `adId` | string | Kufar ad identifier |
| `url` | string | Direct link to the ad |
| `title` | string | Ad title |
| `description` | string | Ad description as published |
| `priceByn` | number | Price in Belarusian roubles |
| `priceUsd` | number | The same price in US dollars, as Kufar converts it |
| `category` | string | Category the ad sits in |
| `region` | string | Region (oblast) |
| `address` | string | Address the seller published |
| `sellerId` | number | Kufar account identifier |
| `isCompany` | boolean | True where the seller is a business |
| `phoneHidden` | boolean | Seller chose to hide their phone number |
| `listedAt` | string | When the ad was posted |
| `attributes` | string | Category attribute set, e.g. rooms, area, mileage, condition |
| `imageCount` | number | Number of photos |
| `imageUrl` | string | First photo |
| `scrapedAt` | string | When this row was collected |

#### Sample output

```json
{
  "adId": "1081237945",
  "url": "https://re.kufar.by/vi/1081237945",
  "title": "Долгосрочная аренда квартиры",
  "description": "Две комнаты в трёхкомнатной квартире, (третья комната закрыта, в ней никто не живет)",
  "priceByn": 1488.5,
  "priceUsd": 500,
  "category": "Квартиры",
  "region": "Минск",
  "address": "Жудро ул, 29, Минск",
  "sellerId": 415151,
  "isCompany": false,
  "phoneHidden": true,
  "listedAt": "2026-08-16T16:28:07Z",
  "attributes": "Количество спальных мест: 3 | Микрорайон: Раковское шоссе | Метро: Спортивная | Комнат: 2 | Общая площадь: ...",
  "imageCount": 9,
  "imageUrl": "https://rms.kufar.by/v1/gallery/adim1/88fd3dd4-f651-49cf-ad28-a9c663f3f83b.jpg",
  "scrapedAt": "2026-08-16T16:28:45.669Z"
}
```

### How to use the Kufar Scraper

#### Option A — a whole category

Pick a category such as flats, cars or phones, leave the keyword empty and set a result limit. Flats alone hold over 25,000 live ads.

#### Option B — a keyword inside a category

Add a search term, in Russian or Belarusian, to narrow a category — `iphone` inside phones, or `bmw` inside cars.

#### Option C — one region

Add a region code (7 is Minsk city) and a price band to isolate a local market segment, then schedule the run and diff between days.

### Input parameters

| Input | Type | Description |
|---|---|---|
| `category` | string | Kufar category to collect. Property and vehicle categories carry the richest attribute sets. Default: `"1010"`. |
| `query` | string | Optional search term applied inside the category, e.g. iphone or bmw. Russian and Belarusian both work. |
| `region` | string | Optional Kufar region code, e.g. 1 Brest, 2 Vitebsk, 3 Gomel, 4 Grodno, 5 Minsk region, 7 Minsk city. Leave empty for all of Belarus. |
| `priceMin` | integer | Optional lower price bound in Belarusian roubles. |
| `priceMax` | integer | Optional upper price bound in Belarusian roubles. |
| `maxResults` | integer | Stop after this many ads. Each request returns 43. Default: `1000`. |
| `proxyConfiguration` | object | Residential proxy pinned to Belarus. The search API is public but a Belarusian exit is the most reliable. |

### Tips for best results

- Prices arrive in kopecks and are converted to roubles here, so `priceByn` is already the number a Belarusian would quote.
- The `attributes` column is the richest field in the dataset and its contents change by category — parse it per category rather than expecting one shape.
- `isCompany` separates dealers from private sellers, which matters in cars and property more than anywhere else.
- Region codes are Kufar's own: 1 Brest, 2 Vitebsk, 3 Gomel, 4 Grodno, 5 Minsk region, 7 Minsk city.
- The address is the one the seller typed, so it is precise in property and vague in small goods.

### Integrations

Connect this Actor to Make, Zapier, n8n, Slack, Google Sheets, GitHub, Airtable or any HTTP endpoint through Apify integrations. Every finished run can push its dataset straight into your warehouse, or fire a webhook so a downstream job starts the moment the data lands.

### API usage

Run the Actor from your own code with the Apify API. Datasets can be exported as JSON, CSV, Excel, XML, RSS or HTML, and every run is available through the [Apify API reference](https://docs.apify.com/api/v2).

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~kufar-belarus-classifieds-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"input": {"category": "1010", "query": "", "maxResults": 1000, "proxyConfiguration": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "BY"}}}'
```

Python, JavaScript, PHP and CLI clients are documented under [Apify API clients](https://docs.apify.com/api/client).

### Use with AI agents (MCP)

This Actor is callable from any MCP-compatible client — Claude, Cursor, VS Code or your own agent — through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). An agent can call it to answer live questions about Belarusian second-hand prices, property listings and seller types instead of guessing from stale training data.

### FAQ

#### Do I need a Kufar account or API key?

No. The Actor reads public ads with no login and no key.

#### Why are there two prices?

Kufar publishes both the rouble price and its own dollar conversion, and Belarusians quote both. Keeping the pair makes comparisons across weeks meaningful when the exchange rate moves.

#### How many ads can one run return?

Flats alone report over 25,000. Each request returns 43 and the cursor keeps producing new ads, so the practical limit is the result cap you set.

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

No. Kufar keeps phone numbers behind its own flow; the Actor records whether the seller chose to hide theirs.

#### Which categories are supported?

19 verified ones: flats, rooms, houses, land, garages, commercial property, cars, parts, motorcycles, phones, computers, TV and audio, photo, furniture, appliances, clothing, children's goods, animals and services.

#### Is the data in Russian?

Yes. Titles, descriptions and attributes are published in Russian and collected as written.

#### Why did my run return zero ads?

Usually a keyword too rare for the category, or a price band that excludes everything. Clear the filters first.

#### What does the attributes column contain?

The label-and-value pairs the category defines — for a flat that is rooms, total area and district; for a car it is year, mileage and engine.

#### Can I export to CSV or Excel?

Yes. Every run's dataset exports as JSON, CSV, Excel, XML, RSS or HTML from the Storage tab, the API, or automatically through an integration.

#### How fresh is the data?

Every run reads the site live at that moment, so the data is as fresh as the site itself. Schedule the Actor hourly, daily or weekly to build a time series.

#### How often is the Actor updated?

It is monitored and fixed when the site changes its markup or its endpoints. Report anything that looks wrong through the Issues tab and it gets picked up.

### Is it legal to scrape Kufar?

This Actor collects only publicly available information — the same pages any visitor can open without logging in. It does not bypass a login, and it does not touch private or personal accounts. Public data collection is legal in most jurisdictions, but how you *use* the data is your responsibility: if any record contains personal data, GDPR and comparable laws still apply, and you need a lawful basis for processing it. When in doubt, take legal advice. See Apify's [ethical web scraping](https://blog.apify.com/what-is-ethical-web-scraping-and-how-do-you-do-it/) guide.

### Related scrapers

- [Onliner Scraper](https://apify.com/logiover/onliner-belarus-product-scraper) — Belarusian price comparison.
- [Avito.ru Scraper](https://apify.com/logiover/avito-ru-scraper) — Russian classifieds.
- [Kolesa.kz Scraper](https://apify.com/logiover/kolesa-kz-scraper) — Kazakh vehicle marketplace.
- [Rozetka Scraper](https://apify.com/logiover/rozetka-product-scraper) — Ukrainian e-commerce.
- [SS.lv Scraper](https://apify.com/logiover/ss-lv-scraper) — Latvian classifieds.

# Actor input Schema

## `category` (type: `string`):

Kufar category to collect. Property and vehicle categories carry the richest attribute sets.

## `query` (type: `string`):

Optional search term applied inside the category, e.g. iphone or bmw. Russian and Belarusian both work.

## `region` (type: `string`):

Optional Kufar region code, e.g. 1 Brest, 2 Vitebsk, 3 Gomel, 4 Grodno, 5 Minsk region, 7 Minsk city. Leave empty for all of Belarus.

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

Optional lower price bound in Belarusian roubles.

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

Optional upper price bound in Belarusian roubles.

## `maxResults` (type: `integer`):

Stop after this many ads. Each request returns 43.

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

Residential proxy pinned to Belarus. The search API is public but a Belarusian exit is the most reliable.

## Actor input object example

```json
{
  "category": "1010",
  "query": "iphone",
  "region": "7",
  "maxResults": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BY"
  }
}
```

# Actor output Schema

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

Every record collected in this run. Open the Dataset tab to browse, filter or export as JSON, CSV or Excel.

# 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 = {
    "category": "1010",
    "maxResults": 1000,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BY"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/kufar-belarus-classifieds-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 = {
    "category": "1010",
    "maxResults": 1000,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BY",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/kufar-belarus-classifieds-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 '{
  "category": "1010",
  "maxResults": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BY"
  }
}' |
apify call logiover/kufar-belarus-classifieds-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/kufar-belarus-classifieds-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/PxO1UwCEWmRVmhl12/builds/hERSETMvRdDnjag0d/openapi.json
