hh.ru Jobs Scraper avatar

hh.ru Jobs Scraper

Pricing

from $1.09 / 1,000 vacancy scrapeds

Go to Apify Store
hh.ru Jobs Scraper

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

ParseBird

Maintained by Community

Actor 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/areas
experience: "" | "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 rows
max_pages: int (default 20, 50 vacancies per page)
api_only: bool (default true) — keep the summary record when a vacancy detail page is unavailable
include_raw_data: bool (default false) — attach the raw hh.ru payload to each item
proxyConfiguration: { "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

ParameterTypeRequiredDefaultDescription
startUrlstringNoAn hh.ru search URL or a single vacancy URL. Overrides the search fields.
textstringNoSearch keyword (role or skill).
areastringNo1hh.ru region code. 1 Moscow, 2 Saint Petersburg, 113 all of Russia.
experiencestringNoAnynoExperience, between1And3, between3And6, moreThan6.
schedulestringNoAnyremote, fullDay, shift, flexible, flyInFlyOut.
employmentstringNoAnyfull, part, project, volunteer, probation.
results_wantedintegerNo20Max vacancies to collect (billed rows). hh.ru returns at most 2,000 per search.
max_pagesintegerNo20Safety limit on search pages scanned (50 vacancies per page).
api_onlybooleanNotrueKeep the summary record when a detail page cannot be loaded.
include_raw_databooleanNofalseAttach the raw hh.ru payload under a raw field.
proxyConfigurationobjectNoOffProxy 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?

FieldDescription
vacancy_idhh.ru vacancy ID
titleVacancy title
company / employer_id / employer_urlHiring company and its hh.ru profile
locationCity and address when available
salary / salary_from / salary_to / salary_currency / salary_is_grossSalary summary and structured bounds
experienceRequired experience level
employment_typefull, part, project, volunteer, probation
schedulefullDay, remote, shift, flexible, flyInFlyOut
work_formatON_SITE, REMOTE, HYBRID
work_schedule_by_days / working_hoursWorking pattern when published
skillsKey skills listed for the role
description_text / description_htmlPlain-text and HTML job description
date_posted / date_expiresPublication and expiry timestamps
responses_countCurrent number of applicants
url / apply_urlDirect vacancy and apply links
source / scraped_atSource 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_name URL and collect everything one employer posts.
  • Jobs aggregator — power a Russian-market job product with structured, deduplicated vacancies.

How it works

  1. Search — the scraper requests hh.ru's search results page and reads the embedded state (50 vacancies per page), applying text, area, experience, schedule, and employment.
  2. Detail — each vacancy page is fetched and parsed for the full salary, key skills, description (text + HTML), work format, and expiry.
  3. Resilience — the HTTP session rotates automatically and backs off when hh.ru throttles, so large runs stay complete.
  4. 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.

PlanPrice 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

  1. Click Try for free and sign in to Apify.
  2. Enter a search keyword and a region code (1 = Moscow, 2 = Saint Petersburg, 113 = all of Russia).
  3. Optionally set experience, schedule, or employment.
  4. Set results wanted (start low, e.g. 20).
  5. Click Start, then watch rows appear in the Output tab.
  6. Export from Storage, or pull results via the API.

Run it via API

Python:

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

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.

Browse all ParseBird actors on Apify Store.