Сценарий из mcp-everything. Актуально на 2026-10-24.
Отправлять кандидатам сообщения из своей системы и читать ответы.
curl -X POST https://api.hh.ru/common/chats/<chat_id>/messages \
-H "Authorization: Bearer $HH_TOKEN" -H 'HH-User-Agent: MyApp/1.0 (dev@example.ru)' \
-H 'Content-Type: application/json' \
-d "{\"idempotency_key\": \"$(uuidgen)\", \"text\": \"Добрый день! Приглашаем на собеседование в четверг в 15:00.\"}"
https://api.hh.ru?host=Тип: OAuth 2.0
OAuth 2.0. Токен передаётся в заголовке Authorization: Bearer {ACCESS_TOKEN}.
https://hh.ru/oauth/authorize?response_type=code&client_id={client_id}&state={state}&redirect_uri={redirect_uri}, затем authorization_code из редиректа обменивается на access_token и refresh_token запросом POST https://api.hh.ru/token. Поддерживается PKCE (code_challenge, code_challenge_method=S256).POST https://api.hh.ru/token с refresh_token; refresh-токен одноразовый и работает только после истечения access_token (срок — expires_in, в секундах).https://dev.hh.ru/admin.Параметры /oauth/authorize: skip_choose_account=true — не показывать выбор аккаунта, force_login=true — всегда показывать форму входа, role (applicant или employer) с force_role=true — требовать нужную роль.
В каждом запросе обязателен заголовок User-Agent или HH-User-Agent (при обоих учитывается HH-User-Agent); без него — 400 Bad Request.
User-Agent: MyApp/1.0 (my-app-feedback@example.com)
| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
page |
query | integer | нет | Страница, 0–50 |
per_page |
query | integer | нет | Чатов на странице, 1–20 (по умолчанию 20) |
filter_unread |
query | boolean | нет | Только непрочитанные |
filter_has_text_message |
query | boolean | нет | Только с активной перепиской (для работодателя) |
vacancy_status |
query | string | нет | all (по умолчанию), with, without |
filter_with_vacancy_ids |
query | string | нет | Список ID вакансий, например [1,2,3] (до 100) |
| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
chat_id |
path | string | да | Идентификатор чата |
start_message_id |
query | string | нет | С какого сообщения выбирать |
limit |
query | integer | нет | 1–50, по умолчанию 10 |
order |
query | string | нет | next (по умолчанию) или prev |
Вместе с ключом идемпотентности передаётся либо текст, либо ID загруженных файлов. Успех — 201; 409 — повтор idempotency_key.
| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
chat_id |
path | string | да | Идентификатор чата |
idempotency_key |
body | string | да | Уникальный ключ сообщения (UUID) |
text |
body | string | нет | Текст сообщения |
file_upload_ids |
body | array | нет | upload_id загруженного файла (1 элемент) |
Пример запроса:
{
"idempotency_key": "8abcdef8-4abc-4edf-1234-1234567890ab",
"text": "Cъешь же ещё этих мягких французских булок, да выпей чаю"
}
page=N&per_page=M, нумерация с нуля; ответ — found, per_page, pages, page, items./cors (HEAD, GET, POST, PUT, DELETE), для JSONP — ?callback=callback_name.2xx или 409 для дубликата (определяется по id). Без ответа за 5 секунд колбэк отправляется повторно; доставка не гарантирована. При долгих сбоях подписка блокируется, при отзыве доступа удаляется./negotiations/{nid}/messages устарели — переписка ведётся через /common/chats.hidden_fields.Если этого недостаточно — официальная документация: https://api.hh.ru/openapi/redoc Вся интеграция одним документом: https://mcp-everything.ru/integrations/hh-api.md