# Russia Jobs Feed Вакансии: hh.ru, Habr Career, Rabota.ru & More (`getascraper/russia-jobs-feed`) Actor

Russian job vacancies (вакансии) from hh.ru, Habr Career (Хабр Карьера), Rabota.ru, Работа России (Trudvsem) and Zarplata.ru in one feed. Same fields from every board: RUB pay with the gross or net flag, 85 regions, metro, duplicate groups, and new, updated or closed jobs on each scheduled run.

- **URL**: https://apify.com/getascraper/russia-jobs-feed.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.12 / 1,000 job postings

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/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

## 🇷🇺 Russia Jobs Feed Вакансии: hh.ru, Habr Career, Rabota.ru & More

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;margin-bottom:0">
<tr>
<td style="padding:24px 28px;background:#FCEFF1;color:#1C1917;border:1px solid #F3C3CB;border-top:4px solid #C8102E;border-radius:10px 10px 0 0">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Five Russian job boards. One clean feed.</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Search hh.ru, Хабр Карьера, Работа.ру, Работа России and Зарплата.ру in one run. Every job comes back in the same format, with rouble pay, the employer's own gross or net flag, region and metro, and what changed since your last run.</span>
</td>
</tr>
</table>
<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;margin-top:0">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;color:#1C1917;border:1px solid #F3C3CB;border-top:none;border-radius:0 0 0 10px;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#8A0B20">🗂️ One format</span><br><span style="font-size:12px;color:#57534E">Same fields from every board, so you sort and compare without cleanup.</span></td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;color:#1C1917;border:1px solid #F3C3CB;border-top:none;border-left:none;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#8A0B20">💰 Gross or net, stated</span><br><span style="font-size:12px;color:#57534E">До вычета налогов or на руки, only when the employer says so.</span></td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;color:#1C1917;border:1px solid #F3C3CB;border-top:none;border-left:none;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#8A0B20">🔔 What changed</span><br><span style="font-size:12px;color:#57534E">New, updated and closed jobs between scheduled runs.</span></td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;color:#1C1917;border:1px solid #F3C3CB;border-top:none;border-left:none;border-radius:0 0 10px 0;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#8A0B20">🧬 One row per job</span><br><span style="font-size:12px;color:#57534E">The same job on two boards shares a group id, or keep just one copy.</span></td>
</tr>
</table>

Recruiters and analysts who follow the Russian job market usually open one board at a time and then line up pay, places and titles by hand. This feed reads hh.ru (HeadHunter), Хабр Карьера (Habr Career), Работа.ру (Rabota.ru), Работа России (the government job portal) and Зарплата.ру (Zarplata.ru) in a single run. It applies the same filters to all of them and returns one table you can sort, export or schedule.

### 🔎 What does Russia Jobs Feed do?

You give it keywords, cities or regions, and filters. It searches every board you select, turns what each board publishes into the same fields, and marks which rows are new since your last run. Russian and English keywords both work. Nothing is guessed: if a board does not publish a value, the field is left out.

| Board | Strongest for | Good to know |
| --- | --- | --- |
| hh.ru HeadHunter | The largest general board: every industry, every region | Pay with the employer's gross or net flag, metro, work format, schedule, employer rating and reviews. Shows at most 2,000 jobs per search, so very wide searches are best narrowed by keyword or region. On by default. |
| Habr Career Хабр Карьера | IT jobs: developers, QA, analysts, DevOps, designers | Skills, seniority (Junior to Lead) and specialisation on every job. Few jobs publish pay; Habr's own pay estimate is kept apart and labelled as an estimate. On by default. |
| Rabota.ru Работа.ру | Mass-market and blue-collar jobs: drivers, warehouse, retail, sales | Pay on most jobs, often with a gross or net flag. Searches one city at a time (Moscow, Saint Petersburg, Moscow and Leningrad regions and 14 large cities). |
| Работа России Trudvsem | The government portal, strong in the regions and the public sector | Pay on almost every job. The slowest board: each page of results takes several seconds. |
| Zarplata.ru Зарплата.ру | Extra regional listings | Most of its jobs are the same hh.ru postings. With hh.ru also selected, only the jobs posted on Zarplata.ru itself are delivered, so nothing comes twice. |

hh.ru and Habr Career are selected by default. Add Rabota.ru, Работа России and Zarplata.ru under Job boards when you need them.

