# Hh Jobs Search Scraper (`soft_alexist/hh-jobs-search-scraper`) Actor

Scrape thousands of job listings from Russia's largest job portal HH.ru. This scraper extracts 60+ data fields including compensation, work schedules, employer info, and application requirements — perfect for recruiters, researchers, and job aggregators.

- **URL**: https://apify.com/soft\_alexist/hh-jobs-search-scraper.md
- **Developed by:** [Soft Alexist](https://apify.com/soft_alexist) (community)
- **Categories:** Automation, Developer tools, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 Search Scraper: Extract Russian Vacancy Data at Scale
---

### What Is HH.ru?

HH.ru is the leading employment portal in Russia and the CIS region, hosting hundreds of thousands of active job listings daily. Whether searching for tech roles, remote positions, or region-specific opportunities, HH.ru aggregates opportunities across industries and skill levels. Manually scraping job data from search result pages is laborious and error-prone — the **HH.ru Jobs Search Scraper** automates this process, delivering rich, structured records for analytics and integration.

---

### Overview

The **HH.ru Jobs Search Scraper** extracts job vacancy listings from HH.ru search result pages, capturing 60+ distinct fields per posting. It is tailored for:

- **Recruiters & HR teams** tracking market trends, competitor activity, and salary benchmarks
- **Job aggregators** building multi-source job boards
- **Data analysts** studying employment patterns in Russia and neighboring regions
- **Academic researchers** analyzing labor market dynamics

The scraper excels at handling large-scale collection with configurable item limits, failure tolerance, and remote job filtering. It respects HH.ru's infrastructure and gracefully handles timeouts and redirects.

---

### Input Format

The scraper accepts a JSON configuration object with three key parameters:

```json
{
  "urls": [
    "https://hh.ru/search/vacancy?schedule=remote&L_profession_id=0&area=113&hhtmFrom=main"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 200
}
````

| Parameter | Type | Description |
|---|---|---|
| `urls` | Array | HH.ru search result page URLs (e.g., filtered by location, job type, or keyword). Multiple URLs supported for batch collection. |
| `max_items_per_url` | Integer | Maximum number of job listings to extract per URL (e.g., `200`). Useful for controlling data volume and runtime. |
| `ignore_url_failures` | Boolean | If `true`, the scraper skips failed URLs and continues processing remaining links. If `false`, any failure halts the entire run. |

**URL examples:**

- Remote roles nationwide: `https://hh.ru/search/vacancy?schedule=remote&area=113`
- Moscow office positions: `https://hh.ru/search/vacancy?area=1&order_by=relevance`
- Specific keyword: `https://hh.ru/search/vacancy?text=python+developer&area=113`

> **Tip:** HH.ru URLs often include search filters (`schedule`, `area`, `text`). Adjust these in your URLs to target specific job categories or regions.

***

### Output Format

Each scraped vacancy returns a comprehensive record with 60+ fields across six categories:

#### Vacancy Identification

| Field | Meaning |
|---|---|
| `Vacancy ID` | Unique HH.ru identifier for the job posting |
| `Name` | Job title as displayed |
| `Company` | Employer organization name |
| `Compensation` | Salary range (may be hidden if employer opted out) |
| `Area` | Geographic region of the position |
| `Publication Time` | When the vacancy was posted |
| `Last Change Time` | Last update timestamp |
| `Creation Time` | Internal creation date |

#### Work Terms & Schedule

| Field | Meaning |
|---|---|
| `Work Schedule` | Schedule type (full-time, part-time, shift-based) |
| `Work Formats` | Remote, hybrid, or office-based work mode |
| `Working Days` | Days per week (e.g., 5, 4-day weeks) |
| `Working Time Intervals` | Specific hours or flexible arrangement |
| `Working Time Modes` | Shift patterns or flexible schedules |
| `Night Shifts` | Whether night shifts are involved |
| `Fly In Fly Out Durations` | Rotation periods for remote/mobile roles |

#### Employment & Legal

| Field | Meaning |
|---|---|
| `Employment` | Employment type (permanent, contract, internship) |
| `Employment Form` | Legal employment arrangement |
| `Accept Temporary` | Whether temporary staffing is accepted |
| `Accept Labor Contract` | Labor agreement acceptance flag |
| `Civil Law Contracts` | Whether independent contractor roles considered |
| `Internship` | Whether position is an internship or traineeship |

#### Requirements & Qualifications

| Field | Meaning |
|---|---|
| `Work Experience` | Minimum required work experience |
| `Professional Role IDs` | Job category classifications |
| `Languages` | Required language proficiencies |
| `Driver License Types` | Driving license requirements (if applicable) |
| `Accept Incomplete Resumes` | Whether employer accepts incomplete applications |
| `Response Letter Required` | If a cover letter must accompany applications |

#### Application & Communication

| Field | Meaning |
|---|---|
| `Contact Info` | Employer contact details |
| `Show Contact` | Whether contact info is publicly visible |
| `Template` | Application template provided by employer |
| `Auto Response` | Automated response sent to applicants |
| `Inbox Possibility` | Whether direct messaging is enabled |
| `Chat Write Possibility` | Whether real-time chat with employer is allowed |
| `Notify` | Notification settings for the vacancy |

#### Analytics & Engagement

| Field | Meaning |
|---|---|
| `Responses Count` | Number of applications received |
| `Total Responses Count` | Total lifetime applications |
| `Online Users Count` | Active candidate views in real-time |
| `Click URL` | URL for tracking vacancy clicks |
| `Is Adv` | Whether the vacancy is promoted (paid placement) |
| `Tags`, `Labels`, `Extra Labels` | Internal categorization tags |
| `User Labels` | Custom employer labels |

#### Technical & System Fields

| Field | Meaning |
|---|---|
| `Creation Site`, `Creation Site ID` | Source platform identifier |
| `Display Host` | Server hostname delivering the listing |
| `Can Be Shared` | Permission to reshare the vacancy |
| `Employer Manager` | Employer account manager info |
| `User Test Present` | Whether a skills test is required |
| `Closed For Applicants` | Whether the position is still accepting applications |
| `Vacancy Properties`, `Vacancy Platforms` | Extended job attributes |
| `Inclusiveness Types` | Accessibility and inclusion flags |
| `Branding` | Employer branding information |
| `Search RID` | Request ID for this specific search |

***

### How to Use

1. **Prepare URLs** — Visit HH.ru and build search queries (filter by location, job type, salary, etc.). Copy the full URL from your browser.
2. **Add to configuration** — Paste URLs into the `urls` array. You can add one or multiple search pages.
3. **Set item limit** — Adjust `max_items_per_url` (e.g., `200` for 200 listings per page). Higher numbers take longer but capture more data.
4. **Enable fault tolerance** — Set `ignore_url_failures: true` to skip problematic URLs without stopping the entire run.
5. **Execute** — Run the scraper and monitor the logs for progress and errors.
6. **Export** — Download results as JSON, CSV, or Excel for analysis or integration.

**Best practices:**

- Use filters in HH.ru URLs to target specific regions, industries, or job types (reduces noise and runtime).
- For large-scale collection, split URLs by region or profession to avoid overwhelming the job portal.
- Check the output for null or hidden values (e.g., `Compensation` may be omitted by employers).

***

### Use Cases & Business Value

- **Market intelligence:** Track hiring trends, salary ranges, and skill demand across Russian markets
- **Competitive analysis:** Monitor competitor job postings and employer branding strategies
- **Recruitment optimization:** Build datasets for candidate sourcing and salary benchmarking
- **Job aggregator platforms:** Feed HH.ru data into multi-source job boards
- **Economic research:** Analyze employment trends and regional labor dynamics

The scraper delivers ready-to-analyze data, cutting data collection time from hours to minutes and enabling insights that would otherwise require manual effort.

***

### Conclusion

The **HH.ru Jobs Search Scraper** is an efficient, reliable tool for extracting Russian job market data at scale. With 60+ fields of rich vacancy information and robust error handling, it empowers recruiters, analysts, and researchers to make data-driven hiring and business decisions. Start scraping today and unlock actionable insights from Russia's largest job portal.

# Actor input Schema

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

Add the URLs of the Jobs list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://hh.ru/search/vacancy?schedule=remote&L_profession_id=0&area=113&hhtmFrom=main"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://hh.ru/search/vacancy?schedule=remote&L_profession_id=0&area=113&hhtmFrom=main"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("soft_alexist/hh-jobs-search-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 = {
    "urls": ["https://hh.ru/search/vacancy?schedule=remote&L_profession_id=0&area=113&hhtmFrom=main"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("soft_alexist/hh-jobs-search-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 '{
  "urls": [
    "https://hh.ru/search/vacancy?schedule=remote&L_profession_id=0&area=113&hhtmFrom=main"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call soft_alexist/hh-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Hh Jobs Search Scraper",
        "description": "Scrape thousands of job listings from Russia's largest job portal HH.ru. This scraper extracts 60+ data fields including compensation, work schedules, employer info, and application requirements — perfect for recruiters, researchers, and job aggregators.",
        "version": "0.0",
        "x-build-id": "JQPf98vD6aEh9oaSz"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/soft_alexist~hh-jobs-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-soft_alexist-hh-jobs-search-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/soft_alexist~hh-jobs-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-soft_alexist-hh-jobs-search-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/soft_alexist~hh-jobs-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-soft_alexist-hh-jobs-search-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": {
                    "urls": {
                        "title": "URLs of the Jobs list urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the Jobs list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
