hh.ru (HeadHunter) Job Scraper
Pricing
from $2.00 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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.

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 site | hh.ru — HeadHunter, the largest job board in Russia and the CIS |
| Entity | Job vacancy (one dataset row per vacancy) |
| Input | Search/catalog/vacancy URLs, or keywords + area ID |
| Output | JSON / CSV / Excel via Apify Dataset |
| Coverage | All hh.ru regions, including regional subdomains (spb.hh.ru, kazan.hh.ru, …) |
Supported inputs
| Input | Example | What happens |
|---|---|---|
| Search URL | https://hh.ru/search/vacancy?text=python&area=1 | Walks every result page (50 vacancies each) and scrapes each vacancy |
| Search URL with filters | https://hh.ru/search/vacancy?text=аналитик&salary=150000&only_with_salary=true | All hh.ru search filters are respected — the actor scrapes exactly what the URL returns |
| Catalog page | https://hh.ru/vacancies/programmist | SEO catalog listings work the same as search URLs |
| Direct vacancy URL | https://hh.ru/vacancy/123456789 | Scrapes just that vacancy |
| Keywords | searchKeywords: ["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
- Classify each start URL: search/catalog listing vs direct vacancy page.
- Parse the embedded JSON state hh.ru ships inside every page — no fragile CSS selectors for core fields.
- Walk the pagination (0-based
?page=N) up to the last page reported by the site, stopping early at yourmaxItems. - Fetch vacancy pages in parallel (sliding-window concurrency, browser-grade TLS fingerprints, automatic retries across two independent HTTP stacks).
- 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}
| Field | Type | Default | Notes |
|---|---|---|---|
startUrls | array | — | hh.ru URLs; takes priority over keywords |
searchKeywords | array | — | One search per keyword |
area | string | — | Numeric hh.ru area ID for keyword searches |
maxItems | integer | 1000 | Hard cap on scraped vacancies |
monitoringMode | boolean | false | Only return vacancies not delivered on previous runs |
resetMonitoringState | boolean | false | One-shot: clear the "already seen" record |
enrichEmails | boolean | false | Opt-in employer contact-email discovery (billed per found email) |
maxConcurrency | integer | 10 | Parallel vacancy fetches |
proxy | object | built-in | Leave 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
| Field | Description |
|---|---|
title, description, descriptionText | Vacancy 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, companyWebsite | Employer name, hh.ru profile, and the employer's own site when published |
companyRating, companyReviewsCount | hh.ru employer review score (when the employer has reviews) |
companyTrusted, companyAccreditedIT | hh.ru verification badge; Russian IT-company accreditation flag |
keySkills | The vacancy's skill tags — ideal for demand analytics |
experience | noExperience / between1And3 / between3And6 / moreThan6 |
workFormats, workSchedule, workingHours | On-site/hybrid/remote, shift pattern, hours per day |
address, coordinates, metroStations | Street address, GPS coordinates, and metro stations with line colors |
contactInfo | Recruiter name/email/phones — only when the employer publishes contacts |
publishedAt, validThrough | Posting 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