HH.RU Jobs Scraper — Russian Hiring Intelligence
Pricing
from $3.00 / 1,000 job scrapeds
HH.RU Jobs Scraper — Russian Hiring Intelligence
Search public HH.RU vacancies and return normalized roles with employer, location, salary, skills, schedule, publication time and a clean description. Use for recruitment research, job alerts and Russian labor-market analysis.
Pricing
from $3.00 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
HH.RU Jobs Scraper — Russian Job Vacancies API & Salary Data
HH.RU Jobs Scraper is an Apify Actor that searches public job vacancies on HH.RU (HeadHunter) via the documented public vacancy API and returns a clean, AI-ready job feed for recruitment research, salary benchmarking, job alerts, and Russian labor-market analysis. It returns structured records with employer, location, salary range, skills, schedule, experience level, and source URLs — no login required.
Best fit and connected workflows
Choose this Actor when you need public HH.RU vacancies filtered by role, region, experience, schedule, or salary disclosure.
Start with Jobs Scraper when the research spans several international job platforms, then use this Actor for the HH.RU portion of the workflow.
Choose Ashby Jobs Scraper when the input starts with known Ashby employer boards. This Actor's focused scope is public HH.RU vacancy data, including the source's employer, salary, skills, schedule, and regional fields.
Common use cases
- Recruiting intelligence: compare hiring demand by role, region, experience, and work schedule.
- Salary research: focus on vacancies that publish pay and retain the source currency and range.
- Job alerts: schedule a bounded query and use
jobIdto detect newly observed vacancies. - Skills analysis: extract requested skills and professional roles across vacancies.
- AI-agent workflows: return concise job records that are easy to filter, summarize, and pass into downstream research.
Practical scenario: from search query to skills brief
A labor-market analyst starts with searchQuery: "data engineer", selects the relevant HH.RU areas, and sets a modest maxResults. The Actor returns one normalized row per vacancy with stable jobId, employer, salary fields, schedule, skills, publication time, and source URLs. The analyst then groups skills across the dataset, compares disclosed salary ranges in the original currency, and schedules the same bounded input to observe newly listed roles.
Input
The default input searches for software engineer vacancies from the available public search period and returns a bounded job dataset.
| Field | Type | Required | Description |
|---|---|---|---|
searchQuery | string | Yes* | Free-text search (e.g. data engineer). Supports HH.RU boolean operators. |
vacancyUrls | array | Yes* | Public hh.ru/vacancy/<id> URLs to enrich directly. Takes precedence over search. |
areaIds | array | No | HH.RU numeric geographic IDs (e.g. 1 = Moscow, 2 = Saint Petersburg). Empty = all regions. |
experience | string | No | Experience filter: noExperience, between1And3, between3And6, moreThan6. |
scheduleType | string | No | any, fullDay, shift, flexible, remote, flyInFlyOut, or watch. |
onlyWithSalary | boolean | No | Return only vacancies that publish compensation. |
publishedWithinDays | integer | No | Limit to vacancies posted within N days. Default 30. Max 30. |
maxResults | integer | No | Max vacancies returned. Default 20. Max 100. |
includeJobDetails | boolean | No | Fetch full detail per vacancy. Default true. |
responseFormat | string | No | concise (compact metadata) or detailed (full description). Default concise. |
*Provide either searchQuery or vacancyUrls.
Example input:
{"searchQuery": "data engineer","areaIds": ["1"],"experience": "between1And3","scheduleType": "remote","publishedWithinDays": 7,"maxResults": 20,"includeJobDetails": true,"responseFormat": "concise"}
areaIds uses HH.RU's numeric geographic identifiers (for example, 1 is Moscow). Leave it empty to search every area.
Output: data fields you receive
Each dataset row is one normalized public vacancy.
| Field | Type | Description |
|---|---|---|
jobId | string | Stable HH.RU vacancy identifier |
title | string | Job title |
companyName | string | Employer name |
location | string | City or region |
schedule | string | Work schedule (e.g. Remote work) |
employmentType | string | Full-time, part-time, contract |
experience | string | Required experience level |
salaryMin | number | Published salary floor |
salaryMax | number | Published salary ceiling |
salaryCurrency | string | Salary currency code (e.g. RUR) |
salaryGross | boolean | Whether salary is before tax |
skills | array | Requested skill keywords |
professionalRoles | array | HH.RU professional role categories |
description | string | Public job description |
postedAt | string | ISO timestamp when the vacancy was published |
jobUrl | string | Direct public vacancy URL |
sourceUrl | string | API provenance URL |
source | string | Always hh.ru |
scrapedAt | string | ISO timestamp of data collection |
The default key-value store always contains:
OUTPUT— compact result outcome for API and agent use.RUN_SUMMARY— page, item, route, warning, and charge diagnostics.
Illustrative record shape:
{"jobId": "123456","title": "Data Engineer","companyName": "Example Labs","location": "Moscow","schedule": "Remote work","experience": "Between 1 and 3 years","salaryMin": 250000,"salaryMax": 350000,"salaryCurrency": "RUR","skills": ["Python", "SQL"],"professionalRoles": ["Data analyst"],"description": "Build reliable data pipelines…","postedAt": "2026-07-15T12:00:00+0300","jobUrl": "https://hh.ru/vacancy/123456","source": "hh.ru"}
How it works
- The Actor calls HH.RU's documented public vacancy API with the
HH-User-Agentheader. - A Russia-targeted residential session handles anonymous API traffic.
- Temporary source responses are retried, and useful listing data is retained when optional detail enrichment is unavailable.
- Source-access outcomes remain distinct from a valid search with no matching vacancies.
- The public vacancy API limits a search window to 30 days and practical pagination to its own documented result cap.
Pricing
This Actor uses Pay per event + platform usage. A job event is charged only for a validated vacancy persisted to the dataset; duplicate and unpersisted records are excluded from job-result billing. The maxResults field keeps the requested result volume bounded. See the live Pricing tab for current event details.
Event-count example
A bounded request returning twenty validated vacancies records twenty job-scraped events in addition to the actor-start event and Apify platform usage. Set maxResults to define the result boundary before each request.
Use with AI agents (MCP)
This Actor is exposed in the Apify MCP server as apify--hh-ru-jobs-scraper. AI agents like Claude, ChatGPT, and Gemini can call it directly to fetch live Russian job market data.
Tool description: Search public HH.RU (HeadHunter) job vacancies through the public API. Use for Russian labor-market research, salary benchmarking, job alerts, and hiring intelligence. Returns one record per vacancy with employer, location, salary, skills, publication time, and source URL, with one event recorded per validated vacancy.
Agent prompt card
Copy this into Claude, ChatGPT, or any MCP-connected agent:
Search HH.RU for remote data engineering vacancies published in the last 7 days. For each result, return the title, company, salary range, required skills, and the source job URL. Summarize recurring skill demand across the results. Read
OUTPUT.outcomebefore summarizing the dataset and preservesourceUrlfor provenance.
Python agent example
from apify_client import ApifyClientimport osclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('khadinakbar/hh-ru-jobs-scraper').call(run_input={'searchQuery': 'data engineer','areaIds': ['1'],'scheduleType': 'remote','publishedWithinDays': 7,'maxResults': 20,'responseFormat': 'concise',})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item['title'], item['salaryMin'], item['skills'])
API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('khadinakbar/hh-ru-jobs-scraper').call({searchQuery: 'data engineer',areaIds: ['1'],scheduleType: 'remote',publishedWithinDays: 7,maxResults: 20,responseFormat: 'concise',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Best results and outcome guidance
HH.RU requests use an identifying HH-User-Agent header and a consistent Russia-targeted residential session. The Actor retries temporary source responses and keeps useful listing data when optional detail enrichment is unavailable.
- Start with a broad role query and a modest
maxResults, then add one area, experience, or schedule filter at a time. - Use HH.RU numeric area identifiers and leave
areaIdsempty when the brief covers every region. - Set
onlyWithSalary: truewhen disclosed compensation is essential to the analysis. - Choose
concisefor compact agent comparisons anddetailedwhen the workflow needs more description text. - Read
OUTPUTfor the compact outcome andRUN_SUMMARYfor page, route, warning, and event diagnostics.
Related Actors
- Choose Ashby Jobs Scraper when the next search starts from known Ashby employer boards; its linked workflow appears in the Best fit section above.
- Start with Jobs Scraper when the research combines several large job platforms, then compare its HH.RU segment with this focused dataset through the linked workflow above.
- Choose Built In Jobs Scraper when the next workflow focuses on technology-company vacancies and salary data outside HH.RU.
Design note
While reviewing and testing this Actor, I found that its compact response keeps identifiers, source links, salary fields, skills, and a bounded description easy to compare. A practical workflow confirms a broad query with a small result cap, then adds one filter at a time so the final scheduled input remains easy to explain and reproduce.
FAQ
How do I scrape HH.RU job vacancies? Provide a searchQuery (e.g. software engineer) and optionally filter by areaIds, experience, scheduleType, or onlyWithSalary. The Actor calls HH.RU's public vacancy API and returns structured records with employer, salary, skills, and source URLs.
What data fields does HH.RU Jobs Scraper return? Each vacancy includes title, companyName, location, salaryMin/Max/Currency, skills, professionalRoles, experience, schedule, employmentType, postedAt, and jobUrl. See the Output table above for the full list.
Can I search several regions? Yes. Add multiple HH.RU numeric area IDs to areaIds, or leave the array empty for an unrestricted geographic search.
Can I retrieve known vacancies directly? Yes. Put public HH.RU vacancy links in vacancyUrls; the Actor uses those known listings as the primary input mode.
Why are some salary fields empty? HH.RU listings include compensation only when the employer publishes it. The Actor preserves that distinction rather than estimating a range.
How can an AI agent analyze an HH.RU vacancy set? Call apify--hh-ru-jobs-scraper through the Apify MCP server with a search query or known vacancy URLs, then compare salary, skills, location, and source provenance from the structured rows.
Which response format should an agent choose? Start with concise for compact comparisons and use detailed when the workflow needs more of each public job description.
Data provenance and responsible use
Rows are derived from public HH.RU vacancy search and detail pages, with the exact sourceUrl retained for provenance. Respect HH.RU's terms, applicable data-protection laws, and your users' expectations, and preserve human review for decisions that affect individuals.