hh.ru Job Scraper
Pricing
from $1.00 / 1,000 results
hh.ru Job Scraper
Instantly extract job listings from HeadHunter (hh.ru), the leading recruitment platform in Russia and the CIS. This blazing-fast scraper delivers detailed vacancy data in seconds. Supercharge your HR analytics and job market research with high-speed, structured data extraction.
Pricing
from $1.00 / 1,000 results
Rating
5.0
(2)
Developer
Shahid Irfan
Actor stats
3
Bookmarked
47
Total users
11
Monthly active users
21 hours ago
Last modified
Categories
Share
hh.ru Jobs Scraper
Extract job vacancy data from hh.ru with fast automated collection. Gather job titles, employers, locations, salaries, schedules, descriptions, and apply links in a clean dataset built for recruiting teams, market research, monitoring, and vacancy intelligence workflows.
Features
- Fast Collection by Default — Uses the fastest stable collection path and avoids browser overhead.
- Flexible Entry Points — Start from keywords, filtered search URLs, saved searches, or a direct vacancy URL.
- Flat Output by Default — Returns clean vacancy records without large duplicated raw payloads.
- Summary Fallback on Detail Gaps — Keeps stable summary records when some detail attributes are unavailable.
- Clean Structured Output — Removes duplicate vacancy records and strips empty or null values automatically.
- Pagination at Scale — Continues through result pages until your target result count is reached.
- Ready for Automation — Fits recurring monitoring, reporting, enrichment, and downstream pipelines.
Use Cases
Recruitment Intelligence
Track open roles, salary bands, and required skills across employers to improve hiring strategy.
Labor Market Analysis
Build datasets for demand trends, role distribution, and regional hiring activity.
Competitive Monitoring
Monitor how similar companies position roles, compensation, and requirements over time.
Job Data Products
Feed job boards, analytics dashboards, and reporting workflows with regularly refreshed vacancy data.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
startUrl | String | No | - | Start from a specific hh.ru search URL or a direct vacancy URL. |
text | String | No | - | Search query such as a role title or keyword. |
area | String | No | "1" | Region code (for example 1 for Moscow, 113 for all Russia). |
experience | String | No | "" | Experience filter: noExperience, between1And3, between3And6, moreThan6. |
schedule | String | No | "" | Schedule filter: remote, fullDay, shift, flexible, flyInFlyOut. |
employment | String | No | "" | Employment filter: full, part, project, volunteer, probation. |
results_wanted | Integer | No | 20 | Maximum number of vacancies to collect. |
max_pages | Integer | No | 20 | Maximum number of result pages to process. |
api_only | Boolean | No | true | Keep the run on the fast primary collection path only. When details are unavailable, the actor saves the summary record and continues. |
include_raw_data | Boolean | No | false | Include the large nested raw payload in each item. Leave disabled for smaller, flatter datasets. |
proxyConfiguration | Object | No | Off | Proxy settings for more stable large-volume runs. |
Output Data
Each dataset item includes job-relevant fields when available. Some detail-only fields can be absent when a vacancy does not expose them:
| Field | Type | Description |
|---|---|---|
vacancy_id | String | Vacancy identifier. |
title | String | Vacancy title. |
company | String | Employer name. |
employer_id | String | Employer identifier. |
employer_url | String | Employer profile URL. |
location | String | Vacancy location. |
address | Object | Structured address details (when available). |
salary | String | Human-readable salary string. |
salary_from | Number | Salary lower bound. |
salary_to | Number | Salary upper bound. |
salary_currency | String | Salary currency code. |
salary_is_gross | Boolean | Salary tax mode indicator. |
experience | String | Required experience level. |
employment_type | String | Employment type label. |
employment_form | String | Employment form label. |
schedule | String | Work schedule label. |
work_format | Array | Work format values. |
working_hours | Array | Working hour options. |
work_schedule_days | Array | Schedule-by-days values. |
working_time_intervals | Array | Shift interval values. |
working_time_modes | Array | Time mode values. |
skills | Array | Key skills. |
professional_roles | Array | Professional role labels. |
specializations | Array | Specialization labels. |
languages | Array | Language requirements. |
description_html | String | Vacancy description in HTML. |
description_text | String | Plain text description. |
requirement_snippet | String | Short requirements snippet (if present). |
responsibility_snippet | String | Short responsibilities snippet (if present). |
date_posted | String | Vacancy publication timestamp. |
date_expires | String | Vacancy expiry timestamp when available. |
date_created | String | Vacancy creation timestamp. |
date_first_created | String | Initial creation timestamp. |
applicant_location_requirements | String | Applicant geography requirement when available. |
url | String | Vacancy URL. |
apply_url | String | Direct apply URL. |
premium | Boolean | Premium listing indicator. |
archived | Boolean | Archived listing indicator. |
has_test | Boolean | Test assignment indicator. |
response_letter_required | Boolean | Cover letter requirement indicator. |
accept_temporary | Boolean | Temporary work acceptance. |
accept_incomplete_resumes | Boolean | Incomplete resume acceptance. |
internship | Boolean | Internship flag. |
night_shifts | Boolean | Night shifts flag. |
source | String | Data source label. |
scraped_at | String | Collection timestamp. |
api_data | Object | Optional raw vacancy payload, included only when include_raw_data=true. |
Usage Examples
Basic Keyword Search
{"text": "python developer","area": "1","results_wanted": 50}
Remote Jobs With Experience Filter
{"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=99&saved_search_id=88196915&no_magic=true&employer_id=3388&experience=between1And3&search_field=description","results_wanted": 25,"max_pages": 5}
Start From a Direct Vacancy URL
{"startUrl": "https://hh.ru/vacancy/132160978","results_wanted": 1}
Proxy Configuration Example
{"text": "golang","area": "1","results_wanted": 120,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Sample Output
{"vacancy_id": "132160978","title": "AI-разработчик","company": "EdAgency (ИП Синицын Антон Сергеевич)","employer_id": "9603653","location": "Moscow","experience": "1–3 года","employment_type": "Полная занятость","employment_form": "Договор ГПХ с самозанятым","schedule": "5/2","work_format": ["удалённо"],"working_hours": ["6 или по договорённости"],"description_text": "Full plain text vacancy description...","date_posted": "2026-04-18T12:14:09.154+03:00","date_expires": "2026-05-15T12:14:09.154+03:00","applicant_location_requirements": "Россия","url": "https://hh.ru/vacancy/132160978","apply_url": "https://hh.ru/applicant/vacancy_response?vacancyId=132160978&employerId=9603653","source": "hh.ru","scraped_at": "2026-02-16T10:30:00.000Z"}
Tips for Best Results
Search Strategy
- Use focused role keywords (for example,
python developer,product manager). - Narrow by
areawhen you need region-specific insights. - Add
experience,schedule, andemploymentfilters to reduce noise.
URL Selection
- Use
startUrlwhen you already have a complex search page with saved filters. - Use a direct vacancy URL when you want a single rich vacancy record.
- Keep search URLs on hh.ru and avoid unrelated pages.
Collection Size
- Start with
results_wantedbetween20and100for test runs. - Increase limits gradually for production collections.
- Use
max_pagesas a safety cap for predictable run size.
Reliability
- Use residential proxies for larger runs.
- Run on schedules to keep your dataset fresh.
- Monitor run output metrics such as
totalResults,durationSeconds, andaverageSpeed.
Collection Strategy
- Default runs use the fastest stable collection path and keep output lightweight.
- Set
api_only=falseonly if you want the actor to allow slower fallback parsing when the primary path is unavailable. - Set
include_raw_data=trueonly when you explicitly need the large nested source payload in every item.
Integrations
Connect your dataset with:
- Google Sheets - Share and analyze data quickly.
- Airtable - Build searchable vacancy databases.
- Looker Studio / BI tools - Create hiring trend dashboards.
- Webhooks - Push records into custom pipelines.
- Make - Automate no-code workflows.
- Zapier - Trigger downstream actions.
Export Formats
- JSON - Development and API workflows.
- CSV - Spreadsheet analysis.
- Excel - Business reporting.
- XML - System integration workflows.
Frequently Asked Questions
Does this actor always collect full vacancy details automatically?
Not always. Some vacancies expose fewer details than others. When the actor cannot enrich a vacancy fully, it keeps the best available summary record instead of failing the run.
Are empty and null fields included in output?
No. Output records are cleaned so empty and null values are removed automatically.
Can it start from a direct vacancy URL?
Yes. Provide a vacancy URL in startUrl to collect a single detailed vacancy record.
Can I scrape all Russia instead of one city?
Yes. Use area: "113" for nationwide collection.
How can I get remote-only jobs?
Set schedule to "remote" in the input.
How do I get the raw nested source payload?
Set include_raw_data to true. By default it is disabled so the dataset stays smaller and flatter.
What if some fields are missing in a vacancy?
Some vacancies do not publish every attribute. Only available non-empty fields are returned.
Can I run this actor on a schedule?
Yes. You can schedule runs in Apify to keep job data continuously updated.
Support
For issues or feature requests, contact support through the Apify Console.
Resources
Legal Notice
This actor is intended for legitimate data collection and analysis. You are responsible for complying with website terms, platform policies, and applicable laws in your jurisdiction.