Telegram Rich Messages для ботов: актуальная инструкция по форматированию

Telegram Bot API 10.1 Rich Messages Обновлено: 17 июня 2026

Это шпаргалка для разработчиков и AI-агентов, которые генерируют ответы для Telegram-ботов. Начиная с Bot API 10.1, ботам доступны не только старые parse_mode=HTML и MarkdownV2, но и новый формат sendRichMessage с заголовками, таблицами, чек-листами, формулами, сносками, медиа-блоками и длинными сообщениями.

Быстрый старт

Для Rich Messages используется отдельный метод sendRichMessage. Внутри rich_message нужно передать ровно одно поле: markdown или html. Rich Markdown совместим с GitHub Flavored Markdown там, где это возможно, и может содержать поддерживаемые HTML-теги.

Rich Markdown

{
  "chat_id": 123456789,
  "rich_message": {
    "markdown": "# Отчет\n\n| Метрика | Значение |\n|:--|--:|\n| Ошибки | **0** |\n\n- [x] Проверка завершена\n- [ ] Отправить пользователю\n\n$$E = mc^2$$"
  }
}

Rich HTML

{
  "chat_id": 123456789,
  "rich_message": {
    "html": "<h1>Отчет</h1><p>Статус: <b>готово</b></p><details><summary>Логи</summary><pre>OK</pre></details>"
  }
}

Лимиты Rich Messages

Ограничение Значение Практический смысл
Размер текста 32768 UTF-8 символов Можно отправлять большие отчеты одним сообщением.
Количество блоков до 500 Считаются вложенные блоки, элементы списков, строки таблиц, цитаты и details.
Вложенность до 16 уровней Поддерживаются вложенные цитаты, списки и форматирование.
Медиа до 50 вложений Фото, видео и аудио можно вставлять как отдельные rich-блоки.
Таблица до 20 колонок Для сравнений и метрик больше не нужен псевдотабличный <pre>.
Длинное сообщение в клиенте кнопка Show More примерно после первых 8000 символов Пользователь видит начало, а остальное раскрывает по кнопке.

Rich Messages и старый parse_mode

Возможность sendMessage + parse_mode sendRichMessage
Заголовки h1-h6 Нет, обычно имитировались жирным текстом. Да: # Heading или <h1> - <h6>.
Таблицы Нет, только моноширинные псевдотаблицы. Да: Markdown-таблицы или <table>.
Сноски и ссылки внутри сообщения Нет. Да: [^id], <tg-reference>, anchors.
Формулы Нет. Да: $x$, $$x$$, <tg-math>, <tg-math-block>.
Сворачиваемые секции Нет. Да: <details><summary>...</summary>...</details>.
Потоковая генерация Через редактирование сообщения вручную. Да: sendRichMessageDraft, затем финальный sendRichMessage.

Inline-форматирование текста

Эти элементы используются внутри абзацев, списков, цитат и ячеек таблиц. В Rich Markdown можно смешивать Markdown и поддерживаемые HTML-теги, но для стабильности лучше выбрать один основной стиль на сообщение.