### 🎯 Who uses it

- **I am a recruiter** sourcing Python and Java developers in Moscow and Kazan, comparing what employers offer on hh.ru and Habr Career in one table.
- **I am a compensation analyst** benchmarking rouble pay by region and role, and I need to know which figures are before tax and which are take-home.
- **I am a labour-market researcher** tracking how many jobs open and close each week, by region and federal district, with scheduled runs.
- **I run an HR team at a company with Russian offices** and watch what local competitors advertise for the roles we hire.
- **I build job data pipelines** and want one stable row format and a group id that stops one posting from showing up twice.

### 🚀 How it works

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0">
<tr>
<td style="padding:16px 14px;width:33%;background:#FCEFF1;color:#1C1917;border:1px solid #F3C3CB;border-radius:10px 0 0 10px;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#C8102E;letter-spacing:1px">STEP 1</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Pick boards and a search</span><br><span style="font-size:12px;color:#57534E">Choose boards, keywords, cities and filters, or paste a board link.</span></td>
<td style="padding:16px 14px;width:33%;background:#FCEFF1;color:#1C1917;border:1px solid #F3C3CB;border-left:none;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#C8102E;letter-spacing:1px">STEP 2</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Get one table</span><br><span style="font-size:12px;color:#57534E">Every row has the same fields, whichever board it came from.</span></td>
<td style="padding:16px 14px;width:33%;background:#FCEFF1;color:#1C1917;border:1px solid #F3C3CB;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#C8102E;letter-spacing:1px">STEP 3</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Schedule it</span><br><span style="font-size:12px;color:#57534E">Name a monitor and each run flags new, updated and closed jobs.</span></td>
</tr>
</table>

Start small. The default search (hh.ru and Habr Career, Python, Moscow, 25 rows) finishes in seconds. Raise the limits once the rows look right.

#### Places

Enter cities or regions in Russian or English: Moscow, Санкт-Петербург, Казань, Татарстан, Свердловская область, Подмосковье. All 85 federal subjects and about 170 cities are known. Every row gets its region in Russian and English, the region code and the federal district. Enter Remote for remote jobs, or Russia (or leave the list empty) for the whole country. An unknown place is reported with suggestions and never widened to the whole country.

#### Pay you can compare

- The original salary wording is kept, for example "от 150 000 ₽ за месяц на руки".
- `salaryMin` and `salaryMax` keep the published figures in their own currency and period.
- `salaryGrossOrNet` is `gross` (до вычета налогов) or `net` (на руки), only when the board states it. hh.ru and Rabota.ru state it on most paid jobs.
- `salaryMinMonthlyRub` and `salaryMaxMonthlyRub` give one monthly rouble figure for comparison. Yearly pay is divided by 12. Hourly and shift pay is never converted by guesswork; where hh.ru publishes its own monthly figure for it, that figure is used.
- A salary without a stated period is read as monthly, the usual practice on Russian boards, and the row says so (`salaryPeriodAssumed`).
- Habr Career's own pay estimate is kept in `platformData.habrSalaryEstimate` and labelled as an estimate. It never fills the salary fields or the pay filters.

#### Filters that work on every board

- **Pay:** minimum and maximum monthly roubles, or only jobs that show pay.
- **Job type and work format:** full time, part time, project work, internship, temporary, rotation (вахта) or volunteer, and remote or hybrid jobs.
- **Experience and education:** the four hh.ru experience bands (no experience, 1 to 3, 3 to 6, more than 6 years), and "at least" an education level.
- **Freshness and words:** posted within N days, words to exclude, and company names to keep.
- **Unknown values:** a job that does not state the value you filter on is dropped, so a filter never lets unchecked rows through. Habr Career does not state experience, and Rabota.ru states it only on the job page (turn on full descriptions), so an experience filter mostly returns hh.ru and Работа России rows.

#### Same job on several boards

Rows that share a title, employer and region get the same `clusterId`. Legal forms such as ООО, АО or ПАО and quotation marks are ignored when names are compared. Turn on `uniqueOnly` to keep one row per job, the one with the most information. A Cyrillic company name and its Latin spelling are not treated as the same employer, so some repeats stay separate.

#### Monitoring over time

