HH.RU Jobs Scraper — Russian Hiring Intelligence avatar

HH.RU Jobs Scraper — Russian Hiring Intelligence

Pricing

from $3.00 / 1,000 job scrapeds

Go to Apify Store
HH.RU Jobs Scraper — Russian Hiring Intelligence

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

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

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 jobId to 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.

FieldTypeRequiredDescription
searchQuerystringYes*Free-text search (e.g. data engineer). Supports HH.RU boolean operators.
vacancyUrlsarrayYes*Public hh.ru/vacancy/<id> URLs to enrich directly. Takes precedence over search.
areaIdsarrayNoHH.RU numeric geographic IDs (e.g. 1 = Moscow, 2 = Saint Petersburg). Empty = all regions.
experiencestringNoExperience filter: noExperience, between1And3, between3And6, moreThan6.
scheduleTypestringNoany, fullDay, shift, flexible, remote, flyInFlyOut, or watch.
onlyWithSalarybooleanNoReturn only vacancies that publish compensation.
publishedWithinDaysintegerNoLimit to vacancies posted within N days. Default 30. Max 30.
maxResultsintegerNoMax vacancies returned. Default 20. Max 100.
includeJobDetailsbooleanNoFetch full detail per vacancy. Default true.
responseFormatstringNoconcise (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.

FieldTypeDescription
jobIdstringStable HH.RU vacancy identifier
titlestringJob title
companyNamestringEmployer name
locationstringCity or region
schedulestringWork schedule (e.g. Remote work)
employmentTypestringFull-time, part-time, contract
experiencestringRequired experience level
salaryMinnumberPublished salary floor
salaryMaxnumberPublished salary ceiling
salaryCurrencystringSalary currency code (e.g. RUR)
salaryGrossbooleanWhether salary is before tax
skillsarrayRequested skill keywords
professionalRolesarrayHH.RU professional role categories
descriptionstringPublic job description
postedAtstringISO timestamp when the vacancy was published
jobUrlstringDirect public vacancy URL
sourceUrlstringAPI provenance URL
sourcestringAlways hh.ru
scrapedAtstringISO 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-Agent header.
  • 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.outcome before summarizing the dataset and preserve sourceUrl for provenance.

Python agent example

from apify_client import ApifyClient
import os
client = 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 areaIds empty when the brief covers every region.
  • Set onlyWithSalary: true when disclosed compensation is essential to the analysis.
  • Choose concise for compact agent comparisons and detailed when the workflow needs more description text.
  • Read OUTPUT for the compact outcome and RUN_SUMMARY for page, route, warning, and event diagnostics.
  • 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.