# Как отправить сообщение через Telegram API с помощью curl

sendMessage в curl: chat_id, text, parse_mode, кнопки, поиск chat_id и ошибки.

https://shiba-bank.com/ru/guides/bot-api-curl

Обновлено 02.10.2026 · 4 мин чтения

Сообщение через Telegram API отправляет метод `sendMessage` Bot API: нужны токен бота, `chat_id` получателя и `text`. Из командной строки это один запрос: `curl "https://api.telegram.org/bot<ТОКЕН>/sendMessage" --data-urlencode "chat_id=123456789" --data-urlencode "text=Привет"`. В ответ придёт JSON с `"ok": true` и отправленным сообщением в поле `result`. Токен выдаёт [@BotFather](https://t.me/botfather) — [как его получить и сберечь](https://shiba-bank.com/ru/guides/bot-token).

В примерах ниже вместо `<ТОКЕН>` стоит заглушка. Подставьте свой токен, но никому его не показывайте. Примеры написаны для оболочек bash и zsh.

## Что нужно для sendMessage

Адрес запроса: `https://api.telegram.org/bot<ТОКЕН>/sendMessage`. Параметры метода:

- `chat_id` — обязательный. Идентификатор чата или имя канала в формате `@channelusername`.
- `text` — обязательный. Текст сообщения, от 1 до 4096 символов после разбора разметки.
- `parse_mode` — необязательный. Режим разметки: `HTML`, `MarkdownV2` или `Markdown`.
- `reply_markup` — необязательный. Кнопки под сообщением или своя клавиатура.
- `reply_parameters` — ответ на конкретное сообщение.
- `disable_notification` — отправить без звука.
- `link_preview_options` — управление превью ссылок.

Метод принимает и GET, и POST. Для текста с пробелами и русскими буквами удобнее `--data-urlencode`: curl сам закодирует значение.

## Как узнать chat_id

Как правило, бот не может начать переписку первым: человек должен сначала написать ему или добавить его в группу. Поэтому порядок такой.

1. Откройте своего бота в Telegram и отправьте ему любое сообщение, например `/start`.
2. Запросите обновления: `curl "https://api.telegram.org/bot<ТОКЕН>/getUpdates"`.
3. В ответе найдите `message`, в нём `chat` и поле `id` — это нужный `chat_id`. Для канала вместо числа можно указать его `@имя`.

`getUpdates` работает, только если у бота не задан webhook — подробно в статье [getUpdates и webhook](https://shiba-bank.com/ru/guides/bot-api-updates). Идентификатор чата — целое число, оно может не помещаться в 32 бита, поэтому в программах храните его в 64-битном типе.

## Примеры запросов

Простое сообщение: `curl -s "https://api.telegram.org/bot<ТОКЕН>/sendMessage" --data-urlencode "chat_id=123456789" --data-urlencode "text=Заказ готов"`

С разметкой HTML: `curl -s "https://api.telegram.org/bot<ТОКЕН>/sendMessage" --data-urlencode "chat_id=123456789" --data-urlencode "parse_mode=HTML" --data-urlencode "text=<b>Заказ</b> готов"`

В режиме HTML символы `<`, `>` и `&` в обычном тексте нужно заменять на `&lt;`, `&gt;` и `&amp;`. В режиме `MarkdownV2` служебные символы экранируют обратной косой чертой.

Сообщение с кнопкой-ссылкой через JSON: `curl -s -X POST "https://api.telegram.org/bot<ТОКЕН>/sendMessage" -H "Content-Type: application/json" -d '{"chat_id": 123456789, "text": "Открыть сайт", "reply_markup": {"inline_keyboard": [ [{"text": "Перейти", "url": "https://example.com"}] ]}}'`

JSON-тело поддерживается для всех методов, кроме загрузки файлов. У кнопки под сообщением есть `text` и либо `url`, либо `callback_data` (от 1 до 64 байт): по нажатию на вторую бот получает событие.

## Ошибки

Ответ с ошибкой содержит `"ok": false`, `error_code` и `description`. Чаще всего встречаются такие:

- **401 Unauthorized.** Обычно это значит, что токен неверный или заменён. Проверьте его методом `getMe` — [как это сделать](https://shiba-bank.com/ru/guides/bot-token).
- **400 Bad Request: chat not found.** Такого чата нет или бот его не знает: пользователь ещё ничего не писал боту, либо в `chat_id` опечатка.
- **403 Forbidden: bot was blocked by the user.** Человек заблокировал бота и сообщения ему не доставить.
- **400 про разметку.** Telegram не смог разобрать текст: в HTML не закрыт тег или не экранированы `<`, `>`, `&`.
- **429 Too Many Requests.** Слишком частые запросы. В ответе есть поле `retry_after` — через сколько секунд повторить.

Лимиты из документации Telegram: в один чат не стоит отправлять больше одного сообщения в секунду, в группу бот может отправить не больше 20 сообщений в минуту, а массовая рассылка ограничена примерно 30 сообщениями в секунду.

> **Совет:** Не вписывайте токен прямо в скрипты, которые попадают в репозиторий: храните его в переменной окружения или в файле настроек вне репозитория.

## Что дальше

Чтобы бот отвечал на сообщения, а не только отправлял их, подключите приём событий: [getUpdates и webhook](https://shiba-bank.com/ru/guides/bot-api-updates). Если вам нужно отправлять пользователям звёзды или Premium из своей программы, у бота Shiba Bank есть API — смотрите [документацию](https://shiba-bank.com/api/docs).

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

### Как отправить сообщение в Telegram через API?
Выполните запрос к методу `sendMessage` с токеном бота, `chat_id` и `text`: `curl "https://api.telegram.org/bot<ТОКЕН>/sendMessage" --data-urlencode "chat_id=<ID>" --data-urlencode "text=Привет"`.

### Как узнать chat_id для sendMessage?
Напишите боту любое сообщение и вызовите `getUpdates`: нужное число лежит в `message.chat.id`. Для публичного канала можно использовать `@имя` канала.

### Что значит ошибка chat not found в Telegram?
Бот не знает такой чат: либо в `chat_id` ошибка, либо человек ещё не писал боту. Бот не может начать диалог первым.

### Что значит bot was blocked by the user?
Ошибка 403: пользователь заблокировал бота, поэтому написать ему нельзя.

### Можно ли отправить сообщение от имени своего аккаунта, а не бота?
Через токен — нет: запросы с токеном бота выполняет сам бот, и сообщения уходят от его имени.

### Как отправить сообщение в канал через бота?
Добавьте бота в канал администратором, а в `chat_id` укажите `@имя_канала` публичного канала.
