hh.ru Jobs Scraper
Pricing
from $1.09 / 1,000 vacancy scrapeds
hh.ru Jobs Scraper
Scrape job vacancies from hh.ru (HeadHunter) by keyword, region, experience, schedule, and employment type. Extract title, company, salary in RUR, skills, full description, work format, and apply links. Export as JSON, CSV, or Excel.
Pricing
from $1.09 / 1,000 vacancy scrapeds
Rating
0.0
(0)
Developer
ParseBird
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
hh.ru Jobs Scraper
Scrape job vacancies from hh.ru (HeadHunter) — Russia's largest job board — into clean, structured JSON. The hh.ru Jobs Scraper pulls the vacancy title, hiring company, salary in RUR, key skills, the full job description, work format, schedule, and apply link from any keyword search or vacancy URL, with no login and no hh.ru API key.
| Search HeadHunter by keyword, region code, experience, schedule, and employment type — get the full salary range, key-skills list, and plain-text plus HTML description for every vacancy, paginated automatically. |
Copy to your AI assistant
Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.
Actor: parsebird/hh-ru-jobs-scraper (Apify). Scrapes vacancies from hh.ru (HeadHunter). Call with ApifyClient.Input JSON fields:startUrl: string — an hh.ru search URL (https://hh.ru/search/vacancy?...) or a single vacancy URL (https://hh.ru/vacancy/123). Overrides the fields below.text: string — search keyword, e.g. "python developer"area: string — hh.ru region code (1 = Moscow, 2 = Saint Petersburg, 113 = all of Russia). Full list at https://api.hh.ru/areasexperience: "" | "noExperience" | "between1And3" | "between3And6" | "moreThan6"schedule: "" | "remote" | "fullDay" | "shift" | "flexible" | "flyInFlyOut"employment: "" | "full" | "part" | "project" | "volunteer" | "probation"results_wanted: int (default 20, hh.ru returns at most 2000 per search) — number of billed rowsmax_pages: int (default 20, 50 vacancies per page)api_only: bool (default true) — keep the summary record when a vacancy detail page is unavailableinclude_raw_data: bool (default false) — attach the raw hh.ru payload to each itemproxyConfiguration: { "useApifyProxy": false } (residential recommended only for very large runs)Output: one dataset item per vacancy — vacancy_id, title, company, employer_id, employer_url, location, salary, salary_from, salary_to, salary_currency, salary_is_gross, experience, employment_type, schedule, work_format[], work_schedule_by_days[], working_hours[], skills[], description_text, description_html, date_posted, date_expires, responses_count, url, apply_url, source, source_page, source_position, scraped_at.Example: { "text": "python developer", "area": "1", "results_wanted": 50 }API: https://api.apify.com/v2/acts/parsebird~hh-ru-jobs-scraper · Token: https://console.apify.com/account/integrations
What does hh.ru Jobs Scraper do?
hh.ru (HeadHunter) carries millions of active vacancies across Russia and the CIS. Its public API blocks datacenter and non-Russian IP addresses, so this hh.ru scraper reads the website's own embedded data instead — which works from any location. It extracts:
- 💼 Vacancy basics — title, hiring company, employer profile link, and location.
- 💰 Salary — the published range, currency (usually RUR), and whether it is gross or net.
- 🧠 Key skills — the skill tags the employer attached to the role.
- 📄 Full description — both plain text and the original HTML.
- 🏢 Work terms — experience level, employment type, schedule (remote / full day / shift), and work format (on-site / remote / hybrid).
- 📅 Dates — publication and expiry timestamps, plus the current response count.
- 🔗 Apply link — the direct hh.ru application URL.
Common uses: salary and skills-demand research for the Russian market, recruitment intelligence, building a jobs aggregator, and monitoring hiring at specific companies.
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| startUrl | string | No | — | An hh.ru search URL or a single vacancy URL. Overrides the search fields. |
| text | string | No | — | Search keyword (role or skill). |
| area | string | No | 1 | hh.ru region code. 1 Moscow, 2 Saint Petersburg, 113 all of Russia. |
| experience | string | No | Any | noExperience, between1And3, between3And6, moreThan6. |
| schedule | string | No | Any | remote, fullDay, shift, flexible, flyInFlyOut. |
| employment | string | No | Any | full, part, project, volunteer, probation. |
| results_wanted | integer | No | 20 | Max vacancies to collect (billed rows). hh.ru returns at most 2,000 per search. |
| max_pages | integer | No | 20 | Safety limit on search pages scanned (50 vacancies per page). |
| api_only | boolean | No | true | Keep the summary record when a detail page cannot be loaded. |
| include_raw_data | boolean | No | false | Attach the raw hh.ru payload under a raw field. |
| proxyConfiguration | object | No | Off | Proxy settings. Residential recommended only for very large runs. |
Example inputs
Python developer vacancies in Moscow:
{ "text": "python developer", "area": "1", "results_wanted": 50 }
Remote data-analyst roles across Russia with 1–3 years of experience:
{"text": "data analyst","area": "113","experience": "between1And3","schedule": "remote","results_wanted": 100,"max_pages": 10}
Start from a saved search URL:
{"startUrl": "https://hh.ru/search/vacancy?area=2&experience=between1And3&search_field=description&text=golang","results_wanted": 25}
Collect one fully detailed vacancy:
{ "startUrl": "https://hh.ru/vacancy/132160978", "results_wanted": 1 }
What data can you extract from hh.ru?
| Field | Description |
|---|---|
| vacancy_id | hh.ru vacancy ID |
| title | Vacancy title |
| company / employer_id / employer_url | Hiring company and its hh.ru profile |
| location | City and address when available |
| salary / salary_from / salary_to / salary_currency / salary_is_gross | Salary summary and structured bounds |
| experience | Required experience level |
| employment_type | full, part, project, volunteer, probation |
| schedule | fullDay, remote, shift, flexible, flyInFlyOut |
| work_format | ON_SITE, REMOTE, HYBRID |
| work_schedule_by_days / working_hours | Working pattern when published |
| skills | Key skills listed for the role |
| description_text / description_html | Plain-text and HTML job description |
| date_posted / date_expires | Publication and expiry timestamps |
| responses_count | Current number of applicants |
| url / apply_url | Direct vacancy and apply links |
| source / scraped_at | Source label and collection timestamp |
Output example
{"vacancy_id": "114811554","title": "SQL-программист / Разработчик баз данных","company": "Аптечная сеть Ваша №1 х Таблетка.ру","employer_id": "3344320","employer_url": "https://hh.ru/employer/3344320","location": "Москва","salary": "from 150000 RUR net","salary_from": 150000,"salary_currency": "RUR","salary_is_gross": false,"experience": "between3And6","employment_type": "full","schedule": "fullDay","work_format": ["ON_SITE"],"skills": ["SQL", "Python", "PostgreSQL", "MS SQL"],"description_text": "Full plain text vacancy description...","description_html": "<p>Full HTML vacancy description...</p>","date_posted": "2026-07-17T11:51:56.233+03:00","date_expires": "2026-08-16T11:51:56+03:00","responses_count": 42,"url": "https://hh.ru/vacancy/114811554","apply_url": "https://hh.ru/applicant/vacancy_response?vacancyId=114811554","source": "hh.ru","scraped_at": "2026-08-10T07:14:35.150Z"}
Download the dataset as JSON, CSV, Excel, HTML, or XML from the Storage tab or the Apify API.
Use cases
- Salary benchmarking — aggregate published RUR ranges by role, region, and experience.
- Skills-demand research — track which skills appear most across a keyword or region over time.
- Recruitment intelligence — watch response counts and time-to-expiry to see how competitive a role is.
- Company monitoring — start from a
search_field=company_nameURL and collect everything one employer posts. - Jobs aggregator — power a Russian-market job product with structured, deduplicated vacancies.
How it works
- Search — the scraper requests hh.ru's search results page and reads the embedded state (50 vacancies per page), applying
text,area,experience,schedule, andemployment. - Detail — each vacancy page is fetched and parsed for the full salary, key skills, description (text + HTML), work format, and expiry.
- Resilience — the HTTP session rotates automatically and backs off when hh.ru throttles, so large runs stay complete.
- Rows stream to the dataset and stop at
results_wanted(or hh.ru's 2,000-result ceiling).
How much does it cost to scrape hh.ru?
This actor is pay per result — charged once per vacancy saved.
| Plan | Price per 1,000 vacancies |
|---|---|
| Free | $1.39 |
| Bronze | $1.29 |
| Silver | $1.19 |
| Gold | $1.09 |
A small platform Actor start fee also applies per run. results_wanted is the exact number of billed rows. Scraping 1,000 vacancies on the Free plan costs about $1.39. Apify's monthly free platform usage covers small runs.
How to scrape hh.ru
- Click Try for free and sign in to Apify.
- Enter a search keyword and a region code (1 = Moscow, 2 = Saint Petersburg, 113 = all of Russia).
- Optionally set experience, schedule, or employment.
- Set results wanted (start low, e.g. 20).
- Click Start, then watch rows appear in the Output tab.
- Export from Storage, or pull results via the API.
Run it via API
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("parsebird/hh-ru-jobs-scraper").call(run_input={"text": "python developer","area": "1","results_wanted": 50,})for v in client.dataset(run["defaultDatasetId"]).iterate_items():print(v["title"], "-", v["company"], "-", v.get("salary"))
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('parsebird/hh-ru-jobs-scraper').call({text: 'golang',area: '113',experience: 'between3And6',results_wanted: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Schedule recurring runs, add webhooks, or push results to Google Sheets, Slack, Zapier, and Make with Apify integrations.
FAQ
Do I need an hh.ru account or API key? No. The scraper reads public hh.ru vacancy pages only. hh.ru's official API blocks datacenter and non-Russian IPs, so this actor reads the website's embedded data instead.
How current is the data? Live. Each run reads hh.ru at that moment. Use Apify's scheduler to keep a dataset fresh.
Why is results_wanted limited in practice?
hh.ru never returns past the 2,000th result of any search. Narrow the search (region, keyword, filters) to reach vacancies beyond that.
Some vacancies came back without a description or skills — why?
Those rows are summary records: the vacancy's detail page could not be loaded on that pass (usually a transient block). With api_only: true (default) they are kept anyway; re-running usually fills them in.
Where do I find a region code?
Open https://api.hh.ru/areas or read the area= value in any hh.ru search URL.
Something's not working. Open an issue on the Issues tab with your input and the run link — we respond quickly.
Is it legal to scrape hh.ru?
Scraping publicly available pages is legal in most jurisdictions, and this actor only reads vacancy pages any visitor can see — no login, no private data. You are responsible for how you use the data — respect hh.ru's Terms of Use and applicable law (including Russian data-protection rules) when handling any personal data, and consult a lawyer if you are unsure. See Apify's guide on the legality of web scraping.
Related actors
- Instahyre Jobs Scraper — India tech jobs with employer context.
- MyCareersFuture Singapore Jobs Scraper — Singapore's national jobs portal.
- Indeed Jobs Scraper — job listings from Indeed worldwide.
- Freshersworld Jobs Scraper — India fresher and entry-level jobs.
Browse all ParseBird actors on Apify Store.