# hh.ru Scraper (HeadHunter) (`trev0n/hh-ru-scraper`) Actor

Scrape jobs from hh.ru and the HeadHunter network across Russia, Kazakhstan, Belarus, Uzbekistan, Kyrgyzstan, Georgia and Azerbaijan. Rich filters, full job descriptions, and incremental monitoring that emits only new or changed vacancies on recurring runs.

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

## Pricing

from $0.99 / 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.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Job Scraper (HeadHunter)

🎯 **Pull every job listing you care about from hh.ru — the largest job board in the Russian-speaking world — with full salaries, employer details and complete job descriptions.**

This scraper collects structured job data from hh.ru and the wider HeadHunter network: job titles, salary ranges with currency, employer names, ratings and IT-accreditation status, cities and street addresses, required experience, work format (remote / hybrid / on-site), schedules, publication dates and the full job description text. It covers **Russia, Kazakhstan, Belarus, Uzbekistan, Kyrgyzstan, Georgia and Azerbaijan** — plus worldwide postings — and can run on a schedule to tell you **only what changed since last time**.

***

### 🚀 What Does It Do?

This scraper automatically searches hh.ru and collects **structured, ready-to-use data** for every matching vacancy. No manual browsing, no copy-paste — set your filters and hit Start.

💡 **Two modes of operation:**

1. **🔍 Discovery Mode** — Give it keywords (in Russian or English) plus any combination of filters: country, city, job category, experience level, salary, work format, posting date. It pages through the results and hands you clean rows.
2. **📋 Direct URL Mode** — Already built the perfect search in your browser? Paste the address straight in and every filter in that link is honoured. Individual job links work too.

🔔 **Plus a third way to use it — Monitoring Mode.** Run it on a schedule and it remembers what it already saw, then reports only **new, updated and reappeared** vacancies. On a daily run that typically means 80–95% fewer rows to pay for and read, and it even spots employers who delete and re-post the same job under a fresh ID.

***

### 👥 Who Is This For?

| 🏢 Use Case                           | 💬 How It Helps                                                                                                       |
| ------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| 🧲 **Recruiters & staffing agencies** | See every competing vacancy for a role the moment it appears, and reach candidates and clients before the market does |
| 📊 **Compensation & market analysts** | Build real salary benchmarks by city, seniority and job family from thousands of live postings instead of surveys     |
| 🎯 **Job seekers & career coaches**   | Get a daily digest of only genuinely new openings matching a very specific brief — no re-reading yesterday's list     |
| 🏗️ **Employer-brand & HR teams**      | Track how rivals describe roles, what they pay, and how fast their vacancies close                                    |
| 📈 **Investors & market researchers** | Use hiring volume by industry and region as a live economic signal                                                    |
| 🤖 **Job boards & aggregators**       | Feed a clean, deduplicated vacancy stream into your own product                                                       |

***

### ✨ Features

- 🌍 **Seven countries, one run** — Russia, Kazakhstan, Belarus, Uzbekistan, Kyrgyzstan, Georgia and Azerbaijan, plus worldwide listings
- 🔤 **Russian and English keywords** — Type «менеджер по продажам» or "python developer"; both work, and Russian city names are understood
- 💰 **Real salary data** — Lower and upper bounds, currency, and whether the figure is before or after tax
- 📄 **Full job descriptions** — Optionally open every vacancy for the complete description text and the employer's key-skills list
- 🏅 **Employer quality signals** — Company rating, review count, official website and IT-accreditation status
- 🔔 **Incremental monitoring** — Recurring runs return only what actually changed, with repost detection
- 📬 **Instant alerts** — Push new matches straight to Telegram, Slack, Discord or your own webhook
- 🎛️ **Smart Filters** — Country, city or region, 27 job categories, experience level, employment type, work format, schedule, education, salary floor and currency, posting date, plus special flags like "accredited IT employer", "salary stated" and "direct employer only"
- 🚫 **Precision controls** — Exclude unwanted words, search job titles only, and apply a strict salary floor that also drops postings hiding their pay
- ♻️ **Deduplication** — Every vacancy appears once, with hh's promoted placements clearly flagged
- 🛡️ **Fails loudly, never silently** — If a run can't collect anything, it reports a real error instead of handing you an empty file and a green tick
- 🔁 **Built for parallel and scheduled runs** — Rotates addresses automatically and retries from a fresh one, so simultaneous runs don't trip hh.ru's per-address limits
- ⚡ **Fast & Scalable** — Up to 100 vacancies per request and thousands per run, with no browser overhead
- 📤 **Export Anywhere** — Download results as JSON, CSV, Excel, or push to Google Sheets, Zapier, Make, or your CRM

