hh.ru (HeadHunter) Job Scraper avatar

hh.ru (HeadHunter) Job Scraper

Pricing

from $2.00 / 1,000 results

Go to Apify Store
hh.ru (HeadHunter) Job Scraper

hh.ru (HeadHunter) Job Scraper

Scrape job vacancies from hh.ru (HeadHunter) — title, salary with gross/net flag, employer rating, key skills, metro and GPS coordinates, full description. Works with any search URL, catalog page, or keywords. Built-in residential proxy, monitoring mode for new-only feeds. JSON/CSV.

Pricing

from $2.00 / 1,000 results

Rating

0.0

(0)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

hh.ru (HeadHunter) Job Scraper — vacancies, salaries, employer ratings & key skills

Scrape job vacancies from hh.ru, Russia's largest job board (and the HeadHunter network across the CIS). Paste any hh.ru search URL, catalog page, or direct vacancy link — or just type keywords — and get clean, structured vacancy data: title, salary range, employer profile with rating, full description, key skills, metro stations, and exact coordinates.

How hh.ru Job Scraper works

Why use this hh.ru scraper?

  • Full-depth rows, not snippets. Every vacancy is parsed from hh.ru's own embedded page data — the same payload the site renders from — so you get fields most scrapers miss: salary with gross/net flag, employer rating and review count, IT-accreditation badge, key skills, metro stations, and GPS coordinates.
  • Three ways to start. hh.ru search URLs (with all your filters applied), direct vacancy URLs, or plain keywords + region ID. Mix them in one run.
  • Built-in residential proxy at no extra cost. hh.ru blocks datacenter and most foreign IPs; this actor routes all traffic through its own residential pool. No proxy setup, no extra proxy bill.
  • Monitoring mode. Run it on a schedule and receive only vacancies you haven't seen before — a ready-made "new jobs since last run" feed.
  • Honest pagination. hh.ru serves at most 2,000 results per query (40 pages × 50). The actor tells you when your query exceeds the cap so you can split it by region or keyword instead of silently missing data.

Overview

Target sitehh.ru — HeadHunter, the largest job board in Russia and the CIS
EntityJob vacancy (one dataset row per vacancy)
InputSearch/catalog/vacancy URLs, or keywords + area ID
OutputJSON / CSV / Excel via Apify Dataset
CoverageAll hh.ru regions, including regional subdomains (spb.hh.ru, kazan.hh.ru, …)

Supported inputs

InputExampleWhat happens
Search URLhttps://hh.ru/search/vacancy?text=python&area=1Walks every result page (50 vacancies each) and scrapes each vacancy
Search URL with filtershttps://hh.ru/search/vacancy?text=аналитик&salary=150000&only_with_salary=trueAll hh.ru search filters are respected — the actor scrapes exactly what the URL returns
Catalog pagehttps://hh.ru/vacancies/programmistSEO catalog listings work the same as search URLs
Direct vacancy URLhttps://hh.ru/vacancy/123456789Scrapes just that vacancy
KeywordssearchKeywords: ["python developer"] + area: "1"Each keyword becomes a search; the optional area ID narrows the region

Common area IDs: 1 Moscow · 2 Saint Petersburg · 113 all Russia · 3 Yekaterinburg · 4 Novosibirsk · 88 Kazan · 40 Kazakhstan.

Use cases

  • Salary benchmarking — hh.ru is one of the few boards where employers publish exact salary ranges with gross/net flags.
  • Recruiting & sourcing intelligence — track which companies are hiring for which skills, in which regions, at what pay.
  • Job aggregation — feed a job site or Telegram channel with structured postings, deduplicated by monitoring mode.
  • Market research — measure demand per skill (keySkills), per region, per work format (remote / hybrid / on-site).
  • Competitor watch — schedule a search for a competitor's name and get alerted to every new opening.
  • Lead generation — employer name, website, and hh.ru profile URL in every row; opt-in email enrichment adds a contact email.