Элемент Rich Markdown Rich HTML Примечание
Жирный **текст** или __текст__ <b>текст</b>, <strong>текст</strong> В Rich Markdown __ означает жирный, не underline.
Курсив *текст* или _текст_ <i>текст</i>, <em>текст</em> Можно вкладывать в жирный и другие inline-элементы.
Подчеркивание <u>текст</u> <u>текст</u>, <ins>текст</ins> Отдельного Markdown-синтаксиса нет, используйте HTML.
Зачеркивание ~~текст~~ <s>текст</s>, <strike>текст</strike>, <del>текст</del> Работает как обычный inline-элемент.
Спойлер ||секрет|| <tg-spoiler>секрет</tg-spoiler> На скриншоте showcase спойлер можно комбинировать с курсивом.
Маркер / выделение ==текст== <mark>текст</mark> В showcase отображается как подсвеченный фрагмент.
Инлайн-код `код` <code>код</code> Для блока кода используйте отдельный preformatted-блок.
Подстрочный индекс <sub>2</sub> <sub>2</sub> Например, H<sub>2</sub>O.
Надстрочный индекс <sup>2</sup> <sup>2</sup> Например, x<sup>2</sup>.
Инлайн-ссылка [текст](https://example.com) <a href="https://example.com">текст</a> Telegram показывает предупреждение перед открытием inline-ссылки.
Email [Email](mailto:user@example.com) <a href="mailto:user@example.com">Email</a> Также email автоматически распознается без разметки.
Телефон [Phone](tel:+123456789) <a href="tel:+123456789">Phone</a> Также телефон автоматически распознается без разметки.
Упоминание пользователя по ID [User](tg://user?id=123456789) <a href="tg://user?id=123456789">User</a> Нужно знать Telegram user ID.
Custom emoji ![🎉](tg://emoji?id=5368324170671202286) <tg-emoji emoji-id="5368324170671202286">🎉</tg-emoji> Альтернативный emoji нужен для fallback-отображения.
Дата и время ![3:00](tg://time?unix=1735689600&format=T) <tg-time unix="1735689600" format="T">3:00</tg-time> Формат локализуется клиентом пользователя.
Инлайн-математика $E = mc^2$ <tg-math>E = mc^2</tg-math> Источник формулы трактуется как raw LaTeX.
Авто-детектируемые сущности #tag $USD @user /start https://t.me user@example.com +123456789 То же Можно отключить через skip_entity_detection: true.
Якорь внутри сообщения <a name="top"></a> и <a href="#top">к началу</a> <a name="top"></a> и <a href="#top">к началу</a> Пустой <a name="..."></a> на отдельной строке создает anchor.
Сноска / reference Текст[^id] и [^id]: пояснение <a href="#note">1</a> и <tg-reference name="note">пояснение</tg-reference> В showcase сноски подтверждены в разделе Advanced.

Блочные элементы

Блоки формируют структуру сообщения: заголовки, абзацы, таблицы, цитаты, списки, медиа, карты, сворачиваемые секции и формулы.

Блок Rich Markdown Rich HTML Когда использовать
Заголовки # - ###### <h1> - <h6> Структура отчета, wiki-разделы, длинные ответы.
Абзац Обычный текст с пустой строкой между абзацами. <p>Текст</p> Основной текст сообщения.
Блок кода ```python ... ``` <pre><code class="language-python">...</code></pre> Код, логи, JSON, SQL. Язык задается только через вложенный pre/code.
Разделитель --- <hr/> Разделение крупных блоков ответа.
Footer Используйте HTML. <footer>Footer text</footer> Автор, дата, служебная подпись.
Маркированный список - item, * item, + item <ul><li>item</li></ul> Списки фактов и коротких пунктов.
Нумерованный список 1. item <ol><li>item</li></ol> Пошаговые инструкции. В HTML доступны start, type, reversed, value.
Чек-лист - [ ] задача, - [x] готово <li><input type="checkbox" checked>Готово</li> Планы, таски, чек-листы, статус выполнения.
Цитата > цитата <blockquote>Цитата<cite>Автор</cite></blockquote> Цитирование пользователя, документов, источников. Поддерживает вложенные блоки.
Pull quote Используйте HTML. <aside>Важная мысль<cite>Автор</cite></aside> Короткая вынесенная цитата по центру, как в разделе Advanced showcase.
Details Используйте HTML внутри Markdown. <details><summary>Заголовок</summary>Контент</details> Длинные логи, дополнительные детали, скрытая диагностика. Атрибут open раскрывает блок по умолчанию.
Таблица | A | B | <table><tr><th>A</th></tr></table> Метрики, сравнения, финансовые и технические данные. В ячейках поддерживается только inline-форматирование.
Блочная формула $$E = mc^2$$ или ```math ... ``` <tg-math-block>E = mc^2</tg-math-block> Математика, физика, статистика, ML-формулы.
Фото ![](https://example.com/photo.jpg "Caption") <img src="https://example.com/photo.jpg"/> Изображение отдельным rich-блоком. Разрешены только HTTP/HTTPS URL.
Видео / animation ![](https://example.com/video.mp4 "Caption") <video src="https://example.com/video.mp4"></video> Видео и GIF-анимации отдельными блоками.
Аудио / voice note ![](https://example.com/audio.mp3 "Caption") <audio src="https://example.com/audio.mp3"></audio> Музыка, аудио, voice note. Тип определяется MIME type и URL.
Figure + caption Title в media-синтаксисе становится caption. <figure><img src="..." /><figcaption>Caption<cite>Credit</cite></figcaption></figure> Медиа с подписью и авторством. Для spoiler preview используйте атрибут tg-spoiler.
Collage <tg-collage>![](photo.jpg)![](video.mp4)</tg-collage> <tg-collage><img src="..."/><video src="..."></video></tg-collage> Группа изображений/видео в сетке, как в Media showcase.
Slideshow <tg-slideshow>![](photo.jpg)![](video.mp4)</tg-slideshow> <tg-slideshow><img src="..."/><video src="..."></video></tg-slideshow> Карусель медиа со стрелками навигации.
Карта Используйте HTML. <tg-map lat="41.9" long="12.5" zoom="14"/> Геоточки и карты. Zoom: 13-20.
Thinking Используйте HTML. <tg-thinking>Анализирую...</tg-thinking> Только для sendRichMessageDraft. В финальных сообщениях не приходит.

Дата и время: форматы tg-time

tg-time хранит Unix timestamp и показывает дату/время в локали пользователя. Поле format принимает строку по шаблону r|w?[dD]?[tT]?.

Символ Значение Пример
r Относительное время. Нельзя комбинировать с другими символами. format="r" → «1 год назад»
w День недели на языке пользователя. format="wD"
d Короткая дата. 17.03.22
D Длинная дата. March 17, 2022
t Короткое время. 22:45
T Длинное время. 22:45:00

Все поддерживаемые HTML-конструкции в одном месте

Это справочный блок для копирования в документацию или prompt context. Он намеренно показывает именно теги Telegram Rich HTML, а не HTML для веб-страницы.

<a name="chapter-0"></a>
<b>bold</b>, <strong>bold</strong>
<i>italic</i>, <em>italic</em>
<u>underline</u>, <ins>underline</ins>
<s>strike</s>, <strike>strike</strike>, <del>strike</del>
<code>inline code</code>
<mark>marked</mark>
<sub>subscript</sub>
<sup>superscript</sup>
<tg-spoiler>spoiler</tg-spoiler>
<a href="https://example.com">link</a>
<a href="mailto:user@example.com">email</a>
<a href="tel:+123456789">phone</a>
<a href="tg://user?id=123456789">user</a>
<a href="#chapter-1">in-document link</a>
<tg-reference name="note-1">Referenced text</tg-reference>
<tg-emoji emoji-id="5368324170671202286">🎉</tg-emoji>
<img src="tg://emoji?id=5368324170671202286" alt="🎉"/>
<tg-time unix="1735689600" format="wDT">date</tg-time>
<tg-math>x^2 + y^2</tg-math>

<h1>Heading 1</h1>
<h2>Heading 2</h2>
<h3>Heading 3</h3>
<h4>Heading 4</h4>
<h5>Heading 5</h5>
<h6>Heading 6</h6>
<p>Paragraph</p>
<pre>preformatted text</pre>
<pre><code class="language-python">print("Hello")</code></pre>
<footer>Footer text</footer>
<hr/>
<ul><li>unordered item</li></ul>
<ol start="3" type="a" reversed><li value="7">ordered item</li></ol>
<ul><li><input type="checkbox" checked>done</li><li><input type="checkbox">todo</li></ul>
<blockquote>Quote<cite>Author</cite></blockquote>
<aside>Pull quote<cite>Author</cite></aside>
<details><summary>Title</summary>Content</details>
<details open><summary>Title</summary>Content</details>
<tg-math-block>E = mc^2</tg-math-block>

<img src="https://example.com/photo.jpg"/>
<video src="https://example.com/video.mp4"></video>
<audio src="https://example.com/audio.mp3"></audio>
<figure><img src="https://example.com/photo.jpg" tg-spoiler/><figcaption>Caption<cite>Credit</cite></figcaption></figure>
<tg-map lat="41.9" long="12.5" zoom="14"/>
<tg-collage><img src="https://example.com/1.jpg"/><video src="https://example.com/2.mp4"></video></tg-collage>
<tg-slideshow><img src="https://example.com/1.jpg"/><video src="https://example.com/2.mp4"></video></tg-slideshow>
<tg-thinking>Thinking...</tg-thinking>

Готовые примеры для бота

# Проверка проекта

## Итог
Статус: **готово**. Критических ошибок не найдено.

| Проверка | Результат | Комментарий |
|:--|:--:|:--|
| Линтер | **OK** | 0 ошибок |
| Тесты | **OK** | 128 passed |
| Сборка | **OK** | 41 сек |

## Следующие действия
- [x] Запустить тесты
- [x] Проверить сборку
- [ ] Отправить отчет владельцу

<details>
<summary>Технические детали</summary>

```text
npm test
128 passed
```

</details>

<a name="top"></a>

# Обзор релиза

[К выводам](#summary)

## Факты
Telegram Bot API 10.1 добавил Rich Messages[^bot-api].
Теперь бот может отправлять таблицы, заголовки, сноски и формулы.

> Rich Messages подходят для длинных AI-отчетов.
>
> - Можно вкладывать списки.
> - Можно использовать `inline code`.

<a name="summary"></a>
## Вывод
Для новых ботов используйте `sendRichMessage`, если ответ требует структуры.

[^bot-api]: Официальная документация Telegram Bot API 10.1.

[К началу](#top)

<h1>Медиа-отчет</h1>

<figure>
  <img src="https://example.com/photo.jpg"/>
  <figcaption>Главное изображение<cite>Analytics Bot</cite></figcaption>
</figure>

<tg-collage>
  <img src="https://example.com/1.jpg"/>
  <img src="https://example.com/2.jpg"/>
  <video src="https://example.com/3.mp4"></video>
  <figcaption>Коллаж результатов</figcaption>
</tg-collage>

<tg-slideshow>
  <img src="https://example.com/slide-1.jpg"/>
  <img src="https://example.com/slide-2.jpg"/>
</tg-slideshow>

<tg-map lat="41.9" long="12.5" zoom="14"/>

Правила генерации для AI-агентов

Делать

  • Использовать #, ##, ### для длинных ответов.
  • Выводить сравнения и метрики таблицами.
  • Прятать длинные логи, сырой JSON и диагностику в <details>.
  • Использовать чек-листы для планов и задач.
  • Использовать $...$ и $$...$$ для формул.
  • Использовать сноски для источников и пояснений.
  • При стриминге сначала вызывать sendRichMessageDraft, а после завершения финальный sendRichMessage.

Не делать

  • Не утверждать, что Telegram не поддерживает таблицы или заголовки для ботов.
  • Не путать Rich Markdown с legacy Markdown и MarkdownV2.
  • Не использовать __underline__ для подчеркивания в Rich Markdown: это жирный текст.
  • Не вставлять медиа inline внутри абзаца: медиа разрешены только отдельными блоками.
  • Не класть блочные элементы внутрь ячеек таблицы: в ячейках только inline-форматирование.
  • Не использовать неописанные HTML-теги: Telegram поддерживает только перечисленный набор.

Готовая инструкция для AI-агента

Этот блок можно вставлять в системный prompt, tool description или developer-инструкцию агента, который должен формировать rich-ответы для Telegram.

Короткая проверка перед отправкой

  • 1 Передан ровно один вариант: rich_message.markdown или rich_message.html.
  • 2 Теги входят в официальный список Rich HTML, лишних HTML-тегов нет.
  • 3 Медиа вынесены отдельными блоками и используют HTTP/HTTPS URL.
  • 4 Таблицы не превышают 20 колонок, а внутри ячеек нет блочных элементов.
  • 5 Длинные технические детали спрятаны в <details>, а короткое резюме стоит сверху.