Skip to main content

Ошибки и rate limits

Формат ошибки

Все ошибки возвращаются с ok: false:

{
"ok": false,
"error_code": 400,
"description": "Bad Request: chat not found"
}

Коды ошибок

КодЧто значитЧто делать
400 Bad RequestНеверный формат параметровПроверьте имена полей, типы
401 UnauthorizedНевалидный токенПроверьте токен, выпустите новый
403 ForbiddenБот заблокирован юзером, или нет правПерестаньте слать этому юзеру
404 Not FoundНе найден метод/чат/сообщениеПроверьте ID
409 ConflictУже выполнено / занятоНапример, webhook уже установлен
413 Request Entity Too LargeФайл слишком большойСм. лимиты ниже
429 Too Many RequestsRate limitСм. retry_after
500 Internal Server ErrorНаша проблемаПовторить через секунду

Rate limits

На один токен бота

  • 30 запросов в секунду на основной API
  • 30 одновременных соединений

При превышении — HTTP 429 + retry_after секунд:

{
"ok": false,
"error_code": 429,
"description": "Too Many Requests: retry after 5",
"parameters": {"retry_after": 5}
}

На отправку сообщений

Дополнительные мягкие лимиты:

  • 30 сообщений в секунду в разные чаты
  • 20 сообщений в минуту в один и тот же чат
  • 1 сообщение в секунду в один и тот же чат

Превышение → 429 на конкретный чат, остальные продолжают работать.

На webhook

  • 40 одновременных соединений на ваш webhook (можно настроить через max_connections в setWebhook)
  • 60 секунд таймаут на ответ
  • Retry с экспоненциальным backoff при 5xx и таймаутах

Лимиты размеров

ЧтоЛимит
Сообщение (текст)4096 символов
Caption медиа1024 символа
Callback data64 байта
Сторона JSON10 МБ
Размер фото10 МБ
Размер видео/документа50 МБ
Webhook URL256 символов
getMe имя64 символа
getMe description512 символов

Best practices

1. Бэкофф при 429

import time

def send_with_retry(method, params):
for attempt in range(3):
r = api.call(method, params)
if r.get('ok'):
return r
if r.get('error_code') == 429:
wait = r['parameters']['retry_after']
time.sleep(wait)
continue
return r
raise Exception('failed after 3 retries')

2. Не блокировать на сетевых вызовах

Используйте async (aiogram, grammy, async/await) или очередь сообщений.

3. Отслеживать ошибки

Подпишитесь на 403 — это юзер заблокировал бота. Удалите его из вашей рассылки.

4. Webhook idempotency

Сохраняйте update_id обработанных событий — иногда мы доставляем дубли.