Telegram Bot API
🌐 Русский

Лимиты Telegram Bot API: сообщения в секунду, ошибка 429 и размеры файлов

· 8 мин чтения

Главные лимиты Telegram Bot API такие: не больше одного сообщения в секунду в один чат, до 20 сообщений в минуту в группу и около 30 сообщений в секунду при массовой рассылке. За превышение бот получает ошибку 429 Too Many Requests с полем retry_after. Для файлов действуют свои потолки: загрузка до 50 МБ, скачивание через getFile — до 20 МБ. Ниже собраны все ограничения с цифрами и код, который корректно переживает rate limit.

Лимит сообщений: сколько может отправить бот

Точный алгоритм flood control Telegram не публикует, но в официальном Bots FAQ есть ориентиры:

СценарийЛимитКомментарий
Один чат≈ 1 сообщение в секундуКороткие всплески допустимы, но затем начнутся ошибки 429
Группа20 сообщений в минутуВ среднем одно сообщение в 3 секунды
Массовая рассылка≈ 30 сообщений в секундуСуммарно по всем чатам бота
Платная рассылкадо 1000 сообщений в секунду0,1 Telegram Stars за каждое сообщение сверх бесплатных 30 в секунду

Лимиты относятся к сообщениям любого типа: фото, документ или опрос — тоже сообщение. В тестовой среде Telegram лимиты не повышены и временами даже строже, поэтому не зашивайте цифры в код намертво — надёжнее обрабатывать 429 и повторять запрос.

Ошибка 429 Too Many Requests и retry_after

Когда бот превышает лимит, Telegram отвечает так:

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

Поле parameters.retry_after — число секунд, через которое запрос можно повторить. Правильная реакция — выдержать паузу и отправить тот же запрос ещё раз, а не повторять его сразу в цикле. Обёртка на Python:

import time
import requests

TOKEN = "123456789:AAEexampleTokenReplaceWithYours"
API_URL = f"https://api.telegram.org/bot{TOKEN}"


def call(method, max_retries=5, **params):
    """Вызывает метод Bot API и сам ждёт при ошибке 429."""
    for _ in range(max_retries):
        data = requests.post(f"{API_URL}/{method}", json=params, timeout=30).json()
        if data["ok"]:
            return data["result"]
        if data["error_code"] == 429:
            time.sleep(data.get("parameters", {}).get("retry_after", 1) + 1)
            continue
        raise RuntimeError(f"{data['error_code']}: {data['description']}")
    raise RuntimeError(f"{method}: превышено число повторов")

То же на JavaScript (Node.js 18+):

const API_URL = `https://api.telegram.org/bot${process.env.BOT_TOKEN}`;
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

async function call(method, params = {}, maxRetries = 5) {
  for (let i = 0; i < maxRetries; i++) {
    const res = await fetch(`${API_URL}/${method}`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(params),
    });
    const data = await res.json();
    if (data.ok) return data.result;
    if (data.error_code !== 429) throw new Error(`${data.error_code}: ${data.description}`);
    await sleep(((data.parameters?.retry_after ?? 1) + 1) * 1000);
  }
  throw new Error(`${method}: превышено число повторов`);
}

Во многих библиотеках это уже решено: в python-telegram-bot есть AIORateLimiter, в grammY — плагин auto-retry. Проверьте документацию своей библиотеки, прежде чем писать собственный механизм.

Как сделать рассылку и не упереться в rate limit

  1. Ставьте сообщения в очередь, а не отправляйте всё разом из параллельных задач.
  2. Держите общий темп с запасом — 20–25 сообщений в секунду вместо предельных 30.
  3. В один чат пишите не чаще раза в секунду, в группу — не чаще раза в 3 секунды.
  4. Получив 429, приостановите всю очередь на retry_after секунд, а не только текущий чат.
  5. На 403 Forbidden: bot was blocked by the user удаляйте пользователя из базы рассылки — повторять бессмысленно.
  6. Большие рассылки растягивайте во времени: Bots FAQ советует распределять их на 8–12 часов.
def broadcast(chat_ids, text, per_second=25):
    blocked = []
    for chat_id in chat_ids:
        try:
            call("sendMessage", chat_id=chat_id, text=text)
        except RuntimeError as err:
            if str(err).startswith("403"):
                blocked.append(chat_id)  # бот заблокирован — исключить из базы
        time.sleep(1 / per_second)
    return blocked

Функция call из примера выше сама переждёт 429 (и вместе с ней остановится весь цикл), а time.sleep держит темп.

Если 30 сообщений в секунду мало, включите Paid Broadcasts в @BotFather и передавайте в методах отправки параметр allow_paid_broadcast. Лимит вырастет до 1000 сообщений в секунду, а каждое сообщение сверх бесплатных 30 в секунду обойдётся в 0,1 Telegram Stars с баланса бота. Списываются Stars только за успешно разосланные сообщения.

{"chat_id": 123456789, "text": "Распродажа началась!", "allow_paid_broadcast": true}

Порог входа высокий: по данным Bots FAQ, для включения функции у бота должно быть не меньше 100 000 Stars на балансе и не меньше 100 000 активных пользователей в месяц. Небольшим ботам проще растянуть рассылку во времени.

Лимиты Telegram Bot API на размер файлов

