Skip to content
Язык: Русский

API для разработчиков

Формат ошибок API и коды ошибок

Обновлено 1 ноября 2026 г. 5 мин чтения

Как устроены ответы LinkHarbor API с ошибками, что означают самые важные коды ошибок и как ваш код должен на них реагировать.

Каждый ответ API с ошибкой имеет один и тот же формат. Ваш код должен опираться на код ошибки в поле error, а не на текст в message: код стабилен, а текст может меняться и переводится на язык аккаунта.

Структура ответа с ошибкой

Пример: 422 validation_failed
{
  "error": "validation_failed",
  "message": "Some of the information provided is invalid. Please check and try again.",
  "details": [
    { "field": "title", "reason": "minLength", "message": "…" }
  ],
  "request_id": "6b1f0c2e-…"
}
error
Машиночитаемый код, например not_found. Для большинства ошибок он также передаётся в заголовке X-Error-Code — но опирайтесь на поле в теле.
message
Описание для человека на языке аккаунта: с API-ключом – владельца рабочего пространства, с подключённым приложением – того, кто его подключил. Без действительного токена – например, при 401 из проверки токена – язык следует Accept-Language, иначе текст на английском. Заголовок Content-Language называет язык.
details
Есть, только когда нужно сообщить что-то ещё. Для 422 из проверки входных данных это список с field, reason и message для каждой проблемы; для 422 из бизнес-логики и всех остальных ошибок — объект, например с reason, retry_after_sec или списком issues. При превышении размера в нём есть field, reason и limit, а для 413 request_too_large — max_bytes и max_kb. Поэтому проверяйте, является ли details списком.
request_id
ID запроса. Он также передаётся в заголовке X-Request-Id. Указывайте его, когда обращаетесь в поддержку.

Исключения: в ответе 429 rate_limited вместо details есть поле retry_after_sec; при 429 и 403 insufficient_scope в теле нет request_id. У 401 из проверки токена и 422 из проверки схемы нет заголовка X-Error-Code; при проверке схемы переводится только message верхнего уровня, тексты внутри details остаются на английском. Заголовок X-Request-Id есть всегда.

Самые важные коды

HTTPerrorЗначениеЧто делать
400invalid_jsonТело — некорректный JSONПроверьте JSON
400bad_requestНеверный Content-Type или некорректный запросУкажите Content-Type: application/json
401missing_bearer_tokenНет токена в заголовке AuthorizationУкажите заголовок Authorization: Bearer …
401invalid_tokenТокен истёк или недействителен, или ключ удалёнПолучите новый токен; если не помогает, проверьте ключ
401invalid_api_keyНеверный ID ключа или секрет при обмене токенаПроверьте учётные данные
402plan_limit_reachedДостигнут лимит тарифа, например для коротких ссылокПовысьте тариф или удалите записи
403insufficient_scopeНет области доступа или эндпоинт не открыт для API-ключейСоздайте ключ с нужной областью доступа
403forbiddenНет прав на это действиеВыполните его в панели управления
403feature_not_availableФункция не входит в тарифПроверьте тариф
403block_type_requires_planТип блока доступен только на более высоком тарифеВыберите другой тип блока или повысьте тариф
403template_lockedПремиум-шаблон недоступен на текущем тарифеВыберите шаблон из GET /v1/templates/available
403workspace_suspended, workspace_read_only, workspace_grace_expiredРабочее пространство заблокировано или доступно только для чтения из-за неоплаченного счётаУрегулируйте оплату в панели управления
404not_foundРесурс не существует или не принадлежит вашему рабочему пространствуПроверьте ID
409conflictОбщий конфликт с текущим состояниемЗагрузите состояние заново, измените входные данные
409workspace_template_in_useШаблон рабочего пространства ещё используется страницами; их число указано в details.countПереведите страницы на другой шаблон, затем удалите его
409handle_taken, slug_takenХэндл или слаг короткой ссылки уже занятВыберите другое значение
409form_in_use, page_not_private, page_not_published, never_publishedКонфликт с состоянием: форма ещё размещена на странице, страница не приватная или не опубликована, ни разу не публиковаласьИзмените состояние и повторите попытку
409page_limit_reached, link_limit_reached, block_limit_reached, form_limit_reached, asset_limit_reached, asset_storage_limit_reached, workspace_template_limit_reachedДостигнут лимит тарифа по количеству или объёму хранилищаУдалите записи или повысьте тариф
409draft_not_publishableВ черновике есть проблемы; список — в details.issuesИсправьте проблемы и опубликуйте снова
413request_too_largeТело больше допустимого для этого эндпоинта (64 КБ, 1 МБ или 2 МБ); лимит указан в details.max_kbОтправляйте меньше данных за запрос, см. Лимиты запросов
413payload_too_largeЗагружаемый файл больше 10 МБУменьшите файл
422validation_failedНедопустимые входные данные или неизвестное поле; подробности в detailsИсправьте поля, как описано в details
422handle_reserved, target_url_invalid, target_url_scheme, target_url_hostХэндл зарезервирован, или целевой URL недопустим или не разрешёнВыберите другое значение
422workspace_template_disabledВыбранный шаблон рабочего пространства отключёнВключите шаблон в разделе «Домены и шаблоны» или выберите другой
422template_css_external, template_section_invalidШаблон рабочего пространства: CSS загружает что-то с внешних серверов, или секция {{#if}}/{{#unless}}/{{#each}} расположена неправильноУдалите внешние адреса или закройте секцию внутри того же тега или текста
422custom_css_externalСобственный CSS загружает что-то с внешних серверовУдалите внешние адреса из CSS
429rate_limited, api_key_lockedСлишком много запросов, или ключ заблокирован после неудачных попытокПодождите столько, сколько указано в Retry-After или details.retry_after_sec
500internal_errorНепредвиденная ошибкаПовторите позже, сохраните request_id
503service_unavailableСервис временно недоступенПовторите после паузы

Как читать ошибки во входных данных

При 422 validation_failed details перечисляет каждую проблему отдельно: field — путь к полю (со слешами для вложенных объектов, например theme_config/button_style), reason — нарушенное правило, например required, minLength, maxLength, enum или additionalProperties. При additionalProperties в message сказано, какие поля неизвестны, — часто это опечатка в имени поля.

Рекомендуемая обработка в коде

  • 400, 413 и 422: не повторяйте, а исправьте запрос
  • 401 invalid_token: один раз получите новый токен и повторите
  • 403: не повторяйте; проверьте область доступа, тариф или то, кому разрешено это действие
  • 404: проверьте ID; после удаления это нормально
  • 409: загрузите состояние заново и решите, нужно ли ещё это действие
  • 429: подождите столько, сколько указано в Retry-After, затем повторите — см. Лимиты запросов
  • 500 и 503: повторите несколько раз с растущими паузами

Ничего не нашли?

Напишите, что вам нужно, и наша служба поддержки поможет вам лично.

Написать в поддержку