***

### 🎛️ Filters & Options

| Option                           | What It Does                                                                                        |
| -------------------------------- | --------------------------------------------------------------------------------------------------- |
| 🔤 **Search Keywords**           | What to look for, in Russian or English. Leave it empty to search purely by filters                 |
| 🚫 **Exclude Keywords**          | Drop vacancies mentioning words you don't want                                                      |
| 🌍 **Country**                   | Limit results to one of the seven countries hh serves                                               |
| 🏙️ **Cities / Regions**          | Narrow to specific places by name — «Москва», «Алматы», «Ташкент»                                   |
| 📂 **Job Categories**            | Pick from hh's own 27 professional families, from IT to logistics to medicine                       |
| 🎓 **Required Experience**       | No experience, 1–3 years, 3–6 years, or more than 6                                                 |
| 📝 **Employment Type**           | Full-time, part-time, project work, or fly-in fly-out                                               |
| 🏡 **Work Format**               | On site, remote, hybrid, or field work                                                              |
| ⏰ **Work Schedule**             | Which working-time arrangement the job uses                                                         |
| 🎒 **Education Required**        | Filter by the education level the employer asks for                                                 |
| 💵 **Minimum Salary & Currency** | Ask hh for better-paying roles, in the currency you choose                                          |
| 💎 **Only With Salary Stated**   | Hide the many postings that keep pay secret                                                         |
| 🔒 **Strict Salary Floor**       | A hard cut applied on our side, which also removes salary-less postings                             |
| 📅 **Posted Within**             | Last 24 hours, 3 days, week or month                                                                |
| 🔍 **Search Only In**            | Match keywords against job titles only, company names only, or descriptions                         |
| 🏷️ **Special Filters**           | Accredited IT employer, direct employer only, internships, night shifts, accessible roles, and more |
| ↕️ **Sort By**                   | Relevance, newest first, or by salary                                                               |
| 📄 **Fetch Full Descriptions**   | Open each vacancy for its complete description and key skills                                       |
| ✂️ **Truncate Descriptions**     | Cap description length to keep exports tidy                                                         |
| ⏱️ **Maximum Age**               | Drop anything published longer ago than you want                                                    |
| 🔔 **Monitoring Mode**           | Emit only new, updated and reappeared vacancies on recurring runs                                   |
| ♻️ **Skip Reposts**              | Ignore jobs that are just an old posting under a new ID                                             |
| 📬 **Alerts**                    | Send new matches to Telegram, Slack, Discord or a webhook                                           |
| 🗜️ **Compact Output**            | Keep only the essential fields                                                                      |
| 🔢 **Max Results**               | Control how many vacancies to extract per run                                                       |
| 🔗 **Direct URLs**               | Optionally paste specific hh.ru search or vacancy links to scrape                                   |

***

### 📦 What You Get (Output Fields)

Every vacancy includes:

#### 💼 Job Basics

| Field       | Example                                     |
| ----------- | ------------------------------------------- |
| vacancyId   | `136415177`                                 |
| title       | `Разработчик Python (Проект до 31.03.2027)` |
| url         | `https://hh.ru/vacancy/136415177`           |
| publishedAt | `2026-08-21T17:12:24.639+03:00`             |
| createdAt   | `2026-03-10T17:43:48.229+03:00`             |
| updatedAt   | `2026-08-21T17:12:24.717+03:00`             |
| isPromoted  | `false`                                     |
| searchQuery | `python`                                    |

