hh.ru Scraper - HeadHunter Jobs, Salaries & Skills
Pricing
from $1.75 / 1,000 results
hh.ru Scraper - HeadHunter Jobs, Salaries & Skills
Scrape job vacancies from hh.ru (HeadHunter) across Russia & CIS: title, company, salary, city, work format, experience, key skills, application counts and full description. Export to JSON, CSV or Excel.
Pricing
from $1.75 / 1,000 results
Rating
0.0
(0)
Developer
Haketa
Maintained by CommunityActor stats
0
Bookmarked
12
Total users
2
Monthly active users
13 hours ago
Last modified
Categories
Features
Share
hh.ru Scraper — HeadHunter Jobs, Salaries, Key Skills & Employer Ratings
Extract structured job vacancies from hh.ru (HeadHunter) — as well as regional portals hh.kz (Kazakhstan) and hh.uz (Uzbekistan) — into clean, ready-to-analyze datasets. Capture job titles, structured salary ranges, company profiles, employer ratings, accredited IT status, work formats, applicant response counts, office coordinates, full job descriptions, and key skills with zero coding.
⚡ At a glance
| Feature | Details |
|---|---|
| 💼 Supported Portals | hh.ru (Russia), hh.kz (Kazakhstan), hh.uz (Uzbekistan), and regional HeadHunter domains |
| 💰 Salary & Demand Data | salaryFrom, salaryTo, salaryCurrency, salaryGross, salaryPeriod, responsesCount (total applicants), onlineUsers |
| 🏢 Employer Intelligence | company, companyId, companyUrl, companyWebsite, employerRating, employerReviewsCount, accreditedItEmployer |
| 🧠 Detail Enrichment | Optional full text description, structured keySkills array, and public recruiter contacts (includeDescription: true) |
| 📈 Pagination & 1,000+ Scale | High-density items_on_page=100 pagination plus automatic experience-tier query splitting to scale past single-search limits |
| ⚡ Speed & Efficiency | 100 vacancies in ~5–10 seconds (prefill); 1,000+ vacancies in ~30–60 seconds in list mode |
| 📦 Bulk Export Formats | JSON, CSV, Excel (XLSX), XML, HTML Table, RSS, and direct REST API / Webhook integration |
🔎 Why scrape hh.ru (HeadHunter)?
HeadHunter (hh.ru, hh.kz, hh.uz) is the largest recruitment and labor-market platform across Russia, Kazakhstan, Uzbekistan, and the wider CIS region, hosting hundreds of thousands of active job listings across technology, finance, engineering, retail, logistics, and executive management.
Every listing on HeadHunter contains uniquely rich labor-market signals that go far beyond a standard job post:
- Structured compensation bands (
salaryFrom,salaryTo,salaryCurrency,salaryGross) - Live applicant competition metrics (
responsesCount— how many candidates have already applied to the role) - Verified employer brand scores (
employerRating,employerReviewsCount, and stateaccreditedItEmployerstatus) - Precise office geolocation & transit data (
metrostations,latitude,longitude)
Collecting this data manually is slow and restricted by page limits. This hh.ru scraper turns any keyword list, regional filter, or custom search URL into a clean, deduplicated JSON/CSV/Excel dataset in seconds.
Key reasons teams use this hh.ru data extractor:
- 💵 Compensation & salary benchmarking: Analyze real-time salary ranges (
RUR,KZT,USD,EUR) segmented by role, required experience (noExperience,1-3 years,3-6 years,6+ years), and city. - 🎯 B2B sales & hiring-signal lead generation: Identify fast-growing companies (
companyWebsite,accreditedItEmployer) actively expanding their engineering, sales, or operations teams. - 🧠 Skills-demand & curriculum analytics: Enable
includeDescription: trueto extract taggedkeySkills(e.g.,Python,FastAPI,Kubernetes,1C,SQL) and measure technology adoption trends. - 📊 Job board aggregation & talent feeds: Power regional job aggregators, Telegram job bots, career newsletters, and internal talent-sourcing dashboards via scheduled API runs.
- 🕵️ Competitive intelligence: Track competitor headcount expansion and measure candidate attraction velocity using
responsesCount.
✨ What this hh.ru scraper does
- ✅ Flexible dual input modes: Pass any custom filtered
startUrlsfromhh.ru,hh.kz, orhh.uz, or simply enter an array ofkeywords(e.g.,["python", "data analyst", "devops"]) with an optionalareacode. - ✅ Unlocked 1,000+ pagination & query splitting: Requests
100vacancies per page and automatically expands broad queries across experience tiers (noExperience,between1And3,between3And6,moreThan6) whenmaxItems > 1500so runs scale cleanly past HeadHunter's single-search ceiling. - ✅ Smart empty-run fallback: Running with an empty input
{}automatically sweeps 10 popular job categories and returns a diverse sample of 100 active vacancies. - ✅ Complete employer profile metadata: Extracts
company,companyId,companyUrl, externalcompanyWebsite,companyLogo,employerRating(out of 5.0),employerReviewsCount, andaccreditedItEmployer. - ✅ Granular work format & schedule tags: Captures
workSchedule(remote,fullDay,flexible),workFormats(REMOTE,HYBRID,ON_SITE,FIELD_WORK),experience, andemployment(FULL,PART,PROJECT). - ✅ Full geolocation & metro mapping: Extracts
city, numericareaId, streetaddress, nearestmetrostation names, andlatitude/longitudecoordinates. - ✅ Optional detail page enrichment (
includeDescription): Fetches each vacancy's detail page to append the clean plain-textdescription, the structuredkeySkillsarray, and any publiccontactName,contactEmail, andcontactPhones. - ✅ Clean, compact output: Automatically strips
nullor empty fields per record and deduplicates globally by vacancyid.
🎯 Use cases
| Team / Industry | How they use this hh.ru scraper |
|---|---|
| Tech Recruiters & Sourcers | Monitor companies hiring scarce roles, filter for remote-only positions (onlyRemote: true), and track employer websites. |
| HR Analytics & Compensation Teams | Benchmark market pay bands (salaryFrom / salaryTo) across Moscow (area: "1"), Saint Petersburg (area: "2"), Almaty (area: "160"), and Tashkent (area: "2759"). |
| B2B Sales & Outbound Agencies | Find state-accredited IT companies (accreditedItEmployer: true) with external companyWebsite URLs that are actively hiring. |
| Job Boards & Telegram Channels | Schedule hourly or daily runs to ingest fresh remote and specialist vacancies via the Apify Dataset API. |
| Macroeconomic & Labor Researchers | Track vacancy volumes, applicant-to-vacancy ratios (responsesCount), and remote work share over time. |
📥 Input configuration
All fields are optional. Use the visual form in the Apify Console or pass a JSON object via the API.
| Parameter | Type | Default / Prefill | Description |
|---|---|---|---|
startUrls | array<object> | Prefill: python in Moscow | Direct search URLs from hh.ru, hh.kz, or hh.uz with any site filters applied. Leave empty to use keywords below. |
keywords | array<string> | Prefill: ["python"] | Job search keywords (e.g., ["python", "qa", "маркетолог"]). Used in addition to or instead of startUrls. |
area | string | "" (Everywhere) | Optional HeadHunter region ID for keyword searches ("1" = Moscow, "2" = Saint Petersburg, "113" = Russia, "40" = Kazakhstan, "97" = Uzbekistan). |
includeDescription | boolean | false | When true, fetches each vacancy's detail page to extract full description, keySkills, and public recruiter contacts. |
onlyRemote | boolean | false | When true, keeps only vacancies offering remote work (REMOTE / remote). |
maxItems | integer | 0 (Prefill: 100) | Maximum number of vacancies to collect. Set 0 for unlimited results, 100 for a fast preview, or 1000+ for bulk extraction. |
proxyConfiguration | object | { "useApifyProxy": true } | Apify Proxy configuration. Default datacenter proxy rotation is pre-configured and recommended. |
Example 1: Fast prefill run (100 Python vacancies in Moscow)
{"startUrls": [{ "url": "https://hh.ru/search/vacancy?text=python&area=1" }],"keywords": ["python"],"includeDescription": false,"onlyRemote": false,"maxItems": 100,"proxyConfiguration": {"useApifyProxy": true}}
Example 2: 2,000+ IT & Data vacancies across Russia and Kazakhstan
{"startUrls": [],"keywords": ["python","golang","data engineer","devops","frontend"],"area": "113","onlyRemote": false,"includeDescription": false,"maxItems": 2000}
Example 3: Deep skills & salary extraction with full descriptions
{"startUrls": [{ "url": "https://hh.ru/search/vacancy?text=data+scientist&only_with_salary=true" }],"includeDescription": true,"onlyRemote": true,"maxItems": 250}
📤 Output schema & field reference
Each vacancy is saved as a clean JSON object with null fields omitted. Below is a verified output item from a production run:
{"id": 138480763,"url": "https://hh.ru/vacancy/138480763","title": "Python-разработчик (AI / LLM)","company": "HeadHunter","companyId": 907345,"companyUrl": "https://hh.ru/employer/907345","companyWebsite": "https://hh.ru","companyLogo": "https://img.hhcdn.ru/employer-logo/1234567.png","employerRating": 4.5,"employerReviewsCount": 1280,"accreditedItEmployer": true,"salaryFrom": 250000,"salaryTo": 400000,"salaryCurrency": "RUR","salaryGross": false,"salaryPeriod": "MONTH","city": "Москва","areaId": 1,"address": "Москва, Годовикова, 9с10","metro": ["Алексеевская"],"latitude": 55.807794,"longitude": 37.637644,"workSchedule": "remote","workFormats": ["REMOTE", "HYBRID"],"experience": "3-6 years","employment": "FULL","responsesCount": 142,"onlineUsers": 7,"publishedAt": "2026-10-28T11:20:15.000+03:00","description": "Мы в hh создаём продукты и AI-ассистентов на базе генеративных технологий…","keySkills": ["Python", "machine learning", "data science", "LangChain", "FastAPI", "RAG"]}
💼 Vacancy Identity, Role & Demand Fields
| Field | Type | Coverage | Description |
|---|---|---|---|
id | integer | 🟢 High (100%) | Unique HeadHunter vacancy ID (primary deduplication key) |
url | string | 🟢 High (100%) | Direct URL to the vacancy page |
title | string | 🟢 High (100%) | Job title |
experience | string | 🟢 High (100%) | Required experience tier ("No experience", "1-3 years", "3-6 years", "6+ years") |
employment | string | 🟢 High (100%) | Employment type ("FULL", "PART", "PROJECT", "PROBATION") |
workSchedule | string | 🟢 High (100%) | Work schedule code ("fullDay", "remote", "flexible", "shift") |
workFormats | array<string> | 🟢 High (~85%) | Work format tags ("REMOTE", "HYBRID", "ON_SITE", "FIELD_WORK") |
responsesCount | integer | 🟢 High (100%) | Total number of candidate applications submitted to this vacancy |
onlineUsers | integer | 🟡 Conditional (~65%) | Number of candidates viewing the vacancy right now |
publishedAt | string | 🟢 High (100%) | ISO 8601 publication timestamp |
🏢 Company & Employer Brand Fields
| Field | Type | Coverage | Description |
|---|---|---|---|
company | string | 🟢 High (100%) | Hiring company display name |
companyId | integer | 🟢 High (~99%) | Employer ID on HeadHunter |
companyUrl | string | 🟢 High (~99%) | Link to the employer's profile page on hh.ru |
companyWebsite | string | 🟢 High (~77%) | Company's external corporate website URL |
companyLogo | string | 🟢 High (~92%) | Employer logo image URL |
employerRating | number | 🟢 High (~94%) | Average employee review rating on hh.ru (e.g., 4.5) |
employerReviewsCount | integer | 🟢 High (~94%) | Total number of employee reviews on hh.ru |
accreditedItEmployer | boolean | 🟢 High (100%) | true if the employer holds official state IT accreditation |
💰 Compensation & Location Fields
| Field | Type | Coverage | Description |
|---|---|---|---|
salaryFrom | integer | 🟡 Conditional (~40%) | Minimum stated salary amount (when disclosed by the employer) |
salaryTo | integer | 🟡 Conditional (~32%) | Maximum stated salary amount (when disclosed by the employer) |
salaryCurrency | string | 🟡 Conditional (~40%) | Currency code ("RUR", "USD", "EUR", "KZT", "UZS") |
salaryGross | boolean | 🟡 Conditional (~40%) | true if gross (before tax), false if net (take-home) |
salaryPeriod | string | 🟡 Conditional (~40%) | Pay period ("MONTH", "SHIFT", "HOUR") |
city | string | 🟢 High (100%) | City or region name |
areaId | integer | 🟢 High (100%) | Numeric HeadHunter region ID (reusable in the area input parameter) |
address | string | 🟢 High (~72%) | Formatted office street address |
metro | array<string> | 🟡 Conditional (~46%) | Nearest metro station name(s) |
latitude / longitude | number | 🟢 High (~72%) | Geocoded office coordinates |
🧠 Optional Detail Enrichment Fields (when includeDescription: true)
| Field | Type | Coverage | Description |
|---|---|---|---|
description | string | 🟡 Opt-in (~100%) | Full plain-text job description from the vacancy detail page |
keySkills | array<string> | 🟡 Opt-in (~82%) | Structured array of required skill tags (e.g., ["Python", "SQL", "Docker"]) |
contactName / contactEmail / contactPhones | string / array | 🟡 Opt-in (~5%) | Public recruiter contact details (present only when not hidden by the employer) |
🔁 Pagination & 1,000+ scale architecture
- 100-item high-density pages: The scraper automatically appends
items_on_page=100to search queries, cutting the number of HTTP requests in half compared to standard 50-item pages. - Automatic query splitting past 2,000 results: HeadHunter caps any single search query at ~2,000 vacancies. When you set
maxItems > 1500(or0for unlimited) on 1–2 broad searches, the scraper automatically generates experience-segmented sub-queries (noExperience,between1And3,between3And6,moreThan6) and combines multiplekeywords/startUrlsto collect 1,000 to 10,000+ unique vacancies. - Global ID deduplication: Every vacancy is deduplicated in memory by its numeric
idand pushed in 500-item chunks.
⚙️ How to use
- Open the Actor in the Apify Console.
- Paste your
startUrlsfromhh.ru/hh.kz/hh.uzOR enter one or morekeywordsand an optionalareaID. - Choose your options: toggle
onlyRemote: truefor remote roles, orincludeDescription: trueif you need full descriptions andkeySkills. - Set
maxItems: use100for a fast preview,1000–5000for a deep market sweep, or0for unlimited results. - Click Start and download your dataset as JSON, CSV, or Excel (XLSX).
Calling via Python (apify-client)
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("haketa/hh-scraper").call(run_input={"keywords": ["python", "data scientist", "ml engineer"],"area": "113","onlyRemote": True,"includeDescription": False,"maxItems": 1000,})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{job['id']} | {job['title']} @ {job['company']} | {job.get('salaryFrom')}-{job.get('salaryTo')} {job.get('salaryCurrency', '')}")
Calling via Node.js (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('haketa/hh-scraper').call({keywords: ['python', 'golang', 'devops', 'qa'],area: '113',onlyRemote: false,includeDescription: false,maxItems: 1000,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Extracted ${items.length} HeadHunter vacancies`);
Calling via cURL (REST API)
curl -X POST "https://api.apify.com/v2/acts/haketa~hh-scraper/runs?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"keywords": ["python", "data analyst"],"area": "1","onlyRemote": false,"includeDescription": false,"maxItems": 500}'
📚 HeadHunter Region (area) & URL Filter Cheatsheet
Popular HeadHunter area IDs (area input or &area= URL param)
area ID | Country / City | Portal Domain |
|---|---|---|
"113" | All Russia (Nationwide) | hh.ru |
"1" | Moscow (Москва) | hh.ru |
"2" | Saint Petersburg (Санкт-Петербург) | hh.ru |
"3" | Yekaterinburg (Екатеринбург) | hh.ru |
"4" | Novosibirsk (Новосибирск) | hh.ru |
"88" | Kazan (Казань) | hh.ru |
"66" | Nizhny Novgorod (Нижний Новгород) | hh.ru |
"40" | All Kazakhstan (Nationwide) | hh.kz |
"160" | Almaty (Алматы, Kazakhstan) | hh.kz |
"159" | Astana (Астана, Kazakhstan) | hh.kz |
"97" | All Uzbekistan (Nationwide) | hh.uz |
"2759" | Tashkent (Ташкент, Uzbekistan) | hh.uz |
"16" | All Belarus (Nationwide) | hh.ru |
Useful Search URL Parameters (startUrls)
When using startUrls, you can combine any of HeadHunter's native query parameters:
| URL Parameter | Example Value | Effect |
|---|---|---|
text | text=python+developer | Full-text search query |
area | area=1 | Restricts results to a specific city, region, or country |
only_with_salary | only_with_salary=true | Returns only vacancies that explicitly disclose a salary range |
salary / currency_code | salary=250000¤cy_code=RUR | Filters by minimum target compensation and currency |
experience | experience=between3And6 | Filters by noExperience, between1And3, between3And6, or moreThan6 |
schedule | schedule=remote | Filters by schedule (remote, fullDay, flexible, shift) |
professional_role | professional_role=96 | Filters by specific HeadHunter role taxonomy ID (96 = Programmer/Developer) |
🔄 Automated HR Tech & Market Intelligence Workflows
- B2B Hiring-Signal Lead Generation: Extract active vacancies for high-value roles (e.g.,
devops,cloud architect,B2B sales), filter for companies withcompanyWebsiteandaccreditedItEmployer: true, and push company URLs into your CRM or enrichment pipeline. - Real-Time Telegram / Job Board Aggregation: Run the actor on an hourly Apify Schedule with
onlyRemote: trueand pipe new vacancies (deduplicated byid) directly into a Telegram channel, Slack workspace, or custom job portal via Make/n8n. - Quarterly Salary & Skills Benchmarking: Run with
only_with_salary=trueinstartUrlsandincludeDescription: trueto correlatekeySkillsagainst mediansalaryFrom/salaryTobands across experience levels.
💡 Pro tips for best results
- Filter for disclosed salaries on the URL: Add
&only_with_salary=trueto yourstartUrlsif you are building a salary benchmarking dataset and want 100% salary coverage. - Use fast list mode for B2B & salary sweeps: List mode (
includeDescription: false) already extracts salaries, employer ratings,companyWebsite,accreditedItEmployer, geo coordinates, andresponsesCountat ~100 items per page. EnableincludeDescription: trueonly when you specifically need full descriptions andkeySkills. - Common
areaIDs:1= Moscow,2= Saint Petersburg,113= All Russia,40= Kazakhstan (160= Almaty,159= Astana),97= Uzbekistan (2759= Tashkent),16= Belarus.
⚠️ Honest limitations
- Undisclosed salaries: Roughly 55–60% of employers on HeadHunter choose not to publish salary figures on their listings. To avoid empty columns, salary fields are omitted on records where pay is not stated (or use
only_with_salary=trueinstartUrls). - Recruiter contact privacy: Over 95% of employers on
hh.ruhide direct recruiter phone numbers and emails behind authenticated applicant messaging. UsecompanyWebsiteandcompanyUrlfor B2B company enrichment.
❓ Frequently Asked Questions (FAQ)
Does this scraper require an hh.ru login or developer API token? No. It extracts public vacancy listings directly without requiring any account login or HeadHunter API approval.
Does it work with hh.kz (Kazakhstan) and hh.uz (Uzbekistan)?
Yes. You can paste search URLs from hh.kz or hh.uz into startUrls, or pass area: "40" (Kazakhstan) or area: "97" (Uzbekistan) with keywords.
How fast does it extract 1,000+ vacancies?
In list mode (includeDescription: false), a 100-vacancy prefill run completes in ~5–10 seconds, and a 1,000-vacancy run completes in ~30–60 seconds.
How do I extract keySkills and the full job description?
Set includeDescription: true in the input. The scraper will visit each collected vacancy's detail page (5 concurrent requests) and attach description and keySkills.
🔗 Related Job & B2B Scrapers
- Seek Jobs Scraper — Extract job listings, salaries, and employer profiles from Seek.
- ZipRecruiter Scraper — Extract US job postings, compensation bands, and hiring companies.
- H-1B Visa Database Scraper — Extract US H-1B visa sponsorship filings and certified salaries.
- GoodFirms Scraper — Extract IT outsourcing companies, rates, and client reviews.
📋 Changelog
- v1.2 (2026-11): Unlocked 1,000+ high-density pagination & empty-run fallback — upgraded search requests to
items_on_page=100, fixed premature page-count termination, added automatic experience-tier query expansion formaxItems > 1500, added 10-keyword default sample fallback for empty{}runs, and setmaxItemsdefault to0(unlimited) with a fast100-item prefill. - v1.1 (2026-10): Updated detail-page state parser (
vacancyView.vacancyFull.vacancy) fordescriptionandkeySkillsenrichment. - v1.0 (2026-07): Initial release of the hh.ru Scraper.
This Actor is an independent tool and is not affiliated with, endorsed by, or connected to HeadHunter (hh.ru). All trademarks belong to their respective owners.