# Onliner Scraper — Belarus Product Catalogue & Prices (`logiover/onliner-belarus-product-scraper`) Actor

Scrape the Onliner.by product catalogue, Belarus's largest price comparison site. Extract product name, brand, minimum and maximum price in BYN, number of competing shop offers, discount, rating, review count, specifications and stock status. 27 categories. No API key.

- **URL**: https://apify.com/logiover/onliner-belarus-product-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** E-commerce
- **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

## Onliner Scraper — Belarus Product Catalogue, Prices & Reviews

What things actually cost in Belarus: the cheapest and dearest offer across every shop stocking a product, how many shops that is, the discount, and the rating buyers gave it.

### What does the Onliner Scraper do?

This Actor collects the product catalogue of **Onliner.by**, the price-comparison site at the centre of Belarusian online retail. Onliner is not a shop — it is the place shops list against each other — so each product carries a *price spread*: the minimum and maximum offer across the retailers stocking it, the number of competing offers, and the median of recent minimum prices. That spread is the reason to scrape it: it says what a product sells for in Belarus, not what one retailer wishes it did.

Pick one or more of the 27 catalogue sections, optionally add a keyword, and the Actor pages through them writing one flat row per product: name and brand, the full specification string, minimum and maximum price in BYN, competing offer count, sale flag and discount, the median price, star rating and review count, second-hand offers, monthly instalment and cashback, plus the product URL and photo.

### Who is it for?

- **Retail and e-commerce teams** benchmarking Belarusian shelf prices before entering or repricing.
- **Distributors and brand managers** watching how their products are priced by the shops that carry them.
- **Price-comparison and cashback services** seeding a catalogue with real spread data.
- **Market researchers** tracking inflation and availability in a market with little open data.
- **Consumer analysts** studying which categories carry the widest retail margins.

### Use cases

- Measure the spread between the cheapest and dearest offer per category — the widest spreads are the softest markets.
- Track a brand's average minimum price across phones, laptops and TVs month over month.
- Find products where the offer count collapsed — an early sign of a supply problem.
- Compare rating and review counts to see which products the market has actually adopted.
- Pull the discount and sale flags to build a promotions calendar for Belarusian retail.
- Feed an AI agent live catalogue prices so it can answer "what does a Xiaomi phone cost in Minsk?".

### Why use this Onliner Scraper?

- **Price spread, not a single price** — minimum, maximum, median and the number of competing shop offers.
- **27 verified catalogue sections**, from phones and laptops to fridges, kettles, watches and scooters.
- **Ratings and review counts** on a 5-point scale, converted from Onliner's internal 50-point score.
- **Instalment and cashback figures**, which is how a large share of Belarusian retail is actually paid for.
- **Keyless and login-free** — nothing to register, nothing to rotate.
- **Bulk by design** — 30 products per request across categories holding thousands of items each.

### What data can you extract?

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

| Field | Type | Description |
|---|---|---|
| `productId` | number | Onliner product identifier |
| `productKey` | string | Onliner product slug key |
| `url` | string | Direct link to the product page |
| `category` | string | Catalogue section requested |
| `categoryName` | string | Section name as Onliner labels it in Russian |
| `brand` | string | Manufacturer |
| `name` | string | Product name |
| `fullName` | string | Full name including the product-type prefix |
| `priceMin` | number | Cheapest offer across all shops, in BYN |
| `priceMax` | number | Dearest offer across all shops, in BYN |
| `currency` | string | Currency, normally BYN |
| `offerCount` | number | How many shops currently stock it |
| `isOnSale` | boolean | Onliner marks the product as discounted |
| `discount` | number | Discount size where one is flagged |
| `medianPrice` | number | Median of recent minimum prices |
| `rating` | number | Buyer rating out of 5 |
| `reviewCount` | number | Number of reviews |
| `status` | string | Catalogue status, e.g. active |
| `specs` | string | Full specification string |
| `shortSpecs` | string | Key specifications only |
| `secondHandOffers` | number | Number of used offers on Onliner's second-hand section |
| `secondHandMinPrice` | number | Cheapest used offer |
| `monthlyInstalment` | number | Monthly instalment Onliner advertises |
| `cashbackPercent` | number | Co-brand card cashback percentage |
| `imageUrl` | string | Product photo |
| `scrapedAt` | string | When this row was collected |

#### Sample output