#### 🏢 Employer

| Field                 | Example                       |
| --------------------- | ----------------------------- |
| companyName           | `Сатэл`                       |
| companyId             | `1455`                        |
| companyUrl            | `https://hh.ru/employer/1455` |
| companyWebsite        | `http://www.satel.org`        |
| companyRating         | `4.5`                         |
| companyReviewsCount   | `247`                         |
| companyIsAccreditedIt | `true`                        |

#### 💰 Pay

| Field          | Example  |
| -------------- | -------- |
| salaryFrom     | `250000` |
| salaryTo       | `350000` |
| salaryCurrency | `RUR`    |
| salaryGross    | `true`   |
| salaryPeriod   | `MONTH`  |

#### 📍 Location

| Field    | Example                           |
| -------- | --------------------------------- |
| areaName | `Москва`                          |
| areaId   | `1`                               |
| address  | `Москва, 2-я Брестская улица, 48` |

#### 🧾 Requirements & Conditions

| Field                | Example                           |
| -------------------- | --------------------------------- |
| experience           | `between3And6`                    |
| employmentForm       | `FULL`                            |
| workFormats          | `["ON_SITE", "REMOTE", "HYBRID"]` |
| workSchedules        | `["FIVE_ON_TWO_OFF"]`             |
| workingHours         | `["HOURS_8"]`                     |
| professionalRoleIds  | `["96"]`                          |
| driverLicenseTypes   | `[]`                              |
| isInternship         | `false`                           |
| isNightShifts        | `false`                           |
| acceptsTemporary     | `false`                           |
| acceptsLaborContract | `true`                            |
| responsesCount       | `12`                              |

#### 📄 Full Description (when enabled)

| Field       | Example                                                                                                  |
| ----------- | -------------------------------------------------------------------------------------------------------- |
| description | `Задачи: Работа в команде с front-end и ML разработчиками; Разработка новой функциональности продуктов…` |
| keySkills   | `["Python", "FastAPI", "PostgreSQL", "Kubernetes"]`                                                      |

#### 🔔 Monitoring (when enabled)

| Field       | Example                    |
| ----------- | -------------------------- |
| changeType  | `NEW`                      |
| firstSeenAt | `2026-08-20T06:00:00.000Z` |
| lastSeenAt  | `2026-08-22T06:00:00.000Z` |
| isRepost    | `false`                    |
| repostOfId  | `null`                     |

***

### 📊 Example Output

```json
{
    "vacancyId": "136415177",
    "url": "https://hh.ru/vacancy/136415177",
    "title": "Разработчик Python (Проект до 31.03.2027)",
    "companyId": "1455",
    "companyName": "Сатэл",
    "companyUrl": "https://hh.ru/employer/1455",
    "companyWebsite": "http://www.satel.org",
    "companyIsAccreditedIt": true,
    "companyRating": 4.5,
    "companyReviewsCount": 247,
    "salaryFrom": 250000,
    "salaryTo": 350000,
    "salaryCurrency": "RUR",
    "salaryGross": true,
    "salaryPeriod": "MONTH",
    "areaId": "1",
    "areaName": "Москва",
    "address": "Москва, 2-я Брестская улица, 48",
    "experience": "between3And6",
    "employmentForm": "FULL",
    "workFormats": ["ON_SITE", "REMOTE", "HYBRID"],
    "workSchedules": ["FIVE_ON_TWO_OFF"],
    "workingHours": ["HOURS_8"],
    "professionalRoleIds": ["96"],
    "driverLicenseTypes": [],
    "isInternship": false,
    "isNightShifts": false,
    "acceptsTemporary": false,
    "acceptsLaborContract": true,
    "publishedAt": "2026-08-21T17:12:24.639+03:00",
    "createdAt": "2026-03-10T17:43:48.229+03:00",
    "updatedAt": "2026-08-21T17:12:24.717+03:00",
    "responsesCount": 12,
    "isPromoted": false,
    "sourceSite": "hh.ru",
    "searchQuery": "python",
    "description": "Задачи: Работа в команде с front-end и ML разработчиками; Разработка новой функциональности продуктов; Участие в проектировании архитектуры.",
    "keySkills": ["Python", "FastAPI", "PostgreSQL", "Kubernetes"],
    "changeType": "NEW",
    "firstSeenAt": "2026-08-22T06:00:00.000Z",
    "lastSeenAt": "2026-08-22T06:00:00.000Z",
    "isRepost": false,
    "repostOfId": null,
    "scrapedAt": "2026-08-22T21:29:26.315Z"
}
```