How it works

  1. Classify each start URL: search/catalog listing vs direct vacancy page.
  2. Parse the embedded JSON state hh.ru ships inside every page — no fragile CSS selectors for core fields.
  3. Walk the pagination (0-based ?page=N) up to the last page reported by the site, stopping early at your maxItems.
  4. Fetch vacancy pages in parallel (sliding-window concurrency, browser-grade TLS fingerprints, automatic retries across two independent HTTP stacks).
  5. Push one structured row per vacancy with employer fields merged in. A JSON-LD fallback keeps rows flowing even if hh.ru changes its state format.

Input configuration

Minimal example:

{
"startUrls": ["https://hh.ru/search/vacancy?text=python&area=1"],
"maxItems": 100
}

Keyword example:

{
"searchKeywords": ["data engineer", "ml engineer"],
"area": "113",
"maxItems": 500
}

Monitoring example (schedule daily, get only new vacancies):

{
"startUrls": ["https://hh.ru/search/vacancy?text=devops&area=2"],
"monitoringMode": true,
"maxItems": 1000
}
FieldTypeDefaultNotes
startUrlsarrayhh.ru URLs; takes priority over keywords
searchKeywordsarrayOne search per keyword
areastringNumeric hh.ru area ID for keyword searches
maxItemsinteger1000Hard cap on scraped vacancies
monitoringModebooleanfalseOnly return vacancies not delivered on previous runs
resetMonitoringStatebooleanfalseOne-shot: clear the "already seen" record
enrichEmailsbooleanfalseOpt-in employer contact-email discovery (billed per found email)
maxConcurrencyinteger10Parallel vacancy fetches
proxyobjectbuilt-inLeave empty — residential routing is included

Output overview

One row per vacancy. Employer fields are merged inline — no separate employer rows, no padding rows. You only pay for real vacancies.

Output sample

{
"type": "vacancy",
"vacancyId": "134753776",
"vacancyUrl": "https://hh.ru/vacancy/134753776",
"title": "Агент / Менеджер по продаже недвижимости",
"companyId": "2910677",
"companyName": "РЕАЛИСТ - ГК АЛЕКСАНДР Недвижимость",
"companyUrl": "https://hh.ru/employer/2910677",
"companyWebsite": "http://www.realist-estate.ru",
"companyTrusted": true,
"companyAccreditedIT": false,
"logoUrl": "https://img.hhcdn.ru/employer-logo-original/1493659.png",
"salary": { "from": 250000, "to": null, "currency": "RUB", "gross": false, "mode": "MONTH" },
"areaName": "Санкт-Петербург",
"countryCode": "RU",
"address": {
"displayName": "Санкт-Петербург, Большой Сампсониевский проспект, 28к2",
"city": "Санкт-Петербург",
"street": "Большой Сампсониевский проспект",
"building": "28к2"
},
"coordinates": { "latitude": 59.963778, "longitude": 30.343392 },
"metroStations": [
{ "name": "Выборгская", "lineColor": "#D6083B" },
{ "name": "Горьковская", "lineColor": "#0078C9" }
],
"experience": "noExperience",
"employmentForm": "FULL",
"workFormats": ["ON_SITE", "HYBRID"],
"workSchedule": ["FIVE_ON_TWO_OFF"],
"workingHours": ["HOURS_8"],
"keySkills": ["Деловое общение", "Активные продажи", "Навыки презентации"],
"description": "<p><strong>…full vacancy description as HTML…</strong></p>",
"descriptionText": "…full vacancy description as plain text…",
"contactInfo": null,
"publishedAt": "2026-07-08T12:41:12.000+03:00",
"validThrough": "2026-08-07T12:41:12+03:00",
"scrapedAt": "2026-07-11T19:23:03.511Z"
}

Key output fields

