Лимиты Telegram Bot API: сообщения в секунду, ошибка 429 и размеры файлов
Главные лимиты 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
- Ставьте сообщения в очередь, а не отправляйте всё разом из параллельных задач.
- Держите общий темп с запасом — 20–25 сообщений в секунду вместо предельных 30.
- В один чат пишите не чаще раза в секунду, в группу — не чаще раза в 3 секунды.
- Получив 429, приостановите всю очередь на
retry_afterсекунд, а не только текущий чат. - На
403 Forbidden: bot was blocked by the userудаляйте пользователя из базы рассылки — повторять бессмысленно. - Большие рассылки растягивайте во времени: 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 держит темп.
Платные рассылки: allow_paid_broadcast
Если 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 в sendMessage | 1–4096 символов после разбора разметки |
caption у фото, видео и документов | 0–1024 символа |
callback_data inline-кнопки | 1–64 байта |
Текст уведомления в answerCallbackQuery | 0–200 символов |
Альбом (sendMediaGroup) | 2–10 элементов |
| Результаты inline-запроса | не больше 50 за один ответ |
Команды бота (setMyCommands) | до 100 команд |
Rich-сообщение (sendRichMessage) | до 32 768 символов, 500 блоков, 50 медиа, 20 столбцов в таблице |
Не путайте символы и байты: callback_data считается в байтах UTF-8, поэтому кириллицы туда влезет вдвое меньше, чем латиницы. Длинный текст режьте на части по границам абзацев — так не разорвутся HTML-теги и сущности MarkdownV2.
Лимиты на получение обновлений
- Входящие апдейты хранятся на серверах Telegram не дольше 24 часов.
getUpdatesотдаёт за раз от 1 до 100 апдейтов (параметрlimit, по умолчанию 100). Подтверждайте полученные, передаваяoffset= последнийupdate_id+ 1.- Вебхук:
max_connections— от 1 до 100 одновременных соединений (по умолчанию 40), на локальном сервере — до 100 000. getUpdatesи вебхук взаимоисключающие: пока вебхук установлен, long polling не работает.
Как настроить вебхук и не потерять апдейты, рассказано в гайде вебхук для Telegram-бота.
Почему бот получает 429, хотя отправляет немного
- Всё уходит в один чат. Для отдельного чата и группы лимиты жёстче общих: если слать 3–4 сообщения в секунду в один чат, 429 рано или поздно придёт, хотя до 30 в секунду далеко.
- Токен делят несколько процессов. Воркеры, cron-задачи, второй экземпляр бота на соседнем сервере — лимит считается для бота целиком, а не для каждого процесса.
- Повторы без паузы. Код ловит ошибку и сразу шлёт запрос заново, не дожидаясь
retry_after. Используйте обёртку вродеcallвыше. - Тесты в тестовой среде. Там лимиты не выше боевых и иногда строже, так что «в проде было нормально» ничего не гарантирует.
- Всплеск после перезапуска. Бот разом отвечает на накопившиеся апдейты. Обрабатывайте их с тем же ограничением темпа, что и рассылку, или сбросьте старые апдейты параметром
drop_pending_updatesвsetWebhookилиdeleteWebhook.
Проверьте на практике
Откройте 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.