Ошибки
Получить ключ APIКаждая ошибка приходит с HTTP-статусом и одним и тем же JSON-конвертом. code служит контрактом, который читает ваш код; message написан для человека и может меняться.
{
"error": {
"code": "invalid_request",
"message": "The request is invalid",
"details": [
{ "field": "targets[0].text", "code": "required", "message": "targets[0].text is required" }
],
"docUrl": "https://www.sofia-post.com/developers/errors#invalid_request",
"requestId": "2aab5943-6333-4caf-8478-25a85ebd4abf"
}
}detailsрассказывает больше: отклонённое поле, причину для сети, исчерпанное окно лимита.docUrlведёт к объяснению кода на этой странице.requestIdидентифицирует запрос: сообщите его в поддержку.
Коды ошибок
| Статус | Код | Значение |
|---|---|---|
| 400 | invalid_request | Тело, запрос или параметр недопустимы. Одна запись на каждое отклонённое поле: field, code (required, is_string, max…) и message. |
| 400 | invalid_json | Тело не является корректным JSON. |
| 400 | invalid_cursor | Курсор не был возвращён Sofia API. |
| 400 | webhook_url_invalid | Адрес webhook не https или ведёт на частный адрес. |
| 400 | webhook_event_invalid | Неизвестное событие webhook. |
| 400 | application_name_invalid | Настройки › API: название клиента отсутствует или слишком длинное. |
| 400 | application_profile_invalid | Настройки › API: одно из полей профиля клиента недопустимо; в подробностях указано, какое. |
| 400 | logo_invalid | Настройки › API: логотип отклонён (не менее 180×180 px, PNG, JPEG или WebP, не более 2 МБ). |
| 401 | invalid_token | Токен отсутствует, неизвестен, истёк или отозван, либо человек, стоящий за ним, потерял права, которые он несёт. См. заголовок WWW-Authenticate. |
| 401 | unauthorized | Требуется аутентификация. |
| 402 | subscription_required | Реальная запись (включая пробный запуск) требует активной подписки или пробного периода. |
| 403 | insufficient_scope | У токена нет scope эндпоинта; он указан в деталях. |
| 403 | insufficient_role | Ваша роль в этом Workspace не позволяет это действие. |
| 403 | live_mode_required | Реальная запись с тестовым токеном. |
| 403 | route_closed_to_applications | Этот эндпоинт недоступен приложениям. |
| 403 | forbidden | Доступ запрещён. |
| 403 | session_required | Настройки › API: для этого действия нужна сессия Sofia, а не токен. |
| 403 | impersonation_forbidden | Настройки › API: это действие отклоняется в заимствованной сессии. |
| 403 | workspace_owner_required | Это может сделать только владелец Workspace. |
| 403 | workspace_member_required | Вы не участник этого Workspace. |
| 404 | route_not_found | Ни один эндпоинт не отвечает на этот метод и путь. |
| 404 | establishment_not_found | Неизвестное заведение или недоступно этому токену. |
| 404 | media_not_found | Неизвестное медиа или недоступно этому токену. |
| 404 | post_not_found | Неизвестная публикация или недоступна этому токену. |
| 404 | webhook_not_found | Неизвестный webhook или принадлежит другому приложению. |
| 404 | not_found | Ресурс не существует. |
| 404 | application_not_found | Настройки › API: неизвестный клиент. |
| 404 | grant_not_found | Неизвестная авторизация или уже отозвана. |
| 404 | personal_key_not_found | Настройки › API: неизвестный личный ключ. |
| 404 | consent_not_found | Запрос авторизации истёк или не существует: начните заново с эндпоинта авторизации. |
| 405 | method_not_allowed | Этот метод не разрешён для этого эндпоинта. |
| 409 | post_in_flight | Сеть отправляет публикацию: повторите удаление чуть позже. |
| 409 | post_not_editable | Сеть уже отправила публикацию: её больше нельзя изменить. |
| 409 | account_already_connected | Эта сеть уже подключена к заведению. |
| 409 | webhook_limit_reached | У приложения уже 10 webhook. |
| 409 | idempotency_in_progress | Первый запрос с этим Idempotency-Key ещё выполняется. |
| 409 | conflict | Запрос противоречит текущему состоянию ресурса. |
| 409 | scope_removal_forbidden | Настройки › API: разрешение клиента можно добавить, но нельзя удалить. |
| 409 | public_client_has_no_secret | Настройки › API: у публичного клиента нет секрета. |
| 413 | payload_too_large | Файл превышает лимит загрузки. |
| 415 | unsupported_media_type | Неподдерживаемый тип содержимого. |
| 422 | post_refused | Сеть, заведение или ваш тариф отклонили бы публикацию. Одна запись на каждую причину, у каждой свой message. |
| 422 | media_import_refused | Не удалось импортировать медиа по этому URL; причина указана в деталях. |
| 422 | media_upload_refused | Загруженный файл не является поддерживаемым изображением или видео. |
| 422 | platform_not_offered | Эту сеть нельзя подключить. |
| 422 | idempotency_key_reused | Этот Idempotency-Key уже использовался с другим телом. |
| 422 | unprocessable_entity | Запрос понятен, но не может быть обработан. |
| 429 | rate_limit_exceeded | Окно лимита заполнено: подождите время из Retry-After. |
Причины отклонения публикации
post_refused перечисляет каждую причину в details[].code:
| Код | Значение |
|---|---|
unsupported_platform | Эта сеть не поддерживается. |
duplicate_platform | Одна и та же сеть указана дважды. |
unsupported_format | Эта сеть не предлагает этот формат. |
caption_too_long | Текст слишком длинный (max, actual). |
too_many_hashtags | Слишком много хештегов (max, actual). |
too_many_mentions | Слишком много упоминаний (max, actual). |
too_many_thread_posts | Тред слишком длинный (max, actual). |
too_many_media | Слишком много медиа (max, actual). |
media_mix_refused | В этой сети нельзя смешивать фото и видео. |
media_required | Этой сети нужно фото или видео. |
media_type_refused | Эта сеть не принимает этот тип медиа. |
scheduled_in_past | scheduledAt находится в прошлом. |
scheduled_at_invalid | Запланированной публикации нужен будущий scheduledAt. |
account_not_connected | Для этого заведения в этой сети нет подключённого аккаунта. |
account_ambiguous | В этой сети подключено несколько аккаунтов: укажите один через accountId. |
media_not_found | Медиа нет в медиатеке этого заведения. |
media_url_invalid | URL медиа должен быть публичным https-адресом. |
platform_unavailable | Эта сеть ещё не открыта в Sofia. |
publication_quota_exceeded | Квота публикаций вашего тарифа исчерпана. |
Обработка ошибок
- Ветвите логику по
code, а не поmessage. - Повторяйте
429послеRetry-After, а5xxповторяйте с экспоненциальной задержкой. - Никогда не повторяйте
4xxбез изменений: сначала исправьте запрос. - Записывайте
requestIdпри каждой ошибке.