***

### 📋 Dataset Views

The Apify Console gives you **3 ready-made table views** to quickly browse your results:

| View                      | What It Shows                                                                                                       |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| 📊 **Overview**           | Job title, company, city, salary range, experience, work format, publication date and link                          |
| 🔔 **Monitoring Changes** | What changed since the last run — new, updated or reappeared — plus first-seen and last-seen dates and repost flags |
| 📋 **All Fields**         | Every single field — the complete dataset                                                                           |

***

### ❓ FAQ

**🤔 Can I search in Russian?**
Yes, and you should — Russian keywords give the best coverage. Russian city names work too («Санкт-Петербург», «Екатеринбург»). English keywords and transliterated spellings are also understood.

**🤔 How many vacancies can I get from one search?**
hh.ru itself only ever shows the first **2000 matches** for any single search, no matter how deep you scroll. This scraper says so clearly in the log when your search is bigger than that, and tells you how many matches you aren't seeing. To collect more, split the search — by city, job category, salary band or posting date — and you can gather tens of thousands of rows across runs.

**🤔 Does it get the full job description?**
Yes, when you enable it. hh's result lists genuinely don't contain descriptions, so each vacancy is opened individually to collect the full text and the employer's key-skills list. Leave it off for a much faster, cheaper run when titles and salaries are enough.

**🤔 Will I keep getting the same jobs every day?**
Not if you turn on Monitoring Mode. The scraper remembers what it already reported and gives you only genuinely new, updated or reappeared vacancies — usually cutting output by 80–95% on a daily schedule. It also flags jobs that are simply old postings republished under a new ID.

**🤔 Why are some results marked as promoted?**
hh places a few paid listings at the top of its result pages. Those are real vacancies, so they are kept — but flagged with `isPromoted`, because they repeat across pages and would otherwise look like duplicates.

**🤔 Can I export the data?**
Yes — JSON, CSV, Excel, XML, HTML, RSS. You can also push data directly to Google Sheets, Zapier, Make, or any webhook/API endpoint.

**🤔 How often should I run this?**
For fresh data, run daily or weekly. You can schedule automatic runs on Apify with just a few clicks — and with Monitoring Mode enabled, frequent runs stay cheap.

**🤔 Does it need proxies?**
Yes, and it is already set up for you. hh.ru limits how many requests a single address may make, so the scraper rotates through Apify's standard (cheapest) proxy pool by default — that is the difference between runs that finish and runs that get refused. You don't have to configure anything; just leave the proxy option on, especially for scheduled or parallel runs.

***

### 🛠️ Need Custom Filters or Features?

**I'm happy to customize this scraper for your specific needs!** 🤝

Whether you need:

- 🎯 Additional filters (specific metro stations, city districts, industry codes, company size, exact salary bands, or a curated list of employers to watch)
- 📊 Extra data fields or custom output formats
- 🔄 Integration with your CRM, Google Sheets, or database
- ⏰ Scheduled scraping with automatic deduplication
- 🌐 Scraping from other job platforms alongside hh.ru

👉 **Don't hesitate to reach out via private message** — I respond quickly and I'm always open to building exactly what you need. No request is too small or too specific!

***

### ⚖️ Legal & Ethical Use

This scraper collects **only publicly available information** from hh.ru — the same job listings any visitor can read without signing in. It does not access private data, candidate CVs or employer accounts, and it does not bypass authentication. Please use the data responsibly and in compliance with applicable laws and platform terms of service.

# Actor input Schema

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

