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

Jobs from 🇷🇺 Rabota.ru, the leading job board in Russia — full ad text, pay, employer and location, in one flat record per job.

- **URL**: https://apify.com/serp.cheap.ofc/cheapest-rabota-ru-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 $4.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.ru Scraper

Every job on **Rabota.ru** 🇷🇺 (rabota.ru) — One of Russia's two big job boards, #17,363 on the web. Its listings are unusually complete: the ad body and the recruiter's own contact details come back on the search page.

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

### What you get

| Field | |
|---|---|
| `title` | Vacancy title |
| `description` | The full ad text as published |
| `company.name / industry / verified` | Employer, its industry, and whether the board verified it |
| `salary.min / max / currency` | Pay range as advertised |
| `location.address / lat / lng` | Workplace address and coordinates |
| `contact` | Recruiter name, e-mail and phone where the ad publishes them |
| `tags` | Badges such as Доступно для студентов |
| `published` | When the vacancy went up |

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.

Every search result already carries the **entire ad body and the recruiter's name, e-mail and phone**, plus the workplace address with coordinates.

### Modes

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

**`detail`** — paste Rabota.ru 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": "rabotaru",
  "country": "RU",
  "id": "54379317",
  "title": "Менеджер на выкладку товара",
  "url": "https://www.rabota.ru/vacancy/54379317/",
  "description": "Стабильная работа от 3500 рублей за смену + премии (без штрафов и …",
  "published": "2026-08-26T04:43:45.000Z",
  "updated": null,
  "company": {
    "id": "5114557",
    "name": "Хантелло",
    "industry": "HR / Кадры / Подбор персонала",
    "verified": true,
    "logo": null
  },
  "salary": {
    "min": 80001,
    "max": null,
    "currency": "руб./мес.",
    "period": null,
    "gross": null,
    "text": null
  },
  "location": {
    "country": "Russia",
    "region": "Москва",
    "city": "Москва",
    "district": null,
    "address": "г Москва, улица Бойцовая, д. 18 к. 5, 18",
    "lat": 55.813602,
    "lng": 37.723915
  },
  "category": null,
  "employmentType": null,
  "workSchedule": null,
  "seniority": null,
  "education": null,
  "tags": [
    "Доступно для студентов"
  ],
  "contact": {
    "name": "Менеджер по персоналу",
    "email": "docs@huntello.ru",
    "phones": [
      "+7 933 3993725"
    ]
  }
}
```

### Pricing

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

- **$0.004** per job from a search page
- **$0.006** 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. "менеджер по продажам" (sales manager). Leave empty to list the newest jobs.

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

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

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

The search listing already carries the entire ad and the recruiter contacts, so opening each job page is rarely worth the extra charge. 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-ru-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-ru-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-ru-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-ru-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/ywg8G47YkGJAiJufe/builds/WKngq210B33f1EXsJ/openapi.json
