# Cheapest Rabota.by Scraper (`serp.cheap.ofc/cheapest-rabota-by-scraper`) Actor

Jobs from 🇧🇾 Rabota.by, the leading job board in Belarus — full ad text, pay, employer and location, in one flat record per job.

- **URL**: https://apify.com/serp.cheap.ofc/cheapest-rabota-by-scraper.md
- **Developed by:** [serp.cheap](https://apify.com/serp.cheap.ofc) (community)
- **Categories:** Jobs, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 job from searches

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?

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

## Cheapest Rabota.by Scraper

Every job on **Rabota.by** 🇧🇾 (rabota.by) — Belarus's dominant job board, #33,238 on the web. Search is pinned to Belarus, so you never get cross-border vacancies mixed into the results.

**No other actor on the Apify Store scrapes this board.**

### What you get

| Field | |
|---|---|
| `title` | Vacancy title |
| `salary.min / max / currency / gross` | Pay range, with gross-or-net stated rather than guessed |
| `company.name / website / verified` | Employer, its site, and whether the board verified it |
| `location.address / lat / lng` | Workplace address and coordinates |
| `employmentType / workSchedule` | Full/part time and the working pattern |
| `seniority` | Required experience band |
| `responses` | How many people have already applied |
| `published / updated` | When it went up and when it last changed |

Fields the board does not publish come back as `null` rather than being dropped, so a dataset you
append to keeps the same shape run after run.

The search result is a rich card — pay range with gross/net flagged, employer, area, address with coordinates, work format and experience band. Turn on **Open every job page** when you also need the full ad body.

### Modes

**`search`** — give a keyword in Russian (e.g. `менеджер` — manager) or leave it empty for the
newest jobs. Set **Max items** to how many you want back.

**`detail`** — paste Rabota.by job page URLs and get the full record for each.

**`selftest`** — free health check: one search page, reporting how many jobs parsed. Run it before a
big job if you want to be sure nothing has changed upstream.

### Output

One flat record per job:

```json
{
  "site": "rabotaby",
  "country": "BY",
  "id": "137002212",
  "title": "Менеджер по продажам",
  "url": "https://rabota.by/vacancy/137002212",
  "originUrl": "https://rabota.by/vacancy/137002212",
  "description": null,
  "published": "2026-09-04T12:59:58.027Z",
  "updated": "2026-09-04T14:48:53.939Z",
  "company": {
    "id": "1011663",
    "name": "Топикс Агро",
    "website": "http://www.topixagro.com",
    "verified": true
  },
  "salary": {
    "min": 1500,
    "max": 6000,
    "currency": "BYR",
    "period": "MONTH",
    "gross": false,
    "text": null
  },
  "location": {
    "country": null,
    "region": "Минск",
    "city": "деревня Тарасово",
    "district": null,
    "address": "деревня Тарасово, Центральная улица, 16",
    "lat": 53.920969,
    "lng": 27.390972
  },
  "category": null,
  "employmentType": "FULL",
  "workSchedule": "fullDay",
  "seniority": "between1And3",
  "education": null,
  "tags": [],
  "responses": 12,
  "keySkills": []
}
```

### Pricing

Pay per job. **No start fee**, no monthly subscription.

- **$0.002** per job from a search page
- **$0.004** per job page opened on its own (`detail` mode, or **Open every job page**)
- `selftest` is free, and a run that is blocked or finds nothing is never charged

See [PRICING.md](PRICING.md) for how that compares to what other job-board scrapers charge.

#### Free-call limit

Requests that return no billable job — a blocked page, a search that matches nothing, a vacancy that has been closed,
and the whole free `selftest` mode — are capped at **300 per run**. Requests that do return jobs you
are charged for never count against it, so a normal run of any size does not come close to the limit.
If a run does reach it, it stops there, keeps and charges everything it had already collected, and
says so in the log.

# Actor input Schema

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

'search' = list jobs by keyword. 'detail' = full job page for URLs you already have. 'selftest' = free health check.

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

Free-text search (job title, role, skill) in Russian — e.g. "менеджер" (manager). Leave empty to list the newest jobs.

## `detailUrls` (type: `array`):

For 'detail' mode: full Rabota.by job page URLs.

## `detailFollow` (type: `boolean`):

The search listing is a card — pay, employer, area, skills. Turn this on when you need the full ad body and the employer block. Costs one detail charge per job.

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

Cap on jobs returned.

## `concurrency` (type: `integer`):

How many search pages to fetch at once. 4 is a good balance; lower it to 1 if the board starts rate-limiting you.

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

Leave the default. The run only reaches for a residential address on the requests that need one.

## `debug` (type: `boolean`):

Verbose per-request logging for troubleshooting.

## Actor input object example

```json
{
  "mode": "search",
  "query": "менеджер",
  "detailFollow": false,
  "maxItems": 100,
  "concurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "debug": false
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `health` (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 = {
    "query": "менеджер"
};

// Run the Actor and wait for it to finish
const run = await client.actor("serp.cheap.ofc/cheapest-rabota-by-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 = { "query": "менеджер" }

# Run the Actor and wait for it to finish
run = client.actor("serp.cheap.ofc/cheapest-rabota-by-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 '{
  "query": "менеджер"
}' |
apify call serp.cheap.ofc/cheapest-rabota-by-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,serp.cheap.ofc/cheapest-rabota-by-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/fqf23WKH5n2aOtBuN/builds/aRFhcrpfSXaTnjsgh/openapi.json