What to search for — Russian or English, e.g. <b>python</b> or <b>менеджер по продажам</b>. Leave empty to search by filters alone (for example every remote job in Moscow posted today).

## `excludeQuery` (type: `string`):

Vacancies containing these words are excluded by hh.ru itself before results are returned.

## `startUrls` (type: `array`):

Paste hh.ru search URLs or individual vacancy URLs. Build the search you want in your browser, copy the address, and drop it here — every filter in the link is honoured. Also accepts hh.kz, hh.uz, rabota.by, headhunter.kg, headhunter.ge and hh1.az links.

## `country` (type: `string`):

Restrict results to one country. Ukraine is absent on purpose — hh no longer operates there (the whole country returns four vacancies).

## `locations` (type: `array`):

City or region names, e.g. <b>Москва</b>, <b>Санкт-Петербург</b>, <b>Алматы</b>, <b>Ташкент</b>. English names work for countries. Anything that cannot be matched is reported in the log rather than silently ignored.

## `areaIds` (type: `array`):

Numeric hh area IDs, if you already know them (1 = Moscow, 2 = Saint Petersburg, 40 = Kazakhstan).

## `roleCategories` (type: `array`):

Professional-role categories from hh’s own catalogue. Each selection is expanded into the individual roles it contains.

## `roleIds` (type: `array`):

Individual hh professional-role IDs, or their Russian names (96 = Programmer / Developer).

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

Experience level demanded by the employer.

## `employmentForm` (type: `string`):

Full-time, part-time, project work or fly-in-fly-out (вахта).

## `workFormat` (type: `string`):

On site, remote, hybrid or field work.

## `schedule` (type: `string`):

Working-time arrangement.

## `education` (type: `string`):

Education level the employer asks for. Only these three values exist on the vacancy search — hh’s longer education list belongs to its CV search.

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

Restrict where the keywords are matched. By default hh searches everywhere; choosing "Job title only" makes results far more precise.

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

Extra hh flags, e.g. accredited IT employer, salary stated, direct employer only.

## `searchPeriod` (type: `string`):

Only vacancies published in the last N days. hh honours 1, 3, 7 and 30.

## `salary` (type: `integer`):

Ask hh for vacancies paying at least this much. Note that hh treats this softly — it keeps vacancies with no stated salary. Combine with "Only with salary stated" for a hard filter.

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

Currency the minimum salary is expressed in.

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

Drop the (very many) hh vacancies that hide their pay.

## `acceptTemporary` (type: `boolean`):

Keep only vacancies whose employer accepts applicants looking for temporary work.

## `sortBy` (type: `string`):

Result ordering. Combine "Newest first" with "Posted within" to monitor fresh postings.

## `maxResults` (type: `integer`):

Stop after this many vacancies. 0 means no limit from us — but note hh itself never serves more than 2000 results for a single search, however deep you page. Split the search by city, category or date to go beyond that; the log says so explicitly when a search is capped.

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

Extra safety stop. 0 means page until the results or the limit run out.

## `pageSize` (type: `integer`):

100 is both the maximum and the cheapest — fewer requests for the same data.

## `includeDetails` (type: `boolean`):

Open every vacancy to collect its full description and key-skills list. The listing pages do not contain the description at all, so this is the only way to get it — at the cost of one extra request per vacancy.

## `descriptionFormat` (type: `string`):

Only relevant when full descriptions are fetched.

## `descriptionMaxLength` (type: `integer`):

0 keeps them whole.

## `detailConcurrency` (type: `integer`):

How many vacancies to open at once when fetching full descriptions. Leave it at 3 — hh.ru limits requests per address, so pushing this higher usually makes the run slower, not faster.

## `includeKeywords` (type: `array`):

Applied after scraping, across title, company, description and key skills. Any match keeps it.

## `excludeKeywords` (type: `array`):

Applied after scraping. Any match drops the vacancy.

## `minSalary` (type: `integer`):

A strict filter we apply ourselves: vacancies with no stated salary, or paying less than this, are dropped. Use it when hh’s own soft salary filter keeps too much.

## `maxAgeMinutes` (type: `integer`):