Give `monitorScope` a name and reuse it on a schedule. Each row is marked `NEW`, `UPDATED`, `UNCHANGED` or `REOPENED`. A job is marked `CLOSED` only after two complete scans in a row did not find it, and a scan that stopped at your row limit never counts as complete. Choose `changesOnly` to receive just the rows that changed. On Работа России a monitor run with a city or region reads only the jobs changed since the previous run, which keeps it fast. If a run reaches its time limit it returns the rows it already has, marks them `PARTIAL` and leaves your saved history untouched.

Moving from our single-board hh.ru or Habr Career scrapers? Their saved monitor history does not carry over, so the first run here marks every job as new.

#### Privacy

Recruiter names, phone numbers and e-mail addresses are never collected from any board, also not in the optional source record. When an hh.ru employer is a private person rather than a company, the employer name is left out.

### ⚙️ Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `sources` | array of enum | No | Boards to read: `hh-ru`, `habr-career`, `rabota-ru`, `trudvsem`, `zarplata-ru`. Default hh.ru and Habr Career. |
| `startUrls` | array of URLs | No | Board links to read as they are: searches, specialisation and skill pages, or single jobs. |
| `keywords` | array of strings | No | Job titles or skills in Russian or English. Empty browses the newest jobs. |
| `expandKeywords` | boolean | No | Also search Russian titles for common English ones (developer: разработчик, программист). |
| `cities` | array of strings | No | Cities or regions in Russian or English, Remote, or Russia for the whole country. |
| `employmentKind` | array of enum | No | Full time, part time, project, internship, temporary, rotation, volunteer. |
| `remoteOnly` | boolean | No | Only remote or hybrid jobs. |
| `experience` | enum | No | Any, no experience, 1 to 3, 3 to 6, or more than 6 years. |
| `education` | enum | No | Minimum education: secondary, vocational, higher, master, PhD. |
| `minMonthlySalaryRub` | integer | No | Minimum monthly pay in roubles. |
| `maxMonthlySalaryRub` | integer | No | Maximum monthly pay in roubles. |
| `onlyDisclosedSalary` | boolean | No | Drop jobs without published pay. |
| `postedWithinDays` | integer | No | Only jobs posted or updated within this many days. |
| `companyNames` | array of strings | No | Keep only these employers (part of the name is enough). |
| `excludeKeywords` | array of strings | No | Drop jobs that mention any of these words. |
| `includeDescription` | boolean | No | Add the description, key skills and listing end date (one extra page per job on most boards). |
| `includeRecruiterSignals` | boolean | No | Add viewer and response counts where the board shows them. |
| `includeSourceFields` | boolean | No | Attach the board's own record, without personal contacts. |
| `convertToUsd` | boolean | No | Add monthly pay in US dollars at the current exchange rate. |
| `monitorScope` | string | No | Name for tracking new, updated and closed jobs across runs. |
| `outputMode` | enum | No | All rows, only new and changed rows, or compact rows. |
| `uniqueOnly` | boolean | No | Keep one row per job across boards. |
| `includeClosed` | boolean | No | Add a short row for each job that closed (monitoring). |
| `maxTotalRows` | integer | No | Rows for the whole run, shared fairly between boards. Default 25. |
| `maxItemsPerSource` | integer | No | Rows per board. Default 25. |
| `maxPagesPerSource` | integer | No | Result pages per search. Default 5. |
| `proxyConfiguration` | object | No | Optional proxy for every board. Not needed for normal runs. |
| `boardOptions` | object | No | Per-board settings, for example the hh.ru sort order or the Habr Career seniority level. |

#### 🧪 Example inputs

Copy one into the Input tab (JSON view) and change the values.

**Recruiter shortlist: Python and Java developers with published pay**

```json
{
  "sources": ["hh-ru", "habr-career"],
  "keywords": ["Python developer", "Java developer"],
  "expandKeywords": true,
  "cities": ["Moscow", "Kazan"],
  "minMonthlySalaryRub": 200000,
  "onlyDisclosedSalary": true,
  "postedWithinDays": 14,
  "uniqueOnly": true,
  "maxTotalRows": 100
}
```

**Pay benchmark: drivers across all five boards**