```json
{
  "productId": 5159080,
  "productKey": "xi17tpro12512gdp",
  "url": "https://catalog.onliner.by/mobile/xiaomi/xi17tpro12512gdp",
  "category": "mobile",
  "categoryName": "Мобильные телефоны",
  "brand": "Xiaomi",
  "name": "17T Pro 12GB/512GB международная версия (темно-сиреневый)",
  "fullName": "Телефон Xiaomi 17T Pro 12GB/512GB международная версия (темно-сиреневый)",
  "priceMin": 2440,
  "priceMax": 4218.88,
  "currency": "BYN",
  "offerCount": 39,
  "isOnSale": false,
  "discount": 0,
  "medianPrice": 2460,
  "rating": 5,
  "reviewCount": 11,
  "status": "active",
  "specs": "Android, экран 6.83\" AMOLED (1280x2772) 144 Гц, Mediatek Dimensity 9500, ОЗУ 12 ГБ, память 512 ГБ, камера 5...",
  "shortSpecs": "ОЗУ 12 ГБ, флэш-память 512 ГБ",
  "secondHandOffers": 0,
  "secondHandMinPrice": null,
  "monthlyInstalment": 71.43,
  "cashbackPercent": 5,
  "imageUrl": "https://imgproxy.onliner.by/124LOPWHhaVeysEU-jQDmJhGIUXn0oRNMqOXg97Kkvs/w:170/h:250/z:2/f:jpg/aHR0cHM6Ly9jb...",
  "scrapedAt": "2026-08-15T07:46:00.186Z"
}
```

### How to use the Onliner Scraper

#### Option A — a whole category

Select one or more sections — mobile phones, laptops, TVs, fridges — leave the keyword empty and set a result limit. The largest sections hold thousands of products each.

#### Option B — one brand across categories

Select several categories and set the keyword to a brand, e.g. `samsung` or `xiaomi`. The keyword is applied inside each category, so one run returns that brand's whole footprint.

#### Option C — a price monitor

Pick the categories you sell into, schedule the Actor daily, and diff `priceMin` and `offerCount` between runs to catch repricing the day it happens.

### Input parameters

| Input | Type | Description |
|---|---|---|
| `categories` | array | Onliner catalogue sections to collect. Each is crawled as its own search, so several can be selected. Default: `["mobile"]`. |
| `query` | string | Optional keyword filter applied inside each selected category, e.g. xiaomi or samsung. Leave empty for the whole category. |
| `maxResults` | integer | Stop after this many products. Each request returns 30. Default: `1000`. |
| `proxyConfiguration` | object | Residential proxy pinned to Belarus. The catalogue is public, but a Belarusian exit is the most reliable. |

### Tips for best results

- Categories are crawled one at a time, so listing several is the way to build a broad dataset in a single run.
- `priceMin` and `priceMax` come from different shops. The gap, not the average, is the useful signal.
- `rating` is converted to a 5-point scale for readability; Onliner stores it internally out of 50.
- `secondHandMinPrice` is only filled where a used listing exists, which is a minority of products.
- Watch `status` — a product that leaves `active` has been discontinued or delisted, which is worth logging over time.

### 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~onliner-belarus-product-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"input": {"categories": ["mobile", "notebook"], "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 retail prices, product ratings and how many shops stock an item instead of guessing from stale training data.

### FAQ

#### Do I need an Onliner account or API key?

No. The catalogue is public and the Actor reads it without a login or key.

#### Which categories are supported?

27 verified sections: mobile phones, laptops, TVs, watches, headphones, fridges, kettles, fans, mice, dishwashers, heaters, hair dryers, batteries, SSDs, hard drives, graphics cards, CPUs, motherboards, smartwatches, irons, multicookers, soundbars, cookers, camera lenses, consoles, PC cases and scooters.

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

Watches alone hold over 30,000 and headphones over 11,000. Select several categories to build a dataset in the tens of thousands.

#### What currency are prices in?

BYN, the Belarusian rouble, as Onliner publishes them.

#### What is the difference between `priceMin` and `medianPrice`?

`priceMin` is the cheapest offer right now. `medianPrice` is the median of the recent minimums, so a `priceMin` well below it means a genuine promotion rather than the usual floor.

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

Usually a keyword that matches nothing inside the selected category. Clear the keyword to take the whole section.

#### Is the product data in Russian?

Yes — names, specifications and category labels are published in Russian, and are collected as written.

#### Why are some fields null?

Cashback, instalment and second-hand figures are optional; a product without them returns null rather than a zero, so the two cases stay distinguishable.

#### 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 Onliner?

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

- [Rozetka Scraper](https://apify.com/logiover/rozetka-product-scraper) — Ukrainian e-commerce prices.
- [eMAG Scraper](https://apify.com/logiover/emag-scraper) — Romanian and Bulgarian e-commerce.
- [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.
- [Takealot Scraper](https://apify.com/logiover/takealot-south-africa-scraper) — South African retail prices.

# Actor input Schema

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

Onliner catalogue sections to collect. Each is crawled as its own search, so several can be selected.

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

Optional keyword filter applied inside each selected category, e.g. xiaomi or samsung. Leave empty for the whole category.

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

Stop after this many products. Each request returns 30.

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

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

## Actor input object example

```json
{
  "categories": [
    "mobile"
  ],
  "query": "xiaomi",
  "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 = {
    "categories": [
        "mobile"
    ],
    "maxResults": 1000,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BY"
    }
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/onliner-belarus-product-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/9XPdXAwV4DldYP3jm/builds/4EoDAP9vfOOqwC22R/openapi.json