Drop anything published longer ago than this. 0 disables. Useful for near-real-time monitoring.

## `compact` (type: `boolean`):

Keep only the essential fields.

## `excludeEmptyFields` (type: `boolean`):

Leave out fields that are empty for a given vacancy, producing smaller records.

## `incrementalMode` (type: `boolean`):

Remember what was seen on previous runs and emit only what changed — new, updated and reappeared vacancies. On a schedule this typically cuts output (and cost) by 80–95%, because a job board barely changes between runs.

## `stateKey` (type: `string`):

Name for this monitor’s memory. Leave empty and one is derived from your search, so different searches never share a baseline. Set it explicitly to keep history when you tweak a search.

## `emitUnchanged` (type: `boolean`):

Turns incremental mode into a full snapshot that is still tagged with what changed.

## `emitExpired` (type: `boolean`):

Emit a record when a previously seen vacancy is gone — useful for tracking how fast roles close.

## `skipReposts` (type: `boolean`):

Employers often delete and re-post the same vacancy under a new ID. When enabled, a new vacancy whose content matches one that recently vanished is treated as a repost and dropped.

## `webhookUrl` (type: `string`):

POST the results as JSON to this URL after each run.

## `telegramBotToken` (type: `string`):

Token of the Telegram bot that should send you new matches.

## `telegramChatId` (type: `string`):

The chat, group or channel the Telegram bot should post to.

## `discordWebhookUrl` (type: `string`):

Post new matches into a Discord channel.

## `slackWebhookUrl` (type: `string`):

Post new matches into a Slack channel.

## `notificationLimit` (type: `integer`):

How many vacancies to list in one alert before summarising the rest as a count.

## `notifyOnlyChanges` (type: `boolean`):

Stay quiet on runs that found nothing new, instead of sending an empty alert.

## `includeRunSummary` (type: `boolean`):

Add the run totals (new, updated, expired) to each alert.

## `proxyConfiguration` (type: `object`):

Leave this on. hh.ru limits how many requests one address may make, so runs that share an address start getting refused — measured as only 1 of 6 simultaneous runs succeeding without a proxy, versus 5 of 6 with one. The default datacenter proxy is the cheap option and is what keeps scheduled and parallel runs reliable.

## Actor input object example

```json
{
  "query": "python",
  "startUrls": [],
  "locations": [],
  "areaIds": [],
  "roleCategories": [],
  "roleIds": [],
  "searchFields": [],
  "labels": [],
  "searchPeriod": "0",
  "currency": "RUR",
  "onlyWithSalary": false,
  "acceptTemporary": false,
  "sortBy": "relevance",
  "maxResults": 100,
  "maxPages": 0,
  "pageSize": 100,
  "includeDetails": false,
  "descriptionFormat": "text",
  "descriptionMaxLength": 0,
  "detailConcurrency": 3,
  "includeKeywords": [],
  "excludeKeywords": [],
  "minSalary": 0,
  "maxAgeMinutes": 0,
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "skipReposts": false,
  "notificationLimit": 10,
  "notifyOnlyChanges": true,
  "includeRunSummary": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `monitoring` (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",
    "startUrls": [],
    "locations": [],
    "areaIds": [],
    "roleCategories": [],
    "roleIds": [],
    "searchFields": [],
    "labels": [],
    "includeKeywords": [],
    "excludeKeywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("trev0n/hh-ru-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 = {
    "query": "python",
    "startUrls": [],
    "locations": [],
    "areaIds": [],
    "roleCategories": [],
    "roleIds": [],
    "searchFields": [],
    "labels": [],
    "includeKeywords": [],
    "excludeKeywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("trev0n/hh-ru-scraper").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",
  "startUrls": [],
  "locations": [],
  "areaIds": [],
  "roleCategories": [],
  "roleIds": [],
  "searchFields": [],
  "labels": [],
  "includeKeywords": [],
  "excludeKeywords": []
}' |
apify call trev0n/hh-ru-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/1oyR53dxZcetj5jm3/builds/3RjHGjtp6RNHNou7L/openapi.json
