Ошибки
Любая ошибка API — HTTP-код по классу ошибки и тело одной формы. Решение принимайте по
kind (что делать) и code (почему), а не по тексту message: текст может
меняться.
Пример
HTTP/1.1 429 Too Many Requests
Retry-After: 12
X-Request-Id: a1b2c3d4e5f60718
{"ok": false,
"error": {"kind": "too_often", "code": "too_often", "message": "лимит ключа в минуту",
"retry_after": 12},
"request_id": "a1b2c3d4e5f60718"}
kind,code,message,retry_afterесть всегда (могут бытьnull). По месту бываютfields(какие поля не разобрались),missing(каких прав не хватает),vk_error(ошибка ВКонтакте как есть),cursorиcount(докуда дошёл поток).request_id— тот же, что в заголовкеX-Request-Id. Называйте его, когда пишете в поддержку.- На
429и503сretry_afterтот же срок приходит заголовкомRetry-After; на401—WWW-Authenticate: Bearer. - Ошибки разбора тела —
400 caller_error, code=bad_argsсо спискомfields, а не422. - Ошибка посреди потока NDJSON — последняя строка
{"error": {…, "cursor", "count"}}: продолжите сcursor.
Классы ошибок
| kind | HTTP | когда | что делать |
|---|---|---|---|
caller_error |
400 | запрос не разобрался: кривые поля, неизвестный метод или вид задачи, запрещённый адрес | исправить запрос по code и fields; повтор без правки бесполезен |
auth_failed |
401 / 403 | 401 — с ключом что-то не так; 403 — ключу это нельзя | 401: проверить ключ и заголовок Authorization; 403: выпустить ключ с нужными правами в кабинете или написать в поддержку. Повтор без этого бесполезен |
payment_required |
402 | тариф не пускает: кредиты кончились, тестовый период закончился, счёт не оплачен, возможности нет в тарифе | оплатить счёт, докупить кредиты или включить перерасход в кабинете («Тариф и оплата»); повтор без этого бесполезен |
not_found |
404 | нашего объекта нет или он чужой: подписка, задача, путь; закрытый чат, которого ключ не видит | проверить id; повтор бесполезен |
no_data |
404 | у источника нет данных: канал закрыт или удалён, имя не занято, у сообщения нет медиа | не повторять: ответ будет тем же |
conflict |
409 | повтор с тем же Idempotency-Key, но другим телом; первый запрос ещё выполняется; второй поток |
по code: исправить ключ повтора или подождать retry_after |
no_free_accountsповтор помогает |
409 | сейчас некому выполнить запрос | повторить через retry_after |
account_lostповтор помогает |
410 | исполнитель запроса выбыл посреди работы | повторить запрос; поток — продолжить с cursor |
payload_too_large |
413 | тело запроса больше 1 МБ | разделить запрос на части |
too_oftenповтор помогает |
429 | лимит ключа в минуту выбран | подождать retry_after секунд |
quota_exceededповтор помогает |
429 | суточная квота ключа выбрана, или задач в работе больше, чем позволяет тариф | подождать retry_after (для квоты — до конца суток UTC) или дождаться завершения задач |
floodповтор помогает |
429 | источник попросил подождать | подождать retry_after секунд и повторить |
join_limit |
429 | суточный лимит вступлений выбран | ничего не делать: заявка ждёт в очереди |
captchaповтор помогает |
429 | ВКонтакте попросил капчу | повторить позже |
platform_unknownповтор помогает |
500 | непредвиденная ошибка | повторить позже; если повторяется — в поддержку с request_id |
exit_faultповтор помогает |
502 | сбой сети по пути к источнику | повторить |
platform_faultповтор помогает |
502 | источник ответил ошибкой (5xx) | повторить позже |
unavailableповтор помогает |
503 | сервис временно недоступен или на обслуживании | повторить через retry_after |
Частые коды
caller_error · 400
bad_args | поля не разобрались; в fields[] — какие и почему |
unknown_kind | неизвестный вид задачи |
unknown_preset | неизвестный шаблон сбора |
preset_not_ready | шаблон ещё не подключён |
invite_unsupported | ссылки-приглашения в задачах не принимаются |
private_chat | закрытый чат в шаблоне сбора |
webhook_url_forbidden | адрес вебхука не подходит: нужен https на 443 и публичный адрес |
unknown_event | неизвестное событие вебхука |
url_forbidden | адрес страницы не с vk.com |
bad_method | имя метода ВКонтакте не раздел.метод |
method_banned | метод недоступен |
idempotency_key_required | нужен заголовок Idempotency-Key |
bad_idempotency_key | Idempotency-Key не того вида: 1–128 символов A-Z a-z 0-9 _ - : . |
bad_ref | ссылка на канал не разобралась |
too_many_chats | каналов в подписке больше, чем можно |
bad_cursor | курсор страницы не разобрался: берите next_cursor из прошлого ответа как есть |
too_large | файл больше max_bytes |
use_stream | этот запрос отдаётся только потоком |
vk_<номер> | ошибка самого ВКонтакте, подробности — в vk_error |
tl_banned | TL-запрос вне белого списка или обёртка Invoke* |
use_join_endpoint | вступление и выход — только через /v1/tg/join|leave |
lease_required | диалоги — только на своей аренде |
personal_dialog | личная переписка аккаунта — только на своей аренде |
no_such_method | такого метода нет |
not_iter_method | поток — только у методов iter_* |
bad_pool | пула с таким именем у ключа нет |
auth_failed · 401 / 403
no_key | нет заголовка Authorization: Bearer … |
bad_key_format | ключ не того вида |
key_unknown | такого ключа нет |
key_revoked | ключ отозван |
key_expired | срок ключа вышел |
wrong_key_type | ключ не для этого API |
no_scope | у ключа нет права; каких — в missing |
ip_not_allowed | запрос не с разрешённого адреса |
org_disabled | организация отключена |
edition_forbidden | возможность недоступна для вашей организации |
not_own_account | диалоги — только у аккаунта своей организации |
payment_required · 402
credits_exhausted | кредиты месяца и дополнительные кончились, перерасход выключен или выбран |
trial_ended | тестовый период закончился: доступно только чтение готового |
read_only | счёт не оплачен после льготных 7 дней |
subscription_cancelled | подписка закрыта |
no_subscription | у организации нет тарифа |
not_in_plan | возможности нет в тарифе (например, медиа на тестовом периоде) |
plan_limit | лимит тарифа: например, каналов в подписках больше, чем позволяет тариф |
not_found · 404
lease_expired | аренда истекла без heartbeat |
lease_released | аренда отпущена |
account_unknown | аккаунта с такой меткой нет в пулах ключа |
no_data · 404
no_media | у сообщения нет медиа |
conflict · 409
idempotency_mismatch | тот же Idempotency-Key с другим телом |
idempotency_in_progress | первый запрос с этим ключом ещё выполняется |
stream_busy | у подписки уже открыт поток |
paused_by_owner | подписку остановили мы (ключ, тариф) — её не снять с паузы |
subscription_ended | подписка закончена: менять её нельзя, создайте новую |
subscription_not_active | подписка на паузе или закончена: поток не открыть |
webhook_limit | адресов вебхуков у организации уже максимум |
webhook_disabled | адрес вебхука выключен: сначала включите его |
chat_in_use | чат нужен другой подписке |
no_free_accounts · 409
no_member | нет свободного участника закрытого чата |
account_busy | аккаунт в чужой аренде |
account_unavailable | аккаунт с этой меткой сейчас не работает |
no_free_proxies | свободных прокси нет |
account_lost · 410
lease_account_lost | аккаунт аренды выбыл: возьмите новую аренду |
unavailable · 503
joins_frozen | автовступления заморожены |
account_offline | аккаунт аренды не на связи |
node_unavailable | узел Telegram недоступен |
Как повторять
- Повторяйте только то, где это помогает:
429,502,503,409 no_free_accounts,409 idempotency_in_progress— не раньшеretry_after. Добавьте к паузе немного случайности, чтобы повторы нескольких процессов не совпали. Если502и503идут подряд, загляните на страницу состояния сервиса: там видно, известен ли сбой и когда он начался. 400,401,402,403,404повтором не лечатся: нужно исправить запрос, ключ или тариф.- Повтор действия (задача, подписка) — с тем же
Idempotency-Key: тогда оно не выполнится дважды (подробнее). - Незнакомый
kindобрабатывайте какplatform_unknown: новые классы могут появиться без смены версии.