# HH.kz Job Scraper — Vacancies, Salaries & Employers (`yadroo/hh-kz-vacancies`) Actor

hh.kz (HeadHunter Kazakhstan) vacancies for recruiters, salary benchmarking, B2B lead-gen and AI agents: all site filters (city, role, industry, employer, experience, schedule, format, salary), salary range, employer, address, optional full vacancy text and skills.

- **URL**: https://apify.com/yadroo/hh-kz-vacancies.md
- **Developed by:** [Samat Makatov](https://apify.com/yadroo) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 result items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Structured vacancies from **hh.kz** (HeadHunter Kazakhstan), the country's largest job board — also works for hh.ru and hh.uz. Every hh.kz search filter is available: city or region, professional role, industry, employer, experience, employment type, schedule, work format, salary with currency, labels such as "no agencies", exclusion words, publication period and sort. Each vacancy comes with salary range, employer (id, verified, accredited IT), address with coordinates, experience, schedule, work format, publication date and number of responses; `detail: true` adds the full description, key skills and contacts published by the employer. Built for recruiters, HR analytics, B2B sales teams and AI agents.

No API key, no proxy, no browser — plain HTTP to the public hh.kz pages (hh's official API now answers 403 to anonymous clients, so the actor reads the data embedded in the site pages).

### Use cases

- **Salary benchmarking** — pull all "бухгалтер" or "Python" vacancies in Almaty with `onlyWithSalary: true` and compute median `salaryFrom`/`salaryTo` by `experience`.
- **B2B lead generation** — companies that are hiring are companies that are growing: `professionalRoles` + `area` + the **Employers** view gives a fresh list of employers with ids and pages; `detail: true` adds the full vacancy text and key skills (hh now shows contacts only after a click, so they are rarely in the data).
- **Competitor hiring monitor** — `employerId` of a competitor, scheduled daily, shows which roles they open and at what pay.
- **Fresh-vacancy alerts** — `sinceHours: 2` hourly for a role in your city, push to Slack/Telegram.
- **Labour-market research** — demand by region (`area`), industry (`industry`) and work format (`workFormat: ["REMOTE"]`), with `searchTotal` as market size.
- **Job-search agents** — feed an LLM with description + key skills to match candidates.

### Input

All fields are optional, but give at least one of `query`, `employerId`, `professionalRoles`.

| Field | Type | Default | Allowed values / notes |
|---|---|---|---|
| `query` | string | – | hh search syntax: `"exact phrase"`, `OR`, `NOT`, `!word`. |
| `site` | string | `hh.kz` | `hh.kz`, `hh.ru`, `hh.uz` |
| `area` | string | – | Area id, Russian name or latin alias; several comma-separated (`"160,159"`, `"almaty, Астана"`). Empty = the whole country of the site (hh.kz → Kazakhstan `40`, hh.ru → Russia `113`, hh.uz → Uzbekistan `97`). See **Reference → Areas**. |
| `searchFields` | string\[] | all | `name`, `company_name`, `description` |
| `excludeWords` | string\[] | `[]` | Exclude vacancies containing these words. |
| `professionalRoles` | string\[] | `[]` | Role ids or exact Russian names (`96` programmer, `18` accountant). **Reference → Professional roles**. |
| `industry` | string\[] | `[]` | Industry ids (`7` IT, `43` finance) or sub-industry `7.540`. |
| `employerId` | string | – | Number from `https://hh.kz/employer/<id>`. |
| `experience` | string | `""` | One of `noExperience`, `between1And3`, `between3And6`, `moreThan6`. |
| `employment` | string\[] | `[]` | `full`, `part`, `project`, `volunteer`, `probation` |
| `schedule` | string\[] | `[]` | `fullDay`, `shift`, `flexible`, `remote`, `flyInFlyOut` |
| `workFormat` | string\[] | `[]` | `ON_SITE`, `REMOTE`, `HYBRID`, `FIELD_WORK` |
| `partTime` | string\[] | `[]` | See Reference. |
| `labels` | string\[] | `[]` | `not_from_agency`, `with_address`, `accredited_it`, `low_performance`, … |
| `salaryFrom` | integer | – | Salary range must include this amount (in `currency`). |
| `currency` | string | `KZT` | `KZT`, `USD`, `EUR`, `RUR` (Russian rubles, as hh writes them), `UZS`, `KGS`, … — full list in **Reference → Currencies**. |
| `onlyWithSalary` | boolean | `false` | Drop vacancies without salary. |
| `period` | string | `""` | `1`, `3`, `7`, `30` days (server-side). |
| `sinceHours` | integer | – | Published within N hours; switches sort to newest and stops paging at the first older vacancy. |
| `sort` | string | `relevance` | `relevance`, `publication_time`, `salary_desc`, `salary_asc` |
| `maxItems` | integer | `50` | 1–2000 (hh never returns more than 2000 per search). |
| `maxPages` | integer | `20` | 1–20 (100 vacancies per page). |
| `detail` | boolean | `false` | Open each vacancy: description, key skills, archived flag, professional roles, coordinates; contacts only when hh puts them on the page (rare: hh now loads them after a click). +1 request per vacancy. |
| `dedupe` | boolean | `true` | Skip a vacancy id already saved in this run (hh sometimes shows one vacancy on two pages). |
| `fields` | string\[] | `[]` | Keep only these output fields, in this order (names from **Output**). `id`, `url` and `detailError` are always kept. Letter case and spaces are forgiven (`"salary from"` → `salaryFrom`); an unknown name is skipped with a "did you mean" warning in the status and `SUMMARY`; if no name is valid the run stops before anything is charged except the start. |

Every filter is applied by hh itself, so counts match the site.

**Wrong values.** The select fields (`site`, `experience`, `employment`, `schedule`, `workFormat`, `partTime`, `labels`, `searchFields`, `currency`, `period`, `sort`) accept only the values listed in **Reference**: Apify refuses any other value before the run starts and shows the allowed list — no run, no charge. The free-text filters `area`, `professionalRoles` and `industry` must name something known: an unknown city, role name or a non-numeric industry stops the run with a "did you mean" hint (only the start is charged). A filter is never dropped silently — that would quietly search the whole country. Numeric area and role ids that are not in the tables below (for example hh.ru cities) are passed to hh as they are, with a warning in the log.

### Reference

#### Areas (`area`)

Kazakhstan = `40`. Regions and their towns (hh area ids). Russian names and these latin aliases also work: `kazakhstan`→40, `kz`→40, `almaty`→160, `astana`→159, `nur-sultan`→159, `shymkent`→205, `karaganda`→177, `karagandy`→177, `aktobe`→154, `aktau`→152, `atyrau`→153, `pavlodar`→181, `oskemen`→194, `ust-kamenogorsk`→194, `semey`→185, `kostanay`→172, `kostanai`→172, `kyzylorda`→174, `oral`→193, `uralsk`→193, `petropavlovsk`→180, `petropavl`→180, `taraz`→187, `taldykorgan`→188, `turkestan`→192, `kokshetau`→176, `temirtau`→190, `ekibastuz`→198, `zhezkazgan`→166, `rudny`→182, `konaev`→171, `kapchagay`→171, `atyrau-region`→17955.

| Region / city | id | Towns (id) |
|---|---|---|
| Абайская область | `17951` | Арташат `11484`, Аягоз (Абайская область) `157`, Батпак `5118`, Жезкент `6989`, Калбатау `11163`, Кокпекты `6513`, Курчатов (Казахстан) `5051`, Маканчи `6512`, Семей `185`, Урджар `6453`, Чарск (Шар) `3704` |
| Акмолинская область | `17952` | Акколь `2728`, Астраханка `6529`, Атбасар `3663`, Бурабай `5129`, Державинск `11076`, Ерейментау (Акмолинская область) `165`, Есиль `6292`, Жаксы `5124`, Жибек Жолы `11330`, Зеренда `11183`, Кокшетау `176`, Косшы `6393`, Макинск `2950`, Софиевка (Казахстан) `6186`, Степногорск `2437`, Степняк `5164`, Тасты-Талды `7003`, Щучинск `197`, Дамса (Акмолинская область) `18129` |
| Актюбинская область | `17953` | Актобе `154`, Алга (Актюбинская область) `156`, Жем `6947`, Кандыагаш `3074`, Карауылкельды `11078`, Кобда `11768`, Мартук (Актюбинская область) `11291`, Хромтау `195`, Шалкар `6348`, Эмба `6948` |
| Алматы | `160` | – |
| Алматинская область | `17954` | Алатау `11524`, Байсерке ( Алматинская область) `11293`, Боралдай `11180`, Ельтай `11329`, Есик `6287`, Казцик `11237`, Каргалы `11258`, Каскелен `2653`, Кеген `6495`, Конаев `171`, Междуреченское `11238`, Нарынкол `6494`, Отеген-Батыр `6299`, Рыскулово `6501`, Талгар `3048`, Узынагаш (Алматинская область) `6248`, Чунджа `4637`, Шамалган `11231`, Шелек `6108` |
| Астана | `159` | – |
| Атырауская область | `17955` | Аккистау `11083`, Атырау `153`, Кульсары `3034`, Макат (Атырауская область) `11292`, Тенгизское нефтяное месторождение `18564` |
| Восточно-Казахстанская область | `17956` | Алтай (Зыряновск) `169`, Глубокое (Восточно-Казахстанская область) `6431`, Зайсан `168`, Новая Бухтарма `11082`, Риддер (Восточно-Казахстанская область) `183`, Серебрянск `2755`, Солнечное (Глубоковский район) `6480`, Улкен-Нарын `6935`, Усть-Каменогорск `194`, Чапаево `6473`, Шемонаиха (Восточно-Казахстанская область) `196` |
| Жамбылская область | `17957` | Аса `6493`, Бауыржан Момышулы `6488`, Жанатас `167`, Каратау `178`, Кордай `4491`, Кулан `6487`, Мерке `6486`, Мойынкум `6485`, Сарыкемер `6484`, Тараз `187`, Шу `2729` |
| Жетысуская область | `17958` | Актогай (Жетысуская область) `6365`, Балпык-Би (Жетысуская область) `6497`, Достык (Жетысуская область) `17633`, Жансугуров `6496`, Жаркент `6104`, Кабанбай `6460`, Карабулак (Жетысуская область) `6358`, Матай `11333`, Сарканд `4304`, Сарыозек `6459`, Талдыкорган `188`, Текели `189`, Ушарал `6349`, Уштобе `6250` |
| Западно-Казахстанская область | `17959` | Аксай (Казахстан) `150`, Дарьинское `6483`, Жангала `6482`, Жанибек `6481`, Жымпиты `6479`, Каратобе `6478`, Перемётное `6477`, Сайхин `6476`, Тайпак `6475`, Таскала `6474`, Уральск `193`, Чингирлау `6472` |
| Карагандинская область | `17960` | Абай `6251`, Атасу `6351`, Балхаш `164`, Караганда `177`, Каркаралинск `6342`, Осакаровка `5117`, Приозёрск (Карагандинская область) `6395`, Сарань `6017`, Темиртау `190`, Шахтинск `6290` |
| Костанайская область | `17961` | Айет `6782`, Аркалык `161`, Аулиеколь `5053`, Боровской `6778`, Бауманское (Костанайская область) `17639`, Житикара `6322`, Карабалык `5054`, Качар `5052`, Костанай `172`, Кушмурун `6780`, Лисаковск `6297`, Рудный `182`, Сарыколь `6779`, Тобыл `11723`, Торгай `191`, Фёдоровка `6781` |
| Кызылординская область | `17962` | Айтеке-Би `11071`, Аральск `158`, Байконур (Кызылординская область) `2226`, Жалагаш (Кызылординская область) `6347`, Жанакорган `6446`, Жосалы (Кызылординская область) `6346`, Казалы (Кызылординская область) `175`, Кызылорда `174`, Саксаульский `5126`, Теренозек `11194`, Торетам `6344`, Шиели `6324` |
| Мангистауская область | `17963` | Актау `152`, Баутино `162`, Бейнеу (Мангистауская область) `163`, Жанаозен `2510`, Жетыбай (Мангистауская область) `6525`, Курык `11162`, Мангистау `6244`, Шетпе `6524` |
| Павлодарская область | `17964` | Аксу (Павлодарская область) `151`, Иртышск `11332`, Павлодар `181`, Солнечный (ПГТ, Павлодарская область) `186`, Торткудук `6366`, Экибастуз `198` |
| Северо-Казахстанская область | `17965` | Бесколь `5055`, Новоишимское `5056`, Петропавловск `180`, Рассвет (Кызылжарский район) `11275`, Сергеевка (Северо-Казахстанская область) `6060`, Тайынша `5042`, Талшик `6325` |
| Туркестанская область | `17966` | Аксукент `6254`, Арысь (Туркестанская область) `6300`, Арысь (ЮКО) `155`, Асыката `6511`, Атакент `6510`, Жетысай `2952`, Жетысу `11331`, Казыгурт `6509`, Карабулак (Сайрамский район) `11072`, Кентау (Туркестанская область) `173`, Ленгер (Туркестанская область) `179`, Мырзакент `6503`, Сайрам `6502`, Сарыагаш `2951`, Село имени Турара Рыскулова `11073`, Темирлановка `11525`, Туркестан `192`, Шардара `6388`, Шаульдер `6500`, Шаян `6499`, Шолаккорган `6498` |
| Улытауская область | `17967` | Жайрем `6343`, Жезказган `166`, Каражал `6471`, Сатпаев `184` |
| Шымкент | `205` | – |

Other countries: Russia `113` (Moscow `1`, St Petersburg `2`), Uzbekistan `97`, Kyrgyzstan `48`, Belarus `16` — full tree at https://api.hh.ru/areas.

#### Professional roles (`professionalRoles`)

<details><summary>Продажи, обслуживание клиентов (21)</summary>

Агент по недвижимости `6` · Аналитик `10` · Брокер `154` · Кассир-операционист `51` · Коммерческий директор (CCO) `53` · Координатор отдела продаж `54` · Кредитный специалист `57` · Менеджер по продажам, менеджер по работе с клиентами `70` · Менеджер по работе с партнерами `71` · Оператор call-центра, специалист контактного центра `83` · Оператор почтовой связи `187` · Продавец-консультант, продавец-кассир `97` · Руководитель отдела клиентского обслуживания `105` · Руководитель отдела продаж `106` · Руководитель отдела страхования и кредитования `188` · Руководитель филиала `161` · Сотрудник пункта выдачи заказов `190` · Специалист по сертификации `151` · Специалист технической поддержки `121` · Страховой агент `122` · Торговый представитель `129`

</details>
<details><summary>Розничная торговля (8)</summary>

Администратор магазина, администратор торгового зала `9` · Директор магазина, директор сети магазинов `35` · Категорийный менеджер `180` · Мерчандайзер `77` · Продавец-консультант, продавец-кассир `97` · Промоутер `99` · Супервайзер `123` · Товаровед `127`

</details>
<details><summary>Финансы, бухгалтерия (13)</summary>

Аудитор `16` · Брокер `154` · Бухгалтер `18` · Казначей `50` · Комплаенс-менеджер `158` · Кредитный специалист `57` · Методолог `155` · Специалист по взысканию задолженности `147` · Финансовый аналитик, инвестиционный аналитик `134` · Финансовый директор (CFO) `135` · Финансовый контролер `136` · Финансовый менеджер `137` · Экономист `142`

</details>
<details><summary>Стратегия, инвестиции, консалтинг (5)</summary>

Аналитик `10` · Бизнес-аналитик `150` · Менеджер/консультант по стратегии `75` · Руководитель проектов `107` · Финансовый аналитик, инвестиционный аналитик `134`

</details>
<details><summary>Административный персонал (10)</summary>

Администратор `8` · Делопроизводитель, архивариус `33` · Курьер, Почтальон `58` · Менеджер/руководитель АХО `76` · Оператор ПК, оператор базы данных `84` · Оператор почтовой связи `187` · Офис-менеджер `88` · Переводчик `93` · Секретарь, помощник руководителя, ассистент `110` · Сотрудник пункта выдачи заказов `190`

</details>
<details><summary>Маркетинг, реклама, PR (16)</summary>

Event-менеджер `1` · PR-менеджер `2` · SMM-менеджер, контент-менеджер `3` · Аналитик `10` · Арт-директор, креативный директор `12` · Бренд-менеджер `176` · Дизайнер, художник `34` · Директор по маркетингу и PR (CMO) `37` · Копирайтер, редактор, корректор `55` · Маркетолог-аналитик `163` · Менеджер маркетплейсов `182` · Менеджер по маркетингу, интернет-маркетолог `68` · Менеджер по продажам, менеджер по работе с клиентами `70` · Менеджер по работе с партнерами `71` · Промоутер `99` · Руководитель отдела маркетинга и рекламы `170`

</details>
<details><summary>Производство, сервисное обслуживание (32)</summary>

Инженер КИПиА `177` · Инженер ПНР `174` · Инженер по качеству `44` · Инженер по охране труда и технике безопасности, инженер-эколог `45` · Инженер по эксплуатации `46` · Инженер слаботочных систем/Инженер связи `178` · Инженер-конструктор, инженер-проектировщик `48` · Инженер-электроник, инженер-электронщик `169` · Инженер-энергетик, инженер-электрик `144` · Контролёр ОТК `149` · Лаборант `168` · Мастер по ремонту оборудования, техники `162` · Машинист `63` · Менеджер по качеству `183` · Метролог `152` · Механик `173` · Научный специалист, исследователь `79` · Начальник производства, Главный инженер производства `80` · Начальник смены, мастер участка `82` · Оператор производственной линии, Кочегар/Оператор котельной `85` · Оператор станков с ЧПУ `86` · Руководитель службы эксплуатации `189` · Сварщик `109` · Сервисный инженер, инженер-механик `111` · Слесарь, сантехник `115` · Специалист по сертификации `151` · Столяр, плотник `193` · Стропальщик, Такелажник `192` · Технолог `49` · Токарь, фрезеровщик, шлифовщик `128` · Швея, портной, закройщик `141` · Электромонтажник, электромонтер, техник-электрик `143`

</details>
<details><summary>Добыча сырья (7)</summary>

Геодезист `27` · Геолог `28` · Лаборант `168` · Машинист `63` · Научный специалист, исследователь `79` · Начальник смены, мастер участка `82` · Технолог `49`

</details>
<details><summary>Сельское хозяйство (6)</summary>

Агроном `7` · Ветеринарный врач `19` · Зоотехник `43` · Машинист `63` · Сервисный инженер, инженер-механик `111` · Технолог `49`

</details>
<details><summary>Транспорт, логистика, перевозки (11)</summary>

Бортпроводник `159` · Водитель, экспедитор `21` · Грузчик `31` · Диспетчер `39` · Кладовщик, Приемщик товаров `52` · Курьер, Почтальон `58` · Машинист `63` · Менеджер по логистике, менеджер по ВЭД, начальник транспортного отдела `67` · Начальник склада `81` · Руководитель отдела логистики `172` · Упаковщик, комплектовщик, маркировщик `131`

</details>
<details><summary>Информационные технологии (25)</summary>

BI-аналитик, аналитик данных `156` · DevOps-инженер `160` · Аналитик `10` · Арт-директор, креативный директор `12` · Бизнес-аналитик `150` · Гейм-дизайнер `25` · Дата-сайентист `165` · Дизайнер, художник `34` · Директор по информационным технологиям (CIO) `36` · Менеджер продукта `73` · Методолог `155` · Программист, разработчик `96` · Продуктовый аналитик `164` · Руководитель группы разработки `104` · Руководитель отдела аналитики `157` · Руководитель проектов `107` · Сетевой инженер `112` · Системный администратор `113` · Системный аналитик `148` · Системный инженер `114` · Специалист по информационной безопасности `116` · Специалист технической поддержки `121` · Тестировщик `124` · Технический директор (CTO) `125` · Технический писатель `126`

</details>
<details><summary>Управление персоналом, тренинги (8)</summary>

Бизнес-тренер `17` · Директор по персоналу (HRD) `38` · Куратор/тьютор обучения `181` · Менеджер по компенсациям и льготам `153` · Менеджер по персоналу `69` · Руководитель отдела персонала `171` · Специалист по кадрам `117` · Специалист по подбору персонала `118`

</details>
<details><summary>Юристы (4)</summary>

Директор юридического департамента (CLO) `166` · Комплаенс-менеджер `158` · Юрисконсульт `145` · Юрист `146`

</details>
<details><summary>Закупки (2)</summary>

Менеджер по закупкам `66` · Специалист по тендерам `119`

</details>
<details><summary>Безопасность (5)</summary>

Военнослужащий `22` · Охранник `90` · Полицейский `95` · Специалист по информационной безопасности `116` · Специалист службы безопасности `120`

</details>
<details><summary>Домашний, обслуживающий персонал (10)</summary>

Администратор `8` · Водитель, экспедитор `21` · Воспитатель, няня `23` · Дворник `32` · Курьер, Почтальон `58` · Мойщик посуды, Помощник повара `184` · Официант, бармен, бариста `89` · Охранник `90` · Санитарка/санитар `194` · Уборщица, уборщик `130`

</details>
<details><summary>Рабочий персонал (23)</summary>

Автослесарь, автомеханик `5` · Бетонщик, арматурщик, каменщик `175` · Водитель, экспедитор `21` · Грузчик `31` · Кладовщик, Приемщик товаров `52` · Маляр, штукатур, отделочник `59` · Машинист `63` · Механик `173` · Мойщик посуды, Помощник повара `184` · Монтажник `78` · Монтер пути `185` · Оператор производственной линии, Кочегар/Оператор котельной `85` · Оператор станков с ЧПУ `86` · Разнорабочий `102` · Сварщик `109` · Сервисный инженер, инженер-механик `111` · Слесарь, сантехник `115` · Сотрудник ресторана быстрого питания `191` · Столяр, плотник `193` · Стропальщик, Такелажник `192` · Токарь, фрезеровщик, шлифовщик `128` · Упаковщик, комплектовщик, маркировщик `131` · Электромонтажник, электромонтер, техник-электрик `143`

</details>
<details><summary>Строительство, недвижимость (23)</summary>

Агент по недвижимости `6` · Архитектор `14` · Бетонщик, арматурщик, каменщик `175` · Брокер `154` · Геодезист `27` · Главный инженер проекта `30` · Дизайнер, художник `34` · Инженер ПТО, инженер-сметчик `47` · Инженер по охране труда и технике безопасности, инженер-эколог `45` · Инженер по эксплуатации `46` · Инженер строительного контроля `179` · Инженер-конструктор, инженер-проектировщик `48` · Маляр, штукатур, отделочник `59` · Машинист `63` · Монтажник `78` · Прораб, мастер СМР `100` · Разнорабочий `102` · Руководитель проектов `107` · Руководитель строительного проекта `108` · Сварщик `109` · Слесарь, сантехник `115` · Стропальщик, Такелажник `192` · Электромонтажник, электромонтер, техник-электрик `143`

</details>
<details><summary>Автомобильный бизнес (4)</summary>

Автомойщик `4` · Автослесарь, автомеханик `5` · Мастер-приемщик `62` · Менеджер по продажам, менеджер по работе с клиентами `70`

</details>
<details><summary>Туризм, гостиницы, рестораны (11)</summary>

Администратор `8` · Менеджер по туризму `72` · Менеджер ресторана `74` · Менеджер/руководитель АХО `76` · Мойщик посуды, Помощник повара `184` · Обвальщик/Мясник `186` · Официант, бармен, бариста `89` · Повар, пекарь, кондитер `94` · Сотрудник ресторана быстрого питания `191` · Уборщица, уборщик `130` · Хостес `140`

</details>
<details><summary>Спортивные клубы, фитнес, салоны красоты (7)</summary>

Администратор `8` · Косметолог `56` · Массажист `60` · Мастер ногтевого сервиса `61` · Менеджер по продажам, менеджер по работе с клиентами `70` · Парикмахер `92` · Фитнес-тренер, инструктор тренажерного зала `138`

</details>
<details><summary>Страхование (3)</summary>

Андеррайтер `11` · Оценщик `91` · Страховой агент `122`

</details>
<details><summary>Медицина, фармацевтика (14)</summary>

Администратор `8` · Ассистент врача `15` · Ветеринарный врач `19` · Врач `24` · Главный врач, заведующий отделением `29` · Заведующий аптекой `42` · Лаборант `168` · Медицинская сестра, медицинский брат `64` · Медицинский представитель `65` · Менеджер по качеству `183` · Научный специалист, исследователь `79` · Санитарка/санитар `194` · Специалист по сертификации `151` · Фармацевт-провизор `133`

</details>
<details><summary>Искусство, развлечения, массмедиа (10)</summary>

Арт-директор, креативный директор `12` · Артист, актер, аниматор `13` · Видеооператор, видеомонтажер `20` · Гейм-дизайнер `25` · Дизайнер, художник `34` · Журналист, корреспондент `41` · Копирайтер, редактор, корректор `55` · Продюсер `98` · Режиссер, сценарист `103` · Фотограф, ретушер `139`

</details>
<details><summary>Наука, образование (8)</summary>

Бизнес-тренер `17` · Воспитатель, няня `23` · Куратор/тьютор обучения `181` · Лаборант `168` · Методист `167` · Научный специалист, исследователь `79` · Психолог `101` · Учитель, преподаватель, педагог `132`

</details>
<details><summary>Высший и средний менеджмент (17)</summary>

Генеральный директор, исполнительный директор (CEO) `26` · Директор по информационным технологиям (CIO) `36` · Директор по маркетингу и PR (CMO) `37` · Директор по персоналу (HRD) `38` · Директор юридического департамента (CLO) `166` · Коммерческий директор (CCO) `53` · Начальник производства, Главный инженер производства `80` · Операционный директор (COO) `87` · Руководитель отдела аналитики `157` · Руководитель отдела логистики `172` · Руководитель отдела маркетинга и рекламы `170` · Руководитель отдела персонала `171` · Руководитель отдела страхования и кредитования `188` · Руководитель службы эксплуатации `189` · Руководитель филиала `161` · Технический директор (CTO) `125` · Финансовый директор (CFO) `135`

</details>
<details><summary>Другое (1)</summary>

Другое `40`

</details>

#### Industries (`industry`)

| id | Meaning |
|---|---|
| `5` | Перевозки, логистика, склад, ВЭД |
| `7` | Информационные технологии, системная интеграция, интернет |
| `8` | Электроника, приборостроение, бытовая техника, компьютеры и оргтехника |
| `9` | Телекоммуникации, связь |
| `11` | СМИ, маркетинг, реклама, BTL, PR, дизайн, продюсирование |
| `13` | Строительство, недвижимость, эксплуатация, проектирование |
| `15` | Автомобильный бизнес |
| `19` | Лесная промышленность, деревообработка |
| `24` | Металлургия, металлообработка |
| `27` | Продукты питания |
| `29` | Сельское хозяйство |
| `33` | Тяжелое машиностроение |
| `34` | Химическое производство, удобрения |
| `36` | Государственные организации |
| `37` | Общественная деятельность, партии, благотворительность, НКО |
| `39` | Образовательные учреждения |
| `41` | Розничная торговля |
| `42` | Товары народного потребления (непищевые) |
| `43` | Финансовый сектор |
| `44` | Услуги для бизнеса |
| `45` | Добывающая отрасль |
| `46` | Энергетика |
| `47` | Нефть и газ |
| `48` | Медицина, фармацевтика, аптеки |
| `49` | Услуги для населения |
| `50` | Гостиницы, рестораны, общепит, кейтеринг |
| `51` | ЖКХ |
| `52` | Искусство, культура |
| `388` | Промышленное оборудование, техника, станки и комплектующие |
| `389` | Управление многопрофильными активами |

#### Experience (`experience`)

| Value | Meaning |
|---|---|
| `noExperience` | Нет опыта |
| `between1And3` | От 1 года до 3 лет |
| `between3And6` | От 3 до 6 лет |
| `moreThan6` | Более 6 лет |

#### Employment (`employment`)

| Value | Meaning |
|---|---|
| `full` | Полная занятость |
| `part` | Частичная занятость |
| `project` | Проектная работа |
| `volunteer` | Волонтерство |
| `probation` | Стажировка |

#### Schedule (`schedule`)

| Value | Meaning |
|---|---|
| `fullDay` | Полный день |
| `shift` | Сменный график |
| `flexible` | Гибкий график |
| `remote` | Удаленная работа |
| `flyInFlyOut` | Вахтовый метод |

#### Work format (`workFormat`)

| Value | Meaning |
|---|---|
| `ON_SITE` | На месте работодателя |
| `REMOTE` | Удалённо |
| `HYBRID` | Гибрид |
| `FIELD_WORK` | Разъездной |

#### Part-time (`partTime`)

| Value | Meaning |
|---|---|
| `employment_project` | Project work |
| `employment_part` | Part-time employment |
| `temporary_job_true` | Temporary job |
| `from_four_to_six_hours_in_a_day` | Shifts of 4-6 hours a day |
| `only_saturday_and_sunday` | Saturdays and Sundays only |
| `start_after_sixteen` | Day starts after 16:00 |

#### Labels (`labels`)

| Value | Meaning |
|---|---|
| `with_address` | Только с адресом |
| `accept_handicapped` | Только доступные для людей с инвалидностью |
| `not_from_agency` | Без вакансий агентств |
| `accept_kids` | Только доступные для соискателей от 14 лет |
| `accredited_it` | Только аккредитованные ИТ-компании |
| `low_performance` | Только вакансии, у которых меньше 10 откликов |
| `internship` | Стажировка |
| `night_shifts` | Вечерние или ночные смены |
| `with_salary` | Указан доход |
| `accept_teens` | Только доступные для соискателей от 16 лет |
| `accept_labor_contract` | Трудовой договор |

#### Search fields (`searchFields`)

| Value | Meaning |
|---|---|
| `name` | в названии вакансии |
| `company_name` | в названии компании |
| `description` | в описании вакансии |

#### Sort (`sort`)

| Value | Meaning |
|---|---|
| `publication_time` | по дате |
| `salary_desc` | по убыванию дохода |
| `salary_asc` | по возрастанию дохода |
| `relevance` | по соответствию |

#### Currencies (`currency`)

| Code | Name | In active use on hh.kz |
|---|---|---|
| `AZN` | Манаты (₼) | no |
| `BYR` | Белорусские рубли (Br) | no |
| `EUR` | Евро (€) | yes |
| `GEL` | Грузинский лари (₾) | no |
| `KGS` | Кыргызский сом (сом) | no |
| `KZT` | Тенге (₸) | yes |
| `RUR` | Рубли (₽) | no |
| `UAH` | Гривны (₴) | no |
| `USD` | Доллары ($) | yes |
| `UZS` | Узбекский сум (so'm) | no |

### Examples

**Salary benchmark — accountants in Almaty and Astana with stated salary**

```json
{ "query": "бухгалтер", "area": "160,159", "searchFields": ["name"], "onlyWithSalary": true, "labels": ["not_from_agency"], "maxItems": 1000 }
```

**Hourly alert — new remote Python vacancies in Kazakhstan**

```json
{ "query": "python", "workFormat": ["REMOTE"], "sinceHours": 2, "maxItems": 100 }
```

**B2B leads — companies hiring sales managers in Karaganda, with the full vacancy text**

```json
{ "professionalRoles": ["70"], "area": "karaganda", "labels": ["not_from_agency"], "detail": true, "maxItems": 200 }
```

**Competitor hiring monitor — all open vacancies of one employer**

```json
{ "employerId": "1374179", "detail": true, "maxItems": 500 }
```

**Senior IT market — 3+ years experience, salary from 1 000 000 ₸, highest paid first**

```json
{ "industry": ["7"], "experience": "between3And6", "salaryFrom": 1000000, "currency": "KZT", "sort": "salary_desc", "maxItems": 300 }
```

### Output

One dataset item per vacancy, saved as soon as it is ready (per search page; with `detail: true` per 10 vacancies). Use `fields` to keep only some of the fields below. Example (real run, trimmed, `detail: false`):

```json
{
  "id": "136428479",
  "url": "https://hh.kz/vacancy/136428479",
  "title": "Senior Python разработчик",
  "employer": { "id": "11630327", "name": "My Startups", "url": "https://hh.kz/employer/11630327", "trusted": true, "accreditedIt": false, "category": "COMPANY" },
  "salaryFrom": null, "salaryTo": null, "salaryCurrency": null, "salaryGross": null,
  "areaId": "160", "areaName": "Алматы", "address": "Алматы, улица Абдуллы Розыбакиева, 247А", "lat": 43.202449, "lon": 76.89197,
  "experience": "between3And6", "employment": "full", "schedule": "fullDay",
  "workFormats": ["ON_SITE"], "workingHours": ["HOURS_8"], "workScheduleByDays": ["FIVE_ON_TWO_OFF"],
  "remote": false, "internship": false, "nightShifts": false,
  "publishedAt": "2026-09-13T04:22:13.287Z", "createdAt": "2026-08-20T04:22:13.287Z", "responsesCount": 457,
  "responsibilitySnippet": "Разработка и поддержка бэкэнд приложений. Проектирование архитектуры. Разработка API…",
  "requirementSnippet": "Глубокое знание языка программирования Python…",
  "keySkills": null, "description": null, "contacts": null,
  "site": "hh.kz", "query": "python developer", "searchTotal": 261, "fetchedAt": "2026-09-13T08:12:14.505Z"
}
```

| Field | Description |
|---|---|
| `id`, `url`, `title` | hh vacancy id, canonical URL, title |
| `employer` | `id`, `name`, `url`, `trusted` (verified by hh), `accreditedIt` (accredited IT company), `category` |
| `salaryFrom`, `salaryTo`, `salaryCurrency`, `salaryGross`, `salaryMode`, `salaryFrequency` | Salary range; `salaryGross: false` = net ("на руки") |
| `areaId`, `areaName`, `address`, `lat`, `lon` | Location |
| `experience`, `employment`, `schedule`, `workFormats`, `workingHours`, `workScheduleByDays` | Conditions (codes from Reference) |
| `remote`, `internship`, `nightShifts`, `acceptTemporary` | Flags |
| `publishedAt`, `createdAt` | Last publication (bump) and creation time, ISO |
| `responsesCount` | Number of applications — a competition signal |
| `responsibilitySnippet`, `requirementSnippet` | Short text from the search card |
| `professionalRoleIds`, `professionalRoles` | Role ids and names, when hh includes them in the page data |
| `keySkills`, `description`, `contacts`, `archived`, `ageRestriction` | With `detail: true`; `contacts` is `null` unless the vacancy page carries them (hh now loads contacts after a click, so this is rare) |
| `site`, `query`, `searchTotal`, `fetchedAt` | Search scope, total vacancies hh reports for the search, fetch time |
| `detailError` | Present only when the vacancy page could not be opened (removed, hh error, block): the row keeps its search data |

### Use it from code / agents

```bash
curl -X POST "https://api.apify.com/v2/acts/yadroo~hh-kz-vacancies/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query":"бухгалтер","area":"almaty","onlyWithSalary":true,"maxItems":100}'
```

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('yadroo/hh-kz-vacancies').call({ query: 'python', workFormat: ['REMOTE'], sinceHours: 24 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

```python
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("yadroo/hh-kz-vacancies").call(run_input={"employerId": "1374179", "detail": True})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

MCP: add `https://mcp.apify.com` to Claude / Cursor / any MCP client and call the `yadroo/hh-kz-vacancies` tool with the same JSON input.

### Pricing

Pay per event: **$0.005 per run start + $0.002 per vacancy**. No proxy or browser costs.
Store discounts: Bronze −10 %, Silver −20 %, Gold and above −30 % on the vacancy price; the start event is the same on every plan; platform usage is included.
Your **maximum cost per run** is respected: the run stops before the first vacancy it would not pay for, keeps every vacancy saved so far and ends with "Stopped at your spending limit: N rows delivered". In detail mode no vacancy page is opened that the limit would not pay for.
Typical runs: 50 vacancies ≈ $0.105; a 1000-vacancy salary benchmark ≈ $2.005; an hourly `sinceHours` alert that finds 10 new vacancies ≈ $0.025. `detail: true` costs the same per vacancy but takes ~1 s per vacancy longer.

### Limits & FAQ

- **2000 results per search** is hh's own cap. Split by `area`, `professionalRoles` or `experience` to go further.
- **Speed and the run timeout** — a search page takes ~1.6 s (deep pages 4–6 s), so 2000 vacancies without `detail` take about 2 minutes. `detail: true` opens one page per vacancy at a polite pace: about 23 vacancies a minute, **~1,300 in the default 1-hour timeout**. Vacancies are saved as they are ready; a run that nears its timeout stops starting new pages ~90 s before it and ends SUCCEEDED with "Stopped before the run timeout: N rows saved". For 2000 vacancies with detail, raise the run timeout to 2 hours or split the search by `area` / `professionalRoles`.
- **Rate limits and blocks** — ~0.7 s between search pages and ~1 s between vacancy pages; 429/5xx and network errors are retried with backoff. A 403 or a captcha page is an anti-bot wall: the run stops at once and does not try to get around it (no proxy, no captcha solving). Everything saved before stays in the dataset and the status says where hh blocked; if that happens on the first page, the run fails with that message and only the start is charged.
- **Vacancy pages that fail** — a removed vacancy (404), a page hh does not serve after retries, or a page that carries no vacancy text this actor can read keeps its search data with `detailError` and is billed like any row (it is never passed off as detail data); 5 failures in a row stop the run with a clear status. The first unreadable vacancy page is saved as `DETAIL_PAGE_UNRECOGNIZED` in the run's key-value store, so a change of hh's page can be reported and fixed.
- **Contacts** — only what the vacancy page itself carries. hh now loads an employer's contacts separately, after a click and often only for signed-in users, so the page — and `contacts` — is almost always empty (`null`). Contacts behind a click or a login are not collected.
- **Professional roles in output** — `professionalRoleIds` and `professionalRoles` come from hh's own page data, on search rows and detail rows alike.
- **Run summary** — the `SUMMARY` record of the run's key-value store lists the search URL, hh's total, pages read and, with `detail: true`, how many vacancy pages were read, failed or were unreadable and where the vacancy text came from.
- **Freshness** — live at run time. `publishedAt` changes when an employer bumps a vacancy.
- **Roadmap** — employer profile mode (company description, all vacancies, rating), salary statistics output.

***

Made by **Yadroo**. Sibling actors: [krisha-kz](https://apify.com/yadroo/krisha-kz) (real estate), [kolesa-kz](https://apify.com/yadroo/kolesa-kz) (cars), [kaspi-kz-products](https://apify.com/yadroo/kaspi-kz-products) (marketplace prices), [autoscout24-cars](https://apify.com/yadroo/autoscout24-cars) (EU cars).

# Actor input Schema

## `query` (type: `string`):

Keywords as typed into the hh search box. Supports hh query language: quotes for exact phrase ("1С бухгалтер"), OR, NOT, `!word` for exact word form. Leave empty to list all vacancies of an employer or professional role.

## `site` (type: `string`):

HeadHunter site to search. Vacancies are shared across hh sites; the site mostly decides the default area and currency display.

## `area` (type: `string`):

hh area id, Russian name or latin slug; several separated by commas. Empty = the whole country of the chosen site (hh.kz → Kazakhstan 40, hh.ru → Russia 113, hh.uz → Uzbekistan 97). Examples: 160 Almaty, 159 Astana, 205 Shymkent, 177 Karaganda, "almaty", "Астана", "160,159". An unknown name stops the run with a hint (never a wider search). All 217 Kazakhstan areas: README → Reference.

## `searchFields` (type: `array`):

Where the keywords must match. Empty = everywhere (title, company name, description). Choose only "name" for precise title matches.

## `excludeWords` (type: `array`):

Vacancies containing any of these words are excluded server-side (hh `excluded_text`), e.g. \["стажер", "junior"].

## `professionalRoles` (type: `array`):

hh professional role ids or exact Russian names, e.g. "96" (Программист, разработчик), "18" (Бухгалтер), "70" (Менеджер по продажам). An unknown name stops the run with a "did you mean" hint. Full list of 304 roles in 27 categories: README → Reference.

## `industry` (type: `array`):

hh industry ids: top-level (7 = IT, 43 = Finance, 29 = Agriculture, 47 = Oil & gas…) or sub-industry like "7.540". A value that is not an id stops the run with a hint. List in README → Reference.

## `employerId` (type: `string`):

Only vacancies of this company — the number in https://hh.kz/employer/<id> (also in this actor's `employer.id` output). Good for competitor hiring monitoring.

## `experience` (type: `string`):

Required work experience (hh `experience`): one level. Values outside the list are refused by Apify before the run.

## `employment` (type: `array`):

hh `employment`: full, part, project, volunteer, probation (internship). Several = OR.

## `schedule` (type: `array`):

hh `schedule`: fullDay, shift, flexible, remote, flyInFlyOut (rotation). Several = OR.

## `workFormat` (type: `array`):

hh `work_format` (newer filter): ON\_SITE, REMOTE, HYBRID, FIELD\_WORK.

## `partTime` (type: `array`):

hh `part_time`: project work, part-time, temporary, 4–6 hour shifts, weekends only, evenings.

## `labels` (type: `array`):

hh `label` flags, e.g. not\_from\_agency (exclude recruiting agencies), with\_address, accredited\_it, low\_performance (<10 responses — less competition).

## `salaryFrom` (type: `integer`):

Vacancies whose salary range includes this amount (hh `salary`), in `currency`. Combine with `onlyWithSalary` to drop vacancies without a salary.

## `currency` (type: `string`):

Currency of `salaryFrom` (hh converts internally). KZT, USD, EUR are in active use on hh.kz; Russian rubles are `RUR`, as hh writes them. Values outside the list are refused by Apify before the run.

## `onlyWithSalary` (type: `boolean`):

Skip vacancies that do not state a salary.

## `period` (type: `string`):

Server-side publication period (hh `search_period`). For finer control use `sinceHours`.

## `sinceHours` (type: `integer`):

Keep only vacancies published (or bumped) within N hours. Sets sort to publication\_time and stops paging at the first older vacancy — cheap hourly monitoring.

## `sort` (type: `string`):

hh `order_by`.

## `maxItems` (type: `integer`):

Stop after this many vacancies. hh returns 100 per page and never more than 2000 per search — split by area or role to go further. The run also stops at your max cost per run.

## `maxPages` (type: `integer`):

Safety cap on search pages (100 vacancies each).

## `detail` (type: `boolean`):

Open each vacancy page and add full description, key skills, professional roles, archive status and coordinates; contacts only when hh puts them on the page (rare: hh now loads them after a click). +1 request per vacancy at a polite pace: about 23 vacancies a minute, ~1,300 in the default 1-hour timeout (rows are saved as they are ready; raise the timeout for more).

## `dedupe` (type: `boolean`):

Skip vacancy ids already seen in this run.

## `fields` (type: `array`):

Keep only these fields, in this order, e.g. \["title", "employer", "salaryFrom", "salaryTo", "areaName"]. `id`, `url` and (when a vacancy page failed) `detailError` are always kept. Empty = every field. Names: README → Output; case and spaces are forgiven, an unknown name is skipped with a hint.

## Actor input object example

```json
{
  "query": "python developer",
  "site": "hh.kz",
  "searchFields": [],
  "excludeWords": [],
  "professionalRoles": [],
  "industry": [],
  "experience": "",
  "employment": [],
  "schedule": [],
  "workFormat": [],
  "partTime": [],
  "labels": [],
  "currency": "KZT",
  "onlyWithSalary": false,
  "period": "",
  "sort": "relevance",
  "maxItems": 50,
  "maxPages": 20,
  "detail": false,
  "dedupe": true
}
```

# Actor output Schema

## `vacancies` (type: `string`):

No description

## `overview` (type: `string`):

No description

## `employers` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "query": "python developer",
    "searchFields": [],
    "excludeWords": [],
    "professionalRoles": [],
    "industry": [],
    "employment": [],
    "schedule": [],
    "workFormat": [],
    "partTime": [],
    "labels": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("yadroo/hh-kz-vacancies").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "query": "python developer",
    "searchFields": [],
    "excludeWords": [],
    "professionalRoles": [],
    "industry": [],
    "employment": [],
    "schedule": [],
    "workFormat": [],
    "partTime": [],
    "labels": [],
}

# Run the Actor and wait for it to finish
run = client.actor("yadroo/hh-kz-vacancies").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "python developer",
  "searchFields": [],
  "excludeWords": [],
  "professionalRoles": [],
  "industry": [],
  "employment": [],
  "schedule": [],
  "workFormat": [],
  "partTime": [],
  "labels": []
}' |
apify call yadroo/hh-kz-vacancies --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yadroo/hh-kz-vacancies"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/hJ1Rz842UcHiEljd5/builds/NL5NKQUx2valn3Ftp/openapi.json
