- Ошибка в запросе
- Системная ошибка
- Неверный User-Agent
- Получение/обновление токенов
- Ошибки использования авторизации
- Ошибки доступа к платному методу
- Ошибки отдельных ресурсов
- Сохраненные поиски резюме
- Переписка (отклики/приглашения)
- Публикация и редактирование вакансий
- Продление вакансии
- Менеджеры работодателя
- Работа с резюме
- Рабочие аккаунты менеджера
- Необходимость пройти капчу
API широко использует информирование при помощи HTTP кодов ответов. Приложение должно корректно их обрабатывать.
При каждой ошибке, помимо кода ответа, в теле ответа выдаётся дополнительная информация, позволяющая разработчику понять причину ошибки.
Все ошибки выдаются в формате:
{
"errors": [
{
"type": "...",
"value": "..."
}
]
}
Одновременно может выдаваться несколько ошибок.
Ключ type
присутствует в каждом объекте массива errors
и содержит текстовый
идентификатор класса ошибки. Ключ value
опционален и конкретизирует данные
об ошибке.
Помимо описанных выше
errors
, API может выдавать дополнительно другие ключи, оставленные для обратной совместимости. Использовать их не рекомендуется.
В случае невозможности найти запрашиваемый ресурс вернётся ответ
404 Not Found
и в массиве errors
будет объект:
{
"type": "not_found"
}
При ошибке в параметрах запроса (к примеру,
GET https://api.hh.ru/vacancies/?employer_id=foo
) в ответ придёт
400 Bad Request
, в массиве ошибок будет объект:
{
"type": "bad_argument",
"value": "employer_id"
}
Если в данный момент сервис не может обработать запрос, но он его корректно
понял, то в ответ придёт 503 Service Unavailable
и type
будет содержать
service_unavailable
.
В случае непредвиденной ситуации API вернёт 500.
В редких случаях ошибки с 5** кодами могут возвращаться с телом не содержащим валидный json. Приложение должно в таких случаях ориентироваться только на код ответа.
Подробнее про заголовок User-Agent.
HTTP code | type | value | описание |
---|---|---|---|
400 | bad_user_agent | unset | заголовок User-Agent не передан |
400 | bad_user_agent | blacklisted | значение User-Agent в чёрном списке |
Подробнее про авторизацию.
Описание полей:
Имя | Тип | Значение |
---|---|---|
error | строка | Одно из значений, описанных в стандарте RFC 6749. Например, invalid_request , если какой либо из обязательных параметров не был передан |
error_description | строка | Дополнительное описание ошибки |
Ниже приведены некоторые возможные ошибки с описанием.
HTTP code | error | error_description | описание |
---|---|---|---|
400 | invalid_request | account not found | Ошибка может возникнуть, если передана неправильная пара client_id и client_secret |
account is locked | Пользовательский аккаунт заблокирован. Пользователь должен обратиться в службу поддержки сайта | ||
password invalidated | Пароль от пользовательского аккаунта устарел. Пользователь должен восстановить пароль на сайте https://hh.ru | ||
login not verified | Пользовательский аккаунт не подтвержден. Пользователь должен обратиться в службу поддержки сайта | ||
bad redirect url | Передан неправильный redirect_url | ||
token is empty | Не передан refresh_token | ||
token not found | Передан не правильный refresh_token | ||
code not found | Переданный authorization_code не найден | ||
400 | invalid_client | client_id or client_secret not found | Ошибка может возникнуть в случае, если данный client_id не найден или был удален, передан неправильный client_secret |
400 | invalid_grant | token has already been refreshed | Ошибка возникает при попытке воспользоваться refresh-токеном второй раз |
token not expired | Ошибка возникает при попытке обновить действующий access-токен. access-токен можно обновлять только после того, как он истек | ||
token was revoked | Токен был отозван. Например, токен отзывается, если время действия пароля истекло | ||
bad token | Передано неправильное значение токена | ||
code has already been used | authorization_code уже был использован (его можно использовать только один раз) | ||
code expired | authorization_code истек | ||
code was revoke | authorization_code был отозван (это происходит, если время действия пароля истекло) | ||
token deactivated | Токен был деактивирован. Токен деактивируется после того, как пользователь сменил пароль | ||
400 | unsupported_grant_type | unsupported grant_type | Возникает, если передать неправильное значение в поле grant_type |
403 | forbidden | app token refresh too early | Возникает, если запрашивать token приложения чаще чем раз в пять минут |
В случае, если вы
совершаете авторизованный запрос
в api и предоставленная авторизация по каким-либо причинам не действительна,
вернётся ошибка с type
oauth
и, возможно, одним из перечисленных value
.
HTTP code | type | value | описание |
---|---|---|---|
403 | oauth | bad_authorization | токен авторизации не существует или не валидный |
403 | oauth | token_expired | время жизни access_token завершилось, необходимо выполнить обновление access_token |
403 | oauth | token_revoked | токен отозван пользователем, необходимо запросить новую авторизацию |
403 | oauth | application_not_found | ваше приложение было удалено |
403 | oauth | user_auth_expected | выполняется запрос с авторизацией приложения, для выполнения которого необходима авторизация пользователя |
В случае, если вы запрашиваете один из платных методов без купленного доступа, вернётся следующая ошибка:
HTTP code | type | value | описание |
---|---|---|---|
403 | api_access_payment | action_must_be_payed | запрос платного метода при отсутствии оплаченного доступа |
В тех случаях, когда сервис способен выдать более подробную информацию об ошибке, она будет выдана в теле ответа. В этом случае скорее всего код ответа будет 400, 403, 409, 429, но возможны и другие.
Как минимум, приложение должно корректно обрабатывать HTTP статусы ответов. Для более удобной работы с приложением, рекомендуется также обрабатывать пришедший тип ответа. Приведенные ниже таблицы содержат неполный список ошибок, он может расширяться.
Помимо кода ошибки при передаче сохраненного поиска резюме другому менеджеру, могут быть возвращены следующие ошибки:
HTTP code | type | value | описание |
---|---|---|---|
404 | saved_searches | saved_search_not_found | автопоиск не был найден или не принадлежит текущему пользователю |
404 | saved_searches | manager_not_found | несуществующий manager_id |
Помимо общих ошибок, могут быть возвращены следующие ошибки:
HTTP code | type | value | описание |
---|---|---|---|
400 | negotiations | vacancy_not_found | вакансия не найдена |
403 | negotiations | invalid_vacancy | вакансия из отклика/приглашения была архивирована либо скрыта |
400 / 403 | negotiations | resume_not_found | резюме из отклика/приглашения было скрыто, либо удалено, либо не найдено |
403 | negotiations | already_applied | уже есть отклик/приглашение на указанную связку resume_id+vacancy_id |
403 | negotiations | test_required | для отклика необходимо пройти тест (в данный момент, отклик на такие вакансии через API недоступен) |
403 | negotiations | resume_visibility_conflict | невозможно откликнуться на анонимную вакансию резюме с видимостью "белый список" |
403 | negotiations | edit_forbidden | редактирование сообщения недоступно |
403 | negotiations | application_denied | общая ошибка запрета отклика в случае, когда дополнительная информация недоступна |
400 / 403 | negotiations | limit_exceeded | превышен лимит количества откликов/приглашений |
403 | negotiations | wrong_state | действие по отклику/приглашению в данном статусе невозможно |
403 | negotiations | empty_message | передан пустой текст письма |
403 | negotiations | too_long_message | передан слишком длинный текст письма |
403 | negotiations | address_not_found | переданный к действию по адрес не существует, либо принадлежит другому работодателю |
403 | negotiations | not_enough_purchased_services | не хватает оплаченных услуг, обычно доступа к базе резюме |
403 | negotiations | in_a_row_limit | превышено количество последовательных сообщений в переписке, оппонент должен ответить на сообщение, чтобы появилась возможность писать вновь |
403 | negotiations | overall_limit | превышен лимит сообщений |
403 | negotiations | no_invitation | переписка недоступна, так как в отклике ещё не было приглашения |
403 | negotiations | message_cannot_be_empty | сообщение в переписке не может быть пустым |
403 | negotiations | disabled_by_employer | возможность переписки по отклику отключена работодателем |
403 | negotiations | resume_deleted | отправить сообщение невозможно, так как резюме, с которым совершался отклик, удалено или скрыто |
403 | negotiations | archived | отправить сообщение невозможно, так как вакансия, на которую совершался отклик, заархивирована |
403 | negotiations | chat_archived | действие по отклику/приглашению невозможно, так как отклик/приглашение заархивировано |
Помимо кода ошибки при публикации и редактировании вакансии могут быть возвращены следующие ошибки:
HTTP code | type | value | reason | описание |
---|---|---|---|---|
400 | bad_json_data | field_name | reason | ошибка в поле вакансии, где field_name – ключ поля верхнего уровня, поле reason может не присутствовать |
403 | vacancies | not_enough_purchased_services | купленных услуг для публикации или обновления данного типа вакансии не достаточно | |
403 | vacancies | quota_exceeded | квота менеджера на публикацию данного типа вакансии закончилась | |
403 | vacancies | duplicate | аналогичная вакансия уже опубликована. В ответе передается информация по дубликатам вакансии. Данную ошибку можно форсировано отключить (при добавлении и редактировании) | |
403 | vacancies | creation_forbidden | публикация вакансий недоступна текущему менеджеру | |
403 | vacancies | unavailable_for_archived | редактирование недоступно для архивной вакансии | |
403 | vacancies | conflict_changes | конфликтные изменения данных вакансии (подробнее) |
reason | описание |
---|---|
is_empty | пустое значение |
wrong_size | значение имеет неправильный размер |
is_too_short | значение имеет слишком маленький размер |
is_too_long | значение имеет слишком большой размер |
currency_code_is_invalid | валюта заработной платы введена некорректно |
chosen_area_is_not_a_leaf_or_not_exist | местоположение вакансии введено неверно (например, передали id, которого нет) или не является конечным регионом (город, населенный пункт) |
email_in_description | в описании вакансии содержится email |
anonymous_vacancy_contains_address | в анонимной вакансии не должен содержаться адрес работодателя |
anonymous_vacancy_has_real_company_name | в названии вакансии не должно содержаться название компании работодателя |
only_for_anonymous_type | действие доступно только для анонимных вакансий |
address_is_disabled | адрес недоступен |
vacancy_type_employer_billing_type_mismatch | тип вакансии не совместим с текущим биллинг-типом |
only_for_direct_type | действие доступно только для прямых вакансий |
address_is_empty_with_checked_show_metro_flag | введен пустой адресс с указанием показывать метро |
address_has_no_metro_but_checked_show_metro_flag | по введенному адресу не доступно метро, но указана опция показывать метро |
default_vacancy_branded_template_is_invalid_or_not_enough_purchased_services | в запросе указан шаблон, который отсутствует в списке доступных шаблонов (этот список можно получить запросом ). Также шаблон может отсутствовать в списке доступных шаблонов, если не оплачена услуга использования брендированного шаблона вакансии |
department_code_prohibited_in_anonymous_vacancy | нельзя указать код подразделения для анонимной вакансии |
branded_template_prohibited_in_anonymous_vacancy | использование брендированного шаблона невозможно для анонимной вакансии |
value_conflict_with_business_rules | публикация вакансии с указанным billing_type запрещена |
{
"errors": [
{
"type": "vacancies",
"value": "duplicate",
"found": 2,
"items": [
{
"id": 1337
},
{
"id": 78789890
}
]
}
]
}
Имя | Тип | Описание |
---|---|---|
found | number | Общее количество дубликатов вакансии |
items | array | Ограниченное количество записей с информацией о дубликатах. Не гарантирует выдачу всех дубликатов. |
items[].id | number | Идентификатор вакансии |
Помимо кода ошибки при продлении вакансии могут быть возвращены следующие ошибки:
HTTP code | type | value | описание |
---|---|---|---|
403 | vacancies | not_enough_purchased_services | купленных услуг для продления данного типа вакансии не достаточно |
403 | vacancies | quota_exceeded | квота менеджера на публикацию данного типа вакансии закончилась |
403 | vacancies | prolongation_forbidden | продление вакансий недоступно текущему менеджеру |
403 | vacancies | unavailable_for_archived | продление недоступно для архивной вакансии |
403 | vacancies | too_early | продление раньше времени |
Помимо общих ошибок при редактировании менеджера работодателя могут быть возвращены следующие ошибки:
HTTP code | type | value | reason | описание |
---|---|---|---|---|
400 | managers | field_name | ошибка в поле field_name | |
403 | managers | already_exist | менеджер с такой почтой уже существует | |
403 | managers | creation_limit_exceeded | достигнут лимит на создание менеджеров | |
403 | managers | field_name | not_editable | поле field_name недоступно для редактирования |
Помимо общих ошибок при получении и обновлении резюме могут быть возвращены следующие ошибки:
HTTP code | type | value | описание |
---|---|---|---|
400 | bad_argument | with_contact | не правильное значение поля with_contact |
400 | resumes | total_limit_exceeded | превышено допустимое количество резюме (актуально только для соискателей) |
429 | resumes | view_limit_exceeded | превышен лимит просмотров резюме в сутки (актуально только для работодателей) |
403 | resumes | quota_exceeded | превышена квота просмотров резюме установленная менеджеру (актуально только для работодателей) |
403 | resumes | no_available_service | не хватает услуг для просмотра резюме |
403 | resumes | cant_view_contacts | нет прав на просмотр контактов |
Помимо type
и value
в теле ответа ошибки может вернуться description
- описание при каких обстоятельствах возникает ошибка
HTTP code | type | value | reason | описание |
---|---|---|---|---|
400 | bad_argument | id | too_many_bulk_items | слишком много id |
400 | bad_argument | id | передан невалидный идентификатор |
HTTP code | type | value | описание |
---|---|---|---|
403 | manager_extra_accounts | manager_extra_account_not_found | В заголовке передан некорректный id аккаунта |
403 | manager_accounts | used_manager_account_forbidden | Рабочий аккаунт заблокирован |
В случае, если аккаунт пользователя заблокирован, придет ошибка вида:
{
"errors": [
{
"type": "manager_accounts",
"value": "used_manager_account_forbidden",
"allowed_accounts": [
{
"id": "1",
"employer": {
"id": "12345678",
"name": "Alpha Corp."
}
},
{
"id": "2",
"employer": {
"id": "87654321",
"name": "Beta Inc."
}
}
]
}
]
}
где allowed_accounts
содержит массив доступных для этого токена аккаунтов
Элементы массива аналогичны результату, выдаваемому в списке рабочих аккаунтов
Некоторые операции в API могут быть защищены капчей. Наличие такой проверки явно указывается в описании ресурса. При этом возвращается следующая ошибка:
{
"type": "captcha_required",
"value": "captcha_required",
"fallback_url": "https://hh.ru/account/connect/register....",
"captcha_url": "https://hh.ru/account/captcha?state=..."
}
Имя | Тип | Описание |
---|---|---|
fallback_url | string or null | Адрес веб-страницы, на котором можно выполнить аналогичную операцию (страница, чаще всего, сама защищена капчей) |
captcha_url | string or null | Адрес веб-страницы, на котором можно пройти капчу. После прохождения капчи аналогичный запрос в апи должен выполниться успешно. Приложение должно добавить в captcha_url обязательный параметр backurl , на который произойдет редирект после прохождения капчи. backurl должен обязательно содержать схему, например, https:// или схему приложения |
Параметры fallback_url
или captcha_url
могут отсутствовать по-отдельности, но не могут отстутствовать одновременно.