ОперацияЛимит
Загрузка через multipart/form-dataфото — до 10 МБ, остальные файлы — до 50 МБ
Отправка по HTTP-ссылке (Telegram скачает файл сам)фото — до 5 МБ, остальное — до 20 МБ
Повторная отправка по file_idбез ограничений по размеру
Скачивание через getFileдо 20 МБ
Локальный Bot API серверзагрузка до 2000 МБ, скачивание без ограничений

Ещё несколько нюансов из документации. У фото сумма ширины и высоты не должна превышать 10 000, а соотношение сторон — 20. sendDocument по URL сейчас работает только для файлов .PDF и .ZIP. Ссылка на скачивание вида https://api.telegram.org/file/bot<token>/<file_path> из ответа getFile действует не меньше часа, потом запросите новую. Если бот должен принимать от пользователей файлы больше 20 МБ, понадобится локальный Bot API сервер.

Лимиты на текст, кнопки и альбомы

ЧтоЛимит
text в sendMessage1–4096 символов после разбора разметки
caption у фото, видео и документов0–1024 символа
callback_data inline-кнопки1–64 байта
Текст уведомления в answerCallbackQuery0–200 символов
Альбом (sendMediaGroup)2–10 элементов
Результаты inline-запросане больше 50 за один ответ
Команды бота (setMyCommands)до 100 команд
Rich-сообщение (sendRichMessage)до 32 768 символов, 500 блоков, 50 медиа, 20 столбцов в таблице

Не путайте символы и байты: callback_data считается в байтах UTF-8, поэтому кириллицы туда влезет вдвое меньше, чем латиницы. Длинный текст режьте на части по границам абзацев — так не разорвутся HTML-теги и сущности MarkdownV2.

Лимиты на получение обновлений

Как настроить вебхук и не потерять апдейты, рассказано в гайде вебхук для Telegram-бота.

Почему бот получает 429, хотя отправляет немного

Проверьте на практике

Откройте getUpdates в Bot API Tester, чтобы посмотреть, сколько апдейтов ждёт бота, или отправьте пробное сообщение через sendMessage — в ответе видно поле ok, а при ошибке и retry_after. Форматирование и кнопки разобраны в гайде как отправить сообщение через бота, а новые rich-сообщения и их ограничения — в обзоре что нового в Bot API 10.3.

Частые вопросы

Сколько сообщений в секунду может отправлять Telegram-бот?

Ориентиры из Bots FAQ: около 30 сообщений в секунду при массовой рассылке, не больше 1 сообщения в секунду в один чат и до 20 сообщений в минуту в группу. С allow_paid_broadcast — до 1000 сообщений в секунду за Telegram Stars.

Что значит ошибка 429 Too Many Requests в Telegram?

Бот превысил лимит частоты запросов. В ответе есть parameters.retry_after — столько секунд нужно подождать, прежде чем повторить запрос.

Какой максимальный размер файла для Telegram-бота?

При загрузке через multipart/form-data — 50 МБ (фото — 10 МБ), при отправке по URL — 5 МБ для фото и 20 МБ для остальных файлов. Повторная отправка по file_id не ограничена, а локальный Bot API сервер принимает файлы до 2000 МБ.

Почему бот не может скачать файл больше 20 МБ?

Метод getFile облачного Bot API работает только с файлами до 20 МБ. Для файлов крупнее нужен локальный Bot API сервер — на нём ограничения на скачивание нет.

Какая максимальная длина сообщения у бота?

4096 символов для text и 1024 символа для подписи к медиа, считая после разбора разметки. Более длинный текст придётся разбить на несколько сообщений.

Сколько Telegram хранит апдейты для бота?

Не дольше 24 часов. Если бот не забрал их через getUpdates или вебхук, они удаляются.

Как создать бота в Телеграм: от @BotFather до первого сообщения

Как создать бота в Телеграм: регистрация в @BotFather, токен, проверка через getMe, первое сообщение на curl и Python, команды и описание бота.

Что нового в Telegram Bot API 10.0–10.3: rich-сообщения, эфемерные сообщения и гостевой режим

Что нового в Telegram Bot API 10.0–10.3: rich-сообщения, эфемерные сообщения, гостевой режим, заявки на вступление — с примерами и чек-листом миграции.

Как отправить сообщение через бота Telegram: sendMessage, разметка и кнопки

Как отправить сообщение через бота Telegram: sendMessage на curl, Python и JavaScript, parse_mode HTML и MarkdownV2, кнопки и ошибки 400, 403, 429.

Токен бота Telegram: как получить, где найти, как проверить и отозвать

Как получить токен бота Телеграм в @BotFather, где взять токен уже созданного бота, как проверить его через getMe и что делать, если токен утёк.

Вебхук для Telegram-бота: настройка setWebhook, проверка и удаление

Как настроить вебхук Телеграм-бота: требования к HTTPS и портам, setWebhook с secret_token, проверка через getWebhookInfo, удаление и частые ошибки.

Как узнать chat id в Telegram: пользователь, группа, канал и тема форума

Как узнать chat id в Telegram через getUpdates: личный чат, группа, супергруппа, канал и тема форума. Форматы id с -100 и что делать с пустым result.

Тестирование Telegram Mini App: от браузера до отладки на телефоне

Тестирование Telegram Mini App по шагам: mock-режим в браузере, HTTPS-туннель для localhost, тестовая среда, DevTools на телефоне и проверка initData.