FieldDescription
title, description, descriptionTextVacancy title; full description as HTML and as plain text
salary{from, to, currency, gross, mode, frequency} — currency normalized to ISO (RUB), gross distinguishes pre/post-tax; null when the employer hides pay
companyName, companyUrl, companyWebsiteEmployer name, hh.ru profile, and the employer's own site when published
companyRating, companyReviewsCounthh.ru employer review score (when the employer has reviews)
companyTrusted, companyAccreditedIThh.ru verification badge; Russian IT-company accreditation flag
keySkillsThe vacancy's skill tags — ideal for demand analytics
experiencenoExperience / between1And3 / between3And6 / moreThan6
workFormats, workSchedule, workingHoursOn-site/hybrid/remote, shift pattern, hours per day
address, coordinates, metroStationsStreet address, GPS coordinates, and metro stations with line colors
contactInfoRecruiter name/email/phones — only when the employer publishes contacts
publishedAt, validThroughPosting date and expiry timestamp

FAQ

How many results can one query return? hh.ru serves at most 2,000 results per search (40 pages × 50). The actor warns you in the log when your query matches more — split it by region (area), salary band, or narrower keywords to cover everything.

Do I need a proxy? No. hh.ru rejects datacenter and most foreign IPs, so the actor ships with built-in residential routing at no extra cost. The proxy input exists only as an override for users who insist on their own pool.

Is the salary gross or net? Both occur; every salary object carries a gross boolean straight from hh.ru (true = before tax, false = "на руки").

Why is contactInfo usually null? hh.ru employers rarely publish recruiter contacts on the public page. When they do, the actor captures name, email, and phone numbers. For a contact email on other rows, enable enrichEmails.

Does it work for hh.kz / hh.uz and other national sites? This actor targets hh.ru (including all regional subdomains). Kazakhstan and Uzbekistan vacancies posted on hh.ru (e.g. area=40) are covered; the separate national domains are not.

What language is the data in? Whatever the employer wrote — mostly Russian, with English postings common in IT. Fields like workFormats and experience are hh.ru's own stable enum codes, so your pipelines don't depend on Russian labels.

Can I get only new vacancies on a schedule? Yes — enable monitoringMode and put the actor on an Apify schedule. The first run seeds your baseline; every later run returns only unseen vacancy IDs (skipped vacancies are never charged).

Support

Found an issue or need a field added? Open an issue on the actor's Issues tab in Apify Console — it's monitored, and runs are covered by automatic failure alerting on our side. Typical response time is under 24 hours.

Additional services

  • Custom fields or filters — need employer headcount, response statistics, or a filter the input doesn't expose? Ask via the Issues tab.
  • Custom scrapers — we build and maintain scrapers for job boards and directory sites; see the profile for the full portfolio.

Explore more scrapers

More job-board actors by the same author: StepStone, TotalJobs, CharityJob, s1jobs, Goodmoves, AmbitionBox, and more — see the author's Apify profile for the complete list.

⚠️ Disclaimer

This actor collects only publicly available data from hh.ru vacancy pages — the same information any visitor sees in a browser. It does not bypass authentication, does not collect personal data of applicants, and respects hh.ru's per-query result limits. You are responsible for how you use the data: comply with hh.ru's Terms of Service, applicable data-protection laws (including GDPR/152-ФЗ where relevant), and use the data only for lawful purposes. This project is not affiliated with, endorsed by, or connected to HeadHunter Group PLC.

SEO Keywords

hh.ru scraper, headhunter scraper, hh.ru job scraper, hh.ru parser, hh.ru api alternative, scrape hh.ru vacancies, hh.ru vacancy export, headhunter jobs api, hh.ru data extraction, парсер hh.ru, парсер вакансий hh, выгрузка вакансий hh.ru, скрапер hh.ru, russian job board scraper, hh.ru salary data, hh.ru to csv, hh.ru to json, job scraping russia, headhunter vacancy scraper, hh.ru monitoring