hh.ru Scraper - HeadHunter Jobs, Salaries & Skills avatar

hh.ru Scraper - HeadHunter Jobs, Salaries & Skills

Pricing

from $1.75 / 1,000 results

Go to Apify Store
hh.ru Scraper - HeadHunter Jobs, Salaries & Skills

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

Haketa

Maintained by Community

Actor stats

0

Bookmarked

12

Total users

2

Monthly active users

13 hours ago

Last modified

Features

Limited permissions

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.

Apify Platform hh.ru / hh.kz / hh.uz 1,000+ Pagination HR Tech & Market Intelligence Export Formats


⚡ At a glance

FeatureDetails
💼 Supported Portalshh.ru (Russia), hh.kz (Kazakhstan), hh.uz (Uzbekistan), and regional HeadHunter domains
💰 Salary & Demand DatasalaryFrom, salaryTo, salaryCurrency, salaryGross, salaryPeriod, responsesCount (total applicants), onlineUsers
🏢 Employer Intelligencecompany, companyId, companyUrl, companyWebsite, employerRating, employerReviewsCount, accreditedItEmployer
🧠 Detail EnrichmentOptional full text description, structured keySkills array, and public recruiter contacts (includeDescription: true)
📈 Pagination & 1,000+ ScaleHigh-density items_on_page=100 pagination plus automatic experience-tier query splitting to scale past single-search limits
⚡ Speed & Efficiency100 vacancies in ~5–10 seconds (prefill); 1,000+ vacancies in ~30–60 seconds in list mode
📦 Bulk Export FormatsJSON, 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 state accreditedItEmployer status)
  • Precise office geolocation & transit data (metro stations, 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: true to extract tagged keySkills (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 startUrls from hh.ru, hh.kz, or hh.uz, or simply enter an array of keywords (e.g., ["python", "data analyst", "devops"]) with an optional area code.
  • ✅ Unlocked 1,000+ pagination & query splitting: Requests 100 vacancies per page and automatically expands broad queries across experience tiers (noExperience, between1And3, between3And6, moreThan6) when maxItems > 1500 so 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, external companyWebsite, companyLogo, employerRating (out of 5.0), employerReviewsCount, and accreditedItEmployer.
  • ✅ Granular work format & schedule tags: Captures workSchedule (remote, fullDay, flexible), workFormats (REMOTE, HYBRID, ON_SITE, FIELD_WORK), experience, and employment (FULL, PART, PROJECT).
  • ✅ Full geolocation & metro mapping: Extracts city, numeric areaId, street address, nearest metro station names, and latitude / longitude coordinates.
  • ✅ Optional detail page enrichment (includeDescription): Fetches each vacancy's detail page to append the clean plain-text description, the structured keySkills array, and any public contactName, contactEmail, and contactPhones.
  • ✅ Clean, compact output: Automatically strips null or empty fields per record and deduplicates globally by vacancy id.

🎯 Use cases

Team / IndustryHow they use this hh.ru scraper
Tech Recruiters & SourcersMonitor companies hiring scarce roles, filter for remote-only positions (onlyRemote: true), and track employer websites.
HR Analytics & Compensation TeamsBenchmark market pay bands (salaryFrom / salaryTo) across Moscow (area: "1"), Saint Petersburg (area: "2"), Almaty (area: "160"), and Tashkent (area: "2759").
B2B Sales & Outbound AgenciesFind state-accredited IT companies (accreditedItEmployer: true) with external companyWebsite URLs that are actively hiring.
Job Boards & Telegram ChannelsSchedule hourly or daily runs to ingest fresh remote and specialist vacancies via the Apify Dataset API.
Macroeconomic & Labor ResearchersTrack 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.

ParameterTypeDefault / PrefillDescription
startUrlsarray<object>Prefill: python in MoscowDirect search URLs from hh.ru, hh.kz, or hh.uz with any site filters applied. Leave empty to use keywords below.
keywordsarray<string>Prefill: ["python"]Job search keywords (e.g., ["python", "qa", "маркетолог"]). Used in addition to or instead of startUrls.
areastring"" (Everywhere)Optional HeadHunter region ID for keyword searches ("1" = Moscow, "2" = Saint Petersburg, "113" = Russia, "40" = Kazakhstan, "97" = Uzbekistan).
includeDescriptionbooleanfalseWhen true, fetches each vacancy's detail page to extract full description, keySkills, and public recruiter contacts.
onlyRemotebooleanfalseWhen true, keeps only vacancies offering remote work (REMOTE / remote).
maxItemsinteger0 (Prefill: 100)Maximum number of vacancies to collect. Set 0 for unlimited results, 100 for a fast preview, or 1000+ for bulk extraction.
proxyConfigurationobject{ "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

FieldTypeCoverageDescription
idinteger🟢 High (100%)Unique HeadHunter vacancy ID (primary deduplication key)
urlstring🟢 High (100%)Direct URL to the vacancy page
titlestring🟢 High (100%)Job title
experiencestring🟢 High (100%)Required experience tier ("No experience", "1-3 years", "3-6 years", "6+ years")
employmentstring🟢 High (100%)Employment type ("FULL", "PART", "PROJECT", "PROBATION")
workSchedulestring🟢 High (100%)Work schedule code ("fullDay", "remote", "flexible", "shift")
workFormatsarray<string>🟢 High (~85%)Work format tags ("REMOTE", "HYBRID", "ON_SITE", "FIELD_WORK")
responsesCountinteger🟢 High (100%)Total number of candidate applications submitted to this vacancy
onlineUsersinteger🟡 Conditional (~65%)Number of candidates viewing the vacancy right now
publishedAtstring🟢 High (100%)ISO 8601 publication timestamp

🏢 Company & Employer Brand Fields

FieldTypeCoverageDescription
companystring🟢 High (100%)Hiring company display name
companyIdinteger🟢 High (~99%)Employer ID on HeadHunter
companyUrlstring🟢 High (~99%)Link to the employer's profile page on hh.ru
companyWebsitestring🟢 High (~77%)Company's external corporate website URL
companyLogostring🟢 High (~92%)Employer logo image URL
employerRatingnumber🟢 High (~94%)Average employee review rating on hh.ru (e.g., 4.5)
employerReviewsCountinteger🟢 High (~94%)Total number of employee reviews on hh.ru
accreditedItEmployerboolean🟢 High (100%)true if the employer holds official state IT accreditation

💰 Compensation & Location Fields

FieldTypeCoverageDescription
salaryFrominteger🟡 Conditional (~40%)Minimum stated salary amount (when disclosed by the employer)
salaryTointeger🟡 Conditional (~32%)Maximum stated salary amount (when disclosed by the employer)
salaryCurrencystring🟡 Conditional (~40%)Currency code ("RUR", "USD", "EUR", "KZT", "UZS")
salaryGrossboolean🟡 Conditional (~40%)true if gross (before tax), false if net (take-home)
salaryPeriodstring🟡 Conditional (~40%)Pay period ("MONTH", "SHIFT", "HOUR")
citystring🟢 High (100%)City or region name
areaIdinteger🟢 High (100%)Numeric HeadHunter region ID (reusable in the area input parameter)
addressstring🟢 High (~72%)Formatted office street address
metroarray<string>🟡 Conditional (~46%)Nearest metro station name(s)
latitude / longitudenumber🟢 High (~72%)Geocoded office coordinates

🧠 Optional Detail Enrichment Fields (when includeDescription: true)

FieldTypeCoverageDescription
descriptionstring🟡 Opt-in (~100%)Full plain-text job description from the vacancy detail page
keySkillsarray<string>🟡 Opt-in (~82%)Structured array of required skill tags (e.g., ["Python", "SQL", "Docker"])
contactName / contactEmail / contactPhonesstring / 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=100 to 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 (or 0 for unlimited) on 1–2 broad searches, the scraper automatically generates experience-segmented sub-queries (noExperience, between1And3, between3And6, moreThan6) and combines multiple keywords / startUrls to collect 1,000 to 10,000+ unique vacancies.
  • Global ID deduplication: Every vacancy is deduplicated in memory by its numeric id and pushed in 500-item chunks.

⚙️ How to use

  1. Open the Actor in the Apify Console.
  2. Paste your startUrls from hh.ru / hh.kz / hh.uz OR enter one or more keywords and an optional area ID.
  3. Choose your options: toggle onlyRemote: true for remote roles, or includeDescription: true if you need full descriptions and keySkills.
  4. Set maxItems: use 100 for a fast preview, 1000–5000 for a deep market sweep, or 0 for unlimited results.
  5. Click Start and download your dataset as JSON, CSV, or Excel (XLSX).

Calling via Python (apify-client)

from apify_client import ApifyClient
client = 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

area IDCountry / CityPortal 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 ParameterExample ValueEffect
texttext=python+developerFull-text search query
areaarea=1Restricts results to a specific city, region, or country
only_with_salaryonly_with_salary=trueReturns only vacancies that explicitly disclose a salary range
salary / currency_codesalary=250000&currency_code=RURFilters by minimum target compensation and currency
experienceexperience=between3And6Filters by noExperience, between1And3, between3And6, or moreThan6
scheduleschedule=remoteFilters by schedule (remote, fullDay, flexible, shift)
professional_roleprofessional_role=96Filters by specific HeadHunter role taxonomy ID (96 = Programmer/Developer)

🔄 Automated HR Tech & Market Intelligence Workflows

  1. B2B Hiring-Signal Lead Generation: Extract active vacancies for high-value roles (e.g., devops, cloud architect, B2B sales), filter for companies with companyWebsite and accreditedItEmployer: true, and push company URLs into your CRM or enrichment pipeline.
  2. Real-Time Telegram / Job Board Aggregation: Run the actor on an hourly Apify Schedule with onlyRemote: true and pipe new vacancies (deduplicated by id) directly into a Telegram channel, Slack workspace, or custom job portal via Make/n8n.
  3. Quarterly Salary & Skills Benchmarking: Run with only_with_salary=true in startUrls and includeDescription: true to correlate keySkills against median salaryFrom / salaryTo bands across experience levels.

💡 Pro tips for best results

  • Filter for disclosed salaries on the URL: Add &only_with_salary=true to your startUrls if 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, and responsesCount at ~100 items per page. Enable includeDescription: true only when you specifically need full descriptions and keySkills.
  • Common area IDs: 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=true in startUrls).
  • Recruiter contact privacy: Over 95% of employers on hh.ru hide direct recruiter phone numbers and emails behind authenticated applicant messaging. Use companyWebsite and companyUrl for 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.



📋 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 for maxItems > 1500, added 10-keyword default sample fallback for empty {} runs, and set maxItems default to 0 (unlimited) with a fast 100-item prefill.
  • v1.1 (2026-10): Updated detail-page state parser (vacancyView.vacancyFull.vacancy) for description and keySkills enrichment.
  • 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.