```json
{
  "sources": ["hh-ru", "habr-career", "rabota-ru", "trudvsem", "zarplata-ru"],
  "keywords": ["водитель"],
  "cities": ["Moscow", "Saint Petersburg", "Kazan"],
  "employmentKind": ["fulltime"],
  "maxTotalRows": 300,
  "maxItemsPerSource": 100
}
```

**Weekly market watch: what opened, changed and closed in Moscow**

```json
{
  "keywords": ["data analyst"],
  "cities": ["Moscow"],
  "monitorScope": "moscow-data-analysts",
  "outputMode": "changesOnly",
  "includeClosed": true,
  "maxTotalRows": 300
}
```

**Paste a board link instead of filling the form**

```json
{
  "startUrls": [{ "url": "https://hh.ru/search/vacancy?text=python&area=1" }],
  "includeDescription": true,
  "maxTotalRows": 50
}
```

### 📤 Output

One row per job. A real row from hh.ru (description shortened):

```json
{
  "listingKey": "hh-ru:138679153",
  "source": "hh-ru",
  "sourceJobId": "138679153",
  "title": "Преподаватель программирования Python",
  "companyName": "АНО ДО Московская школа программистов",
  "companyRating": 4.1,
  "companyReviewCount": 44,
  "trustedEmployer": true,
  "region": "Москва",
  "regionEn": "Moscow",
  "regionCode": "77",
  "federalDistrict": "Central",
  "city": "Москва",
  "district": "Щукино",
  "address": "Москва, улица Берзарина, 16",
  "metroStation": "Октябрьское поле",
  "isRemote": true,
  "remoteType": "partial",
  "salaryGrossOrNet": "gross",
  "salaryCurrency": "RUB",
  "salaryMax": 130000,
  "salaryPeriod": "month",
  "salaryMaxMonthlyRub": 130000,
  "experienceRaw": "Опыт 1-3 года",
  "experienceMinYears": 1,
  "experienceMaxYears": 3,
  "employmentTypeRaw": "Частичная занятость",
  "employmentTypeEn": "Part-time",
  "employmentKind": ["parttime"],
  "schedule": "По выходным, Свободный график, Другой график, 2 ч, 4 ч, 6 ч, 8 ч",
  "skills": ["Python", "Преподавание", "Математика", "Программирование", "C++"],
  "description": "Нам более 25 лет, мы учим детей программированию. Наши выпускники получают работу в ведущих ИТ-компаниях мира...",
  "postedAt": "2026-10-26T15:42:15.511Z",
  "expiresAt": "2026-11-19T15:42:15.511Z",
  "listingUrl": "https://hh.ru/vacancy/138679153",
  "recruiterSignals": { "viewers": 2, "responses": 225 },
  "lifecycleStatus": "NEW"
}
```

Each run also writes `RUN_SUMMARY` (rows per board, limits, monitor state) and `RUN_HEALTH` (per-board status and plain-language notes) to the run's key-value store.

### 📋 Data table

| Field | Type | Description |
| --- | --- | --- |
| `listingKey` | string | Board id plus the board's job id. Use it to join runs. |
| `source` | string | Board the row came from. |
| `title` | string | Job title as published. |
| `companyName` | string | Employer as published. |
| `companyRating`, `companyReviewCount` | number | Employer rating out of 5 and number of reviews, where the board shows them. |
| `trustedEmployer` | boolean | The board marks the employer as verified or accredited. |
| `region`, `regionEn`, `regionCode`, `federalDistrict` | string | Federal subject in Russian and English, its code and the federal district. |
| `city`, `cityEn`, `district`, `address`, `metroStation` | string | Place details as published. |
| `isRemote`, `remoteType` | boolean, string | Remote, hybrid (`partial`) or on-site (`none`). |
| `salaryRaw` | string | Salary wording as published. |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | number, string | Published pay figures, currency and period. |
| `salaryGrossOrNet` | string | `gross` (before tax) or `net` (take-home), when the board states it. |
| `salaryMinMonthlyRub`, `salaryMaxMonthlyRub` | number | Monthly pay in roubles for comparison. |
| `salaryMinUsd`, `salaryMaxUsd` | number | Monthly pay in US dollars (USD salaries, or with `convertToUsd`). |
| `experienceRaw`, `experienceMinYears`, `experienceMaxYears` | string, number | Required experience as published and in years. |
| `educationRaw`, `educationEn` | string | Required education in Russian and English. |
| `employmentTypeRaw`, `employmentTypeEn`, `employmentKind` | string, array | Employment type in Russian, English and as categories. |
| `schedule` | string | Work schedule as published. |
| `seniorityRaw`, `seniority` | string, array | Seniority level, where the board states it. |
| `skills`, `tags` | array | Key skills and labels. |
| `description` | string | Full description (with `includeDescription`). |
| `postedAt`, `updatedAt`, `expiresAt` | string | Publication, last change and end date. |
| `listingUrl` | string | Link to the job. |
| `clusterId`, `clusterSize`, `isCanonical` | string, number, boolean | Same-job group across boards. |
| `lifecycleStatus`, `lifecycleChangedFields`, `firstSeenAt`, `lastSeenAt` | string, array | Change tracking between runs. |
| `platformData` | object | Every other board-specific value, for example the Habr pay estimate or the Работа России company tax number. |

### 💰 Pricing

You pay per job row delivered. Runs that find nothing cost nothing, and there is no subscription. Free plan runs are limited to 25 rows per run, 3 runs per day, and a short wait between runs.

### ⭐ Enjoying Russia Jobs Feed?

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0">
<tr>
<td style="padding:20px 24px 14px;background:#FCEFF1;color:#1C1917;border:1px solid #F3C3CB;border-left:5px solid #C8102E;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">Five boards in one table saves an afternoon of copying and lining up pay by hand.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other recruiters and analysts find it. Your feedback also tells us which board to add next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#C8102E;color:#FFFFFF;border:1px solid #C8102E;border-left:5px solid #C8102E;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/russia-jobs-feed/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ❓ FAQ

**Как выгрузить вакансии с hh.ru и Хабр Карьеры в одну таблицу?**
Select hh.ru and Habr Career, enter your keywords and cities, and run. Every job comes back in the same format, so you can export both boards as one spreadsheet. Schedule the run to get new jobs every day.

**Парсер вакансий с зарплатой: does it show pay before or after tax?**
Yes, when the employer says. `salaryGrossOrNet` is `gross` for "до вычета налогов" and `net` for "на руки". hh.ru and Rabota.ru state it on most paid jobs. When a board does not say, the field is left empty rather than guessed.

**Do I need an hh.ru account, an API key or cookies?**
No. The Actor reads public job listings only. No login, key or cookie is needed.

**Why do I get fewer rows than my limit?**
Filters drop jobs that do not state the value you filter on, and some searches simply have fewer jobs. `RUN_HEALTH` explains per board what happened. Zarplata.ru with hh.ru selected can return few rows, because most of its jobs are hh.ru postings that are delivered once from hh.ru.

**Can I get Habr Career salary statistics?**
This feed returns job rows. For Habr Career's salary survey by seniority, use our Habr Career Scraper, which has a separate salary benchmarks dataset.

### 🔗 Other actors

- [HH.ru Jobs Scraper](https://apify.com/getascraper/hh-ru-jobs-scraper) ↗ - hh.ru vacancies with salaries, skills and employer ratings.
- [Habr Career Scraper](https://apify.com/getascraper/habr-career-scraper) ↗ - Habr Career IT vacancies plus the Habr salary survey by seniority.
- [China Jobs Feed](https://apify.com/getascraper/china-jobs-feed) ↗ - the main Chinese job boards in one run, with the same monitoring.
- [Japan Jobs Feed](https://apify.com/getascraper/japan-jobs-feed) ↗ - Japanese job boards in one run, with yen pay and prefecture labels.
- [Israel Jobs Feed](https://apify.com/getascraper/israel-jobs-feed) ↗ - Israeli job boards in one run, with change tracking.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/russia-jobs-feed/changelog.md

# Actor input Schema

## `sources` (type: `array`):

Which Russian job boards to read. Each board is searched with the same keywords, cities and filters, and every row says which board it came from. hh.ru is the largest general board and Habr Career is the IT board; both are on by default. Rabota.ru adds mass-market and blue-collar jobs with a gross or net pay flag, Работа России is the government portal (slower, every job has a salary), and Zarplata.ru adds the few jobs posted there that are not on hh.ru. Add them when you need them.

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

Optional links copied from a supported board: an hh.ru or Zarplata.ru search page or vacancy, a Habr Career search, specialisation, skill or vacancy page, a Rabota.ru search or vacancy page, or a Работа России vacancy card. The board is detected from each link. Empty the Job boards list to read only the pasted links. A link that belongs to no supported board is reported and skipped.

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

Job titles or skills to search, in Russian or English, for example Python, водитель or менеджер по продажам. Every keyword is searched in every city with each board's own search. Leave empty to browse the newest jobs without a keyword.

## `expandKeywords` (type: `boolean`):

Also search a short built-in list of Russian titles for common English ones (for example developer also searches разработчик and программист). Finds more jobs and uses more requests.

## `cities` (type: `array`):

Cities or regions in Russian or English, for example Moscow, Санкт-Петербург, Казань, Татарстан or Свердловская область. All 85 federal subjects and about 170 cities are known. Enter Remote for remote jobs, or Russia (or leave the list empty) to search the whole country. An unknown place is reported with suggestions and never turned into a whole-country search.

## `employmentKind` (type: `array`):

Keep only these kinds of employment. Leave empty for all. Jobs whose type is not stated are dropped when a type is chosen.

## `remoteOnly` (type: `boolean`):

Keep only jobs the board describes as remote or partly remote (hybrid). Jobs that do not say are dropped.

## `experience` (type: `string`):

Keep jobs whose required experience falls in this band, using the same four bands as hh.ru. Jobs that do not state experience are dropped when a band is chosen.

## `education` (type: `string`):

Keep jobs that ask for at least this level. Jobs that do not state an education level are dropped when a level is chosen.

## `minMonthlySalaryRub` (type: `integer`):

Keep jobs whose published monthly pay reaches at least this amount in roubles. Yearly pay is divided by 12. Hourly, shift and daily pay is compared only when the board itself publishes a monthly figure for it. Jobs with no published pay are dropped when this is set. Each row keeps the board's own gross (before tax) or net (take-home) flag, so you can tell the two apart.

## `maxMonthlySalaryRub` (type: `integer`):

Keep jobs whose published monthly pay starts at or below this amount in roubles.

## `onlyDisclosedSalary` (type: `boolean`):

Drop jobs that say pay is negotiable (по договорённости) or show no pay at all.

## `postedWithinDays` (type: `integer`):

Keep jobs posted or updated within this many days. Jobs that carry no date cannot be checked and are dropped when this is set.

## `companyNames` (type: `array`):

Keep only jobs from companies whose name contains one of these words, for example Сбер or Яндекс.

## `excludeKeywords` (type: `array`):

Drop jobs whose title, company, category, skills or tags contain any of these words.

## `includeDescription` (type: `boolean`):

Add the job description, key skills and listing end date. On hh.ru, Zarplata.ru, Habr Career and Rabota.ru this reads one extra page per job, so runs are slower and rows are larger.

## `includeRecruiterSignals` (type: `boolean`):

Add how many people are viewing a job right now and how many have responded, where the board shows it (hh.ru, Zarplata.ru). Counts only, never names.

## `includeSourceFields` (type: `boolean`):

Attach the board's own record under provenance, for audits and fields not mapped to the common format. Recruiter names, phones and e-mails are removed first.

## `convertToUsd` (type: `boolean`):

Add monthly pay in US dollars using the current exchange rate. Salaries already published in dollars always get USD figures. If the rate cannot be loaded the USD fields are left out.

## `monitorScope` (type: `string`):

Give a name to track this search over time. Each run marks every row NEW, UPDATED, UNCHANGED or REOPENED, and a job that stays gone on two complete scans is reported CLOSED. Use the same name and settings on every scheduled run. Leave empty for a one-off run.

## `outputMode` (type: `string`):

All rows with every field, only rows that are new or changed since the last run, or a short compact row for feeds. Compact rows keep one row per job.

## `uniqueOnly` (type: `boolean`):

When the same job is listed on several boards, keep only the richest copy. Every row carries a cluster id either way, so you can also group them yourself.

## `includeClosed` (type: `boolean`):

When monitoring, add a short CLOSED row for each job that disappeared on two complete scans. Closed rows count as delivered rows.

## `maxTotalRows` (type: `integer`):

Hard limit on rows delivered by the whole run. It is shared fairly between the boards, and a board that finds less hands its share to the others.

## `maxItemsPerSource` (type: `integer`):

Most jobs read from one board in this run (split across your keyword and city combinations).

## `maxPagesPerSource` (type: `integer`):

Most result pages read for each keyword and city on a board. hh.ru and Zarplata.ru pages hold up to 100 jobs and the sites show at most 2,000 per search; Работа России pages hold 100, Rabota.ru 30 and Habr Career 25. A search that stops here is not treated as complete, so it can not report closed jobs.

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

Optional. By default each board is read without a proxy first and moves to a datacenter proxy only if it is refused. A proxy chosen here is used for every board instead.

## `boardOptions` (type: `object`):

Optional per-board settings as JSON, keyed by board id. hh-ru and zarplata-ru accept orderBy (relevance, publication_time, salary_desc, salary_asc). habr-career accepts qid (seniority, for example 4 for Middle, 5 for Senior), s (specialisation ids), skills (skill ids) and sort. Unknown keys are ignored.

## Actor input object example

```json
{
  "sources": [
    "hh-ru",
    "habr-career"
  ],
  "keywords": [
    "Python"
  ],
  "expandKeywords": false,
  "cities": [
    "Moscow"
  ],
  "employmentKind": [],
  "remoteOnly": false,
  "experience": "any",
  "education": "any",
  "onlyDisclosedSalary": false,
  "companyNames": [],
  "excludeKeywords": [],
  "includeDescription": false,
  "includeRecruiterSignals": false,
  "includeSourceFields": false,
  "convertToUsd": false,
  "monitorScope": "",
  "outputMode": "all",
  "uniqueOnly": false,
  "includeClosed": true,
  "maxTotalRows": 25,
  "maxItemsPerSource": 25,
  "maxPagesPerSource": 5,
  "boardOptions": {}
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "sources": [
        "hh-ru",
        "habr-career"
    ],
    "keywords": [
        "Python"
    ],
    "expandKeywords": false,
    "cities": [
        "Moscow"
    ],
    "employmentKind": [],
    "remoteOnly": false,
    "experience": "any",
    "education": "any",
    "onlyDisclosedSalary": false,
    "companyNames": [],
    "excludeKeywords": [],
    "includeDescription": false,
    "includeRecruiterSignals": false,
    "includeSourceFields": false,
    "convertToUsd": false,
    "monitorScope": "",
    "outputMode": "all",
    "uniqueOnly": false,
    "includeClosed": true,
    "maxTotalRows": 25,
    "maxItemsPerSource": 25,
    "maxPagesPerSource": 5,
    "boardOptions": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/russia-jobs-feed").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 = {
    "sources": [
        "hh-ru",
        "habr-career",
    ],
    "keywords": ["Python"],
    "expandKeywords": False,
    "cities": ["Moscow"],
    "employmentKind": [],
    "remoteOnly": False,
    "experience": "any",
    "education": "any",
    "onlyDisclosedSalary": False,
    "companyNames": [],
    "excludeKeywords": [],
    "includeDescription": False,
    "includeRecruiterSignals": False,
    "includeSourceFields": False,
    "convertToUsd": False,
    "monitorScope": "",
    "outputMode": "all",
    "uniqueOnly": False,
    "includeClosed": True,
    "maxTotalRows": 25,
    "maxItemsPerSource": 25,
    "maxPagesPerSource": 5,
    "boardOptions": {},
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/russia-jobs-feed").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 '{
  "sources": [
    "hh-ru",
    "habr-career"
  ],
  "keywords": [
    "Python"
  ],
  "expandKeywords": false,
  "cities": [
    "Moscow"
  ],
  "employmentKind": [],
  "remoteOnly": false,
  "experience": "any",
  "education": "any",
  "onlyDisclosedSalary": false,
  "companyNames": [],
  "excludeKeywords": [],
  "includeDescription": false,
  "includeRecruiterSignals": false,
  "includeSourceFields": false,
  "convertToUsd": false,
  "monitorScope": "",
  "outputMode": "all",
  "uniqueOnly": false,
  "includeClosed": true,
  "maxTotalRows": 25,
  "maxItemsPerSource": 25,
  "maxPagesPerSource": 5,
  "boardOptions": {}
}' |
apify call getascraper/russia-jobs-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/russia-jobs-feed"
        }
    }
}
```

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/JQYOzUh1oaTqcUQRq/builds/NZEQiEddBL45Euyub/openapi.json
