# HeadHunter RU $1💰 URL | Filters | Enriched Job Data (`abotapi/hh-ru-jobs-scraper`) Actor

From $1/1K. Scrape hh.ru job listings with 50+ fields including salary, experience, schedule, employment, and role. Search by filters or use URLs. Detail enrichment adds full descriptions, key skills, contact info, and employer logos.

- **URL**: https://apify.com/abotapi/hh-ru-jobs-scraper.md
- **Developed by:** [AbotAPI](https://apify.com/abotapi) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## hh.ru Jobs Scraper

Pull rich job listings from **hh.ru** (HeadHunter), Russia's largest job board, with 50+ fields per record. Filter by keywords, area, experience, schedule, employment, salary, and professional role; or paste search URLs directly. Detail-page enrichment adds full descriptions, key skills, contact info, and employer logos.

### Why this scraper?

- **50+ fields per vacancy**, 4x richer than typical hh.ru scrapers. Includes `keySkills`, full HTML description, employer logos, GPS coordinates, metro stations, salary ranges (from/to + currency + gross/net), work formats, and contact info when public.
- **Two modes**: pick keywords + area + filters, or paste hh.ru search URLs as-is.
- **Concurrent detail-page enrichment** with per-record streaming push: results show up in the dataset as they finish, mid-run aborts preserve partial progress.
- **Free-tier friendly**: works on Apify default datacenter proxy, no residential plan needed.
- **Full filter coverage**: experience, employment, schedule, salary range, only-with-salary, professional role, industry, sort order.
- **Forward-walking pagination** that respects hh.ru's 40-page (2000-listing) hard cap per filter.

### Data you get

> Sample shape, values are illustrative placeholders, not from a live listing.

| Field | Example |
|---|---|
| `vacancyId` | `"100000001"` |
| `url` | `"https://hh.ru/vacancy/100000001"` |
| `name` | `"Sample Job Title"` |
| `publicationDate` | `"2026-05-05T09:00:00.000+03:00"` |
| `creationDate` | `"2026-05-01T09:00:00.000+03:00"` |
| `lastChangeTime` | `"2026-05-04T09:00:00.000+03:00"` |
| `validThroughTime` | `"2026-06-04T09:00:00.000+03:00"` |
| `salaryFrom` | `200000` |
| `salaryTo` | `300000` |
| `salaryCurrency` | `"RUR"` |
| `salaryGross` | `false` |
| `salaryMode` | `"MONTH"` |
| `salaryFrequency` | `"TWICE_PER_MONTH"` |
| `area.id` | `1` |
| `area.name` | `"Москва"` |
| `area.path` | `".113.1."` |
| `address.city` | `"Москва"` |
| `address.street` | `"Sample Street"` |
| `address.lat` | `55.7558` |
| `address.lng` | `37.6173` |
| `address.metroStations` | `[{ "name": "Sample Station", "lineColor": "#000000" }]` |
| `address.district` | `"Sample District"` |
| `company.id` | `1000000` |
| `company.name` | `"Sample Company"` |
| `company.visibleName` | `"Sample Company"` |
| `company.isAccreditedIT` | `true` |
| `company.isTrusted` | `true` |
| `company.siteUrl` | `"https://www.example.com/"` |
| `company.logoUrl` | `"https://hh.ru/employer-logo-original/0000000.png"` |
| `company.logos` | `[{ "type": "ORIGINAL", "url": "..." }, ...]` |
| `company.badges` | `[{ "type": "hrbrand", "description": "Sample badge" }]` |
| `workExperience` | `"between1And3"` |
| `employmentForm` | `"FULL"` |
| `employment` | `"FULL"` |
| `workSchedule` | `"fullDay"` |
| `workScheduleByDays` | `["FIVE_ON_TWO_OFF"]` |
| `workFormats` | `["ON_SITE"]` |
| `workingHours` | `["HOURS_8"]` |
| `nightShifts` | `false` |
| `internship` | `false` |
| `acceptHandicapped` | `false` |
| `acceptLaborContract` | `true` |
| `description` | `"<p>Full HTML description goes here...</p>"` |
| `descriptionText` | `"Full plain-text description goes here..."` |
| `keySkills` | `["Python", "Django", "PostgreSQL"]` |
| `contactInfo.name` | `"Contact Name"` |
| `contactInfo.email` | `"contact@example.com"` |
| `contactInfo.phones` | `[{ "country": "7", "city": "495", "number": "0000000", "formatted": "7 495 0000000" }]` |
| `contactInfo.contactsHidden` | `false` |
| `professionalRoleIds` | `[96, 156]` |
| `responsesCount` | `42` |
| `totalResponsesCount` | `100` |
| `onlineUsersCount` | `5` |
| `isAdv` | `false` |
| `searchUrl` | `"https://hh.ru/search/vacancy?text=python&area=1&page=0"` |
| `searchSessionId` | `"00000000-0000-0000-0000-000000000000"` |
| `scrapedAt` | `"2026-05-05T12:00:00.000Z"` |

### How to use

#### Search by keyword + area (recommended)

```json
{
  "mode": "search",
  "queries": ["python"],
  "areas": ["1"],
  "maxPages": 5,
  "maxListings": 100,
  "fetchDetails": true
}
````

#### Search with filters (experience + remote + salary)

```json
{
  "mode": "search",
  "queries": ["data scientist"],
  "areas": ["1", "2"],
  "experience": "between3And6",
  "schedule": ["remote"],
  "salaryMin": 200000,
  "onlyWithSalary": true,
  "orderBy": "salary_desc",
  "maxPages": 10
}
```

#### URL mode (paste any hh.ru search URL)

```json
{
  "mode": "url",
  "urls": [
    "https://hh.ru/search/vacancy?text=AI%20engineer&area=1&experience=between1And3&schedule=remote&page=0"
  ],
  "maxPages": 5,
  "fetchDetails": true
}
```

#### URL mode multi-search

```json
{
  "mode": "url",
  "urls": [
    "https://hh.ru/search/vacancy?text=python&area=1&page=0",
    "https://hh.ru/search/vacancy?text=java&area=2&page=0"
  ],
  "maxPages": 3
}
```

### Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` or `url` |
| `queries` | string\[] | `["AI"]` | Keywords (one search per keyword). Russian fine. |
| `areas` | string\[] | `["1"]` | Area IDs. 1=Moscow, 2=St Petersburg, 113=Russia. Full list at https://api.hh.ru/areas |
| `experience` | enum | `any` | `any`, `noExperience`, `between1And3`, `between3And6`, `moreThan6` |
| `employment` | enum\[] | `[]` | Multi: `full`, `part`, `project`, `volunteer`, `probation` |
| `schedule` | enum\[] | `[]` | Multi: `fullDay`, `shift`, `flexible`, `remote`, `flyInFlyOut` |
| `salaryMin` | integer | (none) | Minimum monthly RUB |
| `onlyWithSalary` | boolean | `false` | Only listings with a published salary |
| `orderBy` | enum | `relevance` | `relevance`, `publication_time`, `salary_desc`, `salary_asc`, `distance` |
| `professionalRole` | string\[] | `[]` | Numeric role IDs from https://api.hh.ru/professional\_roles |
| `industry` | string\[] | `[]` | Numeric industry IDs from https://api.hh.ru/industries |
| `urls` | string\[] | (example URL) | URLs in URL mode. Filter fields ignored in this mode. |
| `maxPages` | integer | 5 | 1 to 40 (hh.ru hard cap) |
| `maxListings` | integer | 0 | 0 = unlimited |
| `fetchDetails` | boolean | `true` | Adds description, keySkills, contact info, full company logos |
| `proxy` | object | Apify default datacenter | Apify Proxy datacenter works fine; Residential RU optional |

### Output example

> Sample shape, values are illustrative placeholders, not from a live listing.

```json
{
  "vacancyId": "100000001",
  "url": "https://hh.ru/vacancy/100000001",
  "name": "Sample Senior Python Developer",
  "publicationDate": "2026-05-05T09:00:00.000+03:00",
  "creationDate": "2026-05-01T09:00:00.000+03:00",
  "lastChangeTime": "2026-05-04T09:00:00.000+03:00",
  "validThroughTime": "2026-06-04T09:00:00.000+03:00",
  "isAdv": false,
  "searchUrl": "https://hh.ru/search/vacancy?text=python&area=1&page=0",
  "searchSessionId": "00000000-0000-0000-0000-000000000000",
  "company": {
    "id": 1000000,
    "name": "Sample Company",
    "visibleName": "Sample Company",
    "isAccreditedIT": true,
    "isTrusted": true,
    "category": "COMPANY",
    "state": "APPROVED",
    "siteUrl": "https://www.example.com/",
    "logoUrl": "https://hh.ru/employer-logo-original/0000000.png",
    "logos": [
      { "type": "ORIGINAL", "url": "https://hh.ru/employer-logo-original/0000000.png" },
      { "type": "vacancyPage", "url": "https://hh.ru/employer-logo/0000000.png" }
    ],
    "badges": [{ "type": "hrbrand", "description": "Sample badge" }]
  },
  "salaryFrom": 200000,
  "salaryTo": 300000,
  "salaryCurrency": "RUR",
  "salaryGross": false,
  "salaryMode": "MONTH",
  "salaryFrequency": "TWICE_PER_MONTH",
  "area": { "id": 1, "name": "Москва", "path": ".113.1." },
  "address": {
    "city": "Москва",
    "street": "Sample Street",
    "building": "1",
    "displayName": "Москва, Sample Street, 1",
    "lat": 55.7558,
    "lng": 37.6173,
    "metroStations": [
      { "id": 1, "name": "Sample Station", "lineColor": "#000000" }
    ],
    "district": "Sample District"
  },
  "workExperience": "between3And6",
  "employment": "FULL",
  "employmentForm": "FULL",
  "workSchedule": "remote",
  "workScheduleByDays": ["FIVE_ON_TWO_OFF"],
  "workFormats": ["REMOTE"],
  "workingHours": ["HOURS_8"],
  "nightShifts": false,
  "internship": false,
  "responseLetterRequired": false,
  "acceptHandicapped": false,
  "acceptLaborContract": true,
  "responsesCount": 42,
  "totalResponsesCount": 100,
  "onlineUsersCount": 5,
  "professionalRoleIds": [96, 156],
  "languages": [{ "id": "eng", "name": "English", "level": "b2" }],
  "userLabels": [],
  "description": "<p>Full HTML description text goes here. Includes responsibilities, requirements, and conditions.</p>",
  "descriptionText": "Full plain-text description text goes here. Includes responsibilities, requirements, and conditions.",
  "keySkills": ["Python", "Django", "PostgreSQL", "Docker", "Git"],
  "contactInfo": {
    "name": "Contact Name",
    "email": "contact@example.com",
    "phones": [
      { "country": "7", "city": "495", "number": "0000000", "comment": null, "formatted": "7 495 0000000" }
    ],
    "contactsHidden": false
  },
  "scrapedAt": "2026-05-05T12:00:00.000Z"
}
```

### Plan requirement

- **Free Apify plan works.** The default proxy is Apify Proxy datacenter, which is included on every plan and passes hh.ru reliably.
- **Residential RU is optional.** If you want geo-pinned results (e.g. for region-specific salary surveys), pick `Residential` + `RU` in the proxy field. Requires Starter plan or higher.
- **Pagination cap**: hh.ru caps each filter at 2000 vacancies (40 pages of 50). Use multiple `queries` or `areas` to slice past the cap.
- **maxListings: 0 = unlimited.** Bounded only by `maxPages` and the 2000-cap above.

### Tips

- **Russian keywords work.** Pass `"queries": ["программист"]` directly.
- **Get the latest postings**: set `"orderBy": "publication_time"` to walk newest-first.
- **Skip detail pages for speed**: set `"fetchDetails": false` to scrape pure SERP data (~30 listings per second). Keeps `vacancyId`, salary, area, address, company basics, work format, but drops `description`, `keySkills`, `contactInfo`.
- **Quick fan-out across regions**: pass multiple `areas` (e.g. `["1", "2", "4"]` for Moscow + St Petersburg + Novosibirsk) to compare a single keyword across markets.

# Actor input Schema

## `mode` (type: `string`):

Search mode = type your keywords + area + filters and let the scraper build URLs. URL mode = paste any hh.ru search URL already refined in a browser (recommended for complex filters or saved searches).

## `queries` (type: `array`):

One or more keywords. Each keyword runs as a separate search. Examples: 'python', 'AI engineer', 'data scientist', 'Java middle'. Russian keywords are fine.

## `areas` (type: `array`):

Optional. One or more hh.ru area IDs. Leave empty to search all of Russia (defaults to 113 = whole country). Common values: 1=Moscow, 2=Saint Petersburg, 113=Russia (whole country), 4=Novosibirsk, 88=Kazan, 1438=Yekaterinburg, 5=Krasnodar, 76=Rostov-on-Don, 78=Voronezh, 66=Nizhny Novgorod. Full list: https://api.hh.ru/areas

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

Filter candidates by required experience.

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

Multi-select. Leave empty to get all types.

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

Multi-select. Leave empty for all schedules.

## `salaryMin` (type: `integer`):

Minimum monthly salary in RUB. Listings without a salary are still returned unless you also enable 'Only with salary'.

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

If on, only listings that publish a salary range are returned.

## `orderBy` (type: `string`):

How to order results. Default = relevance (hh.ru's own default).

## `professionalRole` (type: `array`):

Optional. Numeric professional role IDs to filter by. Examples: 96=Programmer/Developer, 156=Software engineer, 165=Data Analyst, 10=Project Manager. Full taxonomy: https://api.hh.ru/professional\_roles

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

Optional. Numeric industry IDs. Examples: 7=IT/Telecom, 9=Marketing/PR, 29=Finance. Full taxonomy: https://api.hh.ru/industries

## `urls` (type: `array`):

One or more full hh.ru search URLs. Tip: open hh.ru in your browser, pick keywords + area + filters, then paste the resulting URL here. Pagination starts at page in URL and walks forward.

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

How many result pages to walk per query / URL. hh.ru returns 50 listings per page. Maximum is 40 pages (hh.ru hard cap = 2000 listings per filter).

## `maxListings` (type: `integer`):

Hard cap across the whole run. 0 = unlimited (bounded only by Max pages).

## `fetchDetails` (type: `boolean`):

Adds the most valuable fields: full HTML description + plain-text version, keySkills array, employer logos, validThroughTime, hr-brand status, work format details, and metro station list. Turn off for a faster run with just the SERP-level fields. Note on contact info: hh.ru hides phone / email / advertiser name behind a login wall, so contactInfo.phones / .email / .name will be empty for non-authenticated scrapes. The actor returns contactInfo.contactsHidden=true for those listings. Some employers paste their contact details into the descriptionText (search the description if you need it).

## `proxy` (type: `object`):

Default = Apify Proxy (datacenter). hh.ru works fine on the free tier. For higher reliability or geo-pinned views, switch to Residential RU.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "AI"
  ],
  "areas": [
    "1"
  ],
  "experience": "any",
  "onlyWithSalary": false,
  "orderBy": "relevance",
  "urls": [
    "https://hh.ru/search/vacancy?text=python&area=1&page=0"
  ],
  "maxPages": 2,
  "maxListings": 0,
  "fetchDetails": true,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "queries": [
        "AI"
    ],
    "areas": [
        "1"
    ],
    "urls": [
        "https://hh.ru/search/vacancy?text=python&area=1&page=0"
    ],
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/hh-ru-jobs-scraper").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 = {
    "queries": ["AI"],
    "areas": ["1"],
    "urls": ["https://hh.ru/search/vacancy?text=python&area=1&page=0"],
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/hh-ru-jobs-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "AI"
  ],
  "areas": [
    "1"
  ],
  "urls": [
    "https://hh.ru/search/vacancy?text=python&area=1&page=0"
  ],
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call abotapi/hh-ru-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=abotapi/hh-ru-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "HeadHunter RU $1💰 URL | Filters | Enriched Job Data",
        "description": "From $1/1K. Scrape hh.ru job listings with 50+ fields including salary, experience, schedule, employment, and role. Search by filters or use URLs. Detail enrichment adds full descriptions, key skills, contact info, and employer logos.",
        "version": "1.0",
        "x-build-id": "Ad91ixGDZYukEgdkH"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/abotapi~hh-ru-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-abotapi-hh-ru-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/abotapi~hh-ru-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-abotapi-hh-ru-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/abotapi~hh-ru-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-abotapi-hh-ru-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "1. Search mode",
                        "enum": [
                            "search",
                            "url"
                        ],
                        "type": "string",
                        "description": "Search mode = type your keywords + area + filters and let the scraper build URLs. URL mode = paste any hh.ru search URL already refined in a browser (recommended for complex filters or saved searches).",
                        "default": "search"
                    },
                    "queries": {
                        "title": "Search keywords (Search mode)",
                        "type": "array",
                        "description": "One or more keywords. Each keyword runs as a separate search. Examples: 'python', 'AI engineer', 'data scientist', 'Java middle'. Russian keywords are fine.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "areas": {
                        "title": "Areas / regions to search (Search mode, optional)",
                        "type": "array",
                        "description": "Optional. One or more hh.ru area IDs. Leave empty to search all of Russia (defaults to 113 = whole country). Common values: 1=Moscow, 2=Saint Petersburg, 113=Russia (whole country), 4=Novosibirsk, 88=Kazan, 1438=Yekaterinburg, 5=Krasnodar, 76=Rostov-on-Don, 78=Voronezh, 66=Nizhny Novgorod. Full list: https://api.hh.ru/areas",
                        "default": [
                            "113"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "experience": {
                        "title": "Work experience (Search mode)",
                        "enum": [
                            "any",
                            "noExperience",
                            "between1And3",
                            "between3And6",
                            "moreThan6"
                        ],
                        "type": "string",
                        "description": "Filter candidates by required experience.",
                        "default": "any"
                    },
                    "employment": {
                        "title": "Employment type (Search mode)",
                        "type": "array",
                        "description": "Multi-select. Leave empty to get all types.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "full",
                                "part",
                                "project",
                                "volunteer",
                                "probation"
                            ],
                            "enumTitles": [
                                "Full-time",
                                "Part-time",
                                "Project / contract",
                                "Volunteer",
                                "Probation"
                            ]
                        }
                    },
                    "schedule": {
                        "title": "Work schedule (Search mode)",
                        "type": "array",
                        "description": "Multi-select. Leave empty for all schedules.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "fullDay",
                                "shift",
                                "flexible",
                                "remote",
                                "flyInFlyOut"
                            ],
                            "enumTitles": [
                                "Full day",
                                "Shift",
                                "Flexible",
                                "Remote",
                                "Fly-in / fly-out"
                            ]
                        }
                    },
                    "salaryMin": {
                        "title": "Minimum salary (Search mode)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum monthly salary in RUB. Listings without a salary are still returned unless you also enable 'Only with salary'."
                    },
                    "onlyWithSalary": {
                        "title": "Only listings with salary (Search mode)",
                        "type": "boolean",
                        "description": "If on, only listings that publish a salary range are returned.",
                        "default": false
                    },
                    "orderBy": {
                        "title": "Sort order (Search mode)",
                        "enum": [
                            "relevance",
                            "publication_time",
                            "salary_desc",
                            "salary_asc",
                            "distance"
                        ],
                        "type": "string",
                        "description": "How to order results. Default = relevance (hh.ru's own default).",
                        "default": "relevance"
                    },
                    "professionalRole": {
                        "title": "Professional role IDs (Search mode)",
                        "type": "array",
                        "description": "Optional. Numeric professional role IDs to filter by. Examples: 96=Programmer/Developer, 156=Software engineer, 165=Data Analyst, 10=Project Manager. Full taxonomy: https://api.hh.ru/professional_roles",
                        "items": {
                            "type": "string"
                        }
                    },
                    "industry": {
                        "title": "Industry IDs (Search mode)",
                        "type": "array",
                        "description": "Optional. Numeric industry IDs. Examples: 7=IT/Telecom, 9=Marketing/PR, 29=Finance. Full taxonomy: https://api.hh.ru/industries",
                        "items": {
                            "type": "string"
                        }
                    },
                    "urls": {
                        "title": "Search URLs (URL mode)",
                        "type": "array",
                        "description": "One or more full hh.ru search URLs. Tip: open hh.ru in your browser, pick keywords + area + filters, then paste the resulting URL here. Pagination starts at page in URL and walks forward.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPages": {
                        "title": "Max pages per search",
                        "minimum": 1,
                        "maximum": 40,
                        "type": "integer",
                        "description": "How many result pages to walk per query / URL. hh.ru returns 50 listings per page. Maximum is 40 pages (hh.ru hard cap = 2000 listings per filter).",
                        "default": 2
                    },
                    "maxListings": {
                        "title": "Max total listings",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hard cap across the whole run. 0 = unlimited (bounded only by Max pages).",
                        "default": 0
                    },
                    "fetchDetails": {
                        "title": "Visit each listing's detail page",
                        "type": "boolean",
                        "description": "Adds the most valuable fields: full HTML description + plain-text version, keySkills array, employer logos, validThroughTime, hr-brand status, work format details, and metro station list. Turn off for a faster run with just the SERP-level fields. Note on contact info: hh.ru hides phone / email / advertiser name behind a login wall, so contactInfo.phones / .email / .name will be empty for non-authenticated scrapes. The actor returns contactInfo.contactsHidden=true for those listings. Some employers paste their contact details into the descriptionText (search the description if you need it).",
                        "default": true
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Default = Apify Proxy (datacenter). hh.ru works fine on the free tier. For higher reliability or geo-pinned views, switch to Residential RU."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
