Приложение пишет текст со спецсимволами — один и тот же для всех каналов: *жирный*, _курсив_, [ссылка](https://…). Канал переводит разметку в оформление своей площадки. Чего площадка не умеет, то уходит обычным текстом, без спецсимволов.
Разметка
| Стиль | Как написать | Пример |
|---|---|---|
| жирный | *текст* или **текст** |
*Сегодня занятие в каб. 104* |
| курсив | _текст_ |
_по желанию_ |
| подчёркнутый | __текст__ |
__обязательно__ |
| зачёркнутый | ~текст~ или ~~текст~~ |
~в 15:00~ в 16:00 |
| спойлер | ||текст|| |
||ответ: 42|| |
| моноширинный | `текст` — внутри разметки нет |
`ROBO-2026` |
| блок кода | ```текст``` — можно в несколько строк, внутри разметки нет |
|
| цитата | > текст в начале строки; строки подряд — одна цитата |
> Вопрос родителя |
| ссылка | [текст](https://…); ещё mailto: и tel: |
[расписание](https://school.ru/schedule) |
Стили можно вкладывать: *жирный _и курсив_*.
Правила знаков
- Открывающий знак стоит в начале слова, закрывающий — в конце. Текст между ними не начинается и не кончается пробелом и не переходит на новую строку.
- Поэтому
2*3*4,snake_case,a * b, пункты списка* …и знак без пары остаются как есть. - Адрес в тексте всегда цельный: знаки внутри
https://school.ru/a_b_cне разбираются. - Обратная косая черта перед спецсимволом оставляет его как есть:
\*— звёздочка. Так экранируются*,_,~,`,|, скобки,>и сама косая черта.
Пример запроса
Объявление с жирным, зачёркнутым и ссылкой:
curl
curl -X POST "$GRATIO_URL/v1/instances/$GRATIO_ID/sendMessage" \
-H "Authorization: Bearer $GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"chatId": "+79991234567",
"message": "*Занятие переносится* ~в 15:00~ в 16:00.\nРасписание — [на сайте](https://school.ru/schedule).",
"clientMessageId": "notice-1"
}'
Python
import os
import requests
BASE = f"{os.environ['GRATIO_URL']}/v1/instances/{os.environ['GRATIO_ID']}"
HEADERS = {"Authorization": f"Bearer {os.environ['GRATIO_TOKEN']}"}
url = f"{BASE}/sendMessage"
payload = {
"chatId": "+79991234567",
"message": "*Занятие переносится* ~в 15:00~ в 16:00.\nРасписание — [на сайте](https://school.ru/schedule).",
"clientMessageId": "notice-1",
}
response = requests.post(url, json=payload, headers=HEADERS, timeout=60)
print(response.status_code, response.json())
Node.js
const { GRATIO_URL, GRATIO_ID, GRATIO_TOKEN } = process.env;
const base = `${GRATIO_URL}/v1/instances/${GRATIO_ID}`;
const auth = { Authorization: `Bearer ${GRATIO_TOKEN}` };
const url = `${base}/sendMessage`;
const payload = {
chatId: "+79991234567",
message: "*Занятие переносится* ~в 15:00~ в 16:00.\nРасписание — [на сайте](https://school.ru/schedule).",
clientMessageId: "notice-1",
};
const response = await fetch(url, {
method: "POST",
headers: { ...auth, "Content-Type": "application/json" },
body: JSON.stringify(payload),
});
console.log(response.status, await response.json());
PHP
<?php
$base = getenv('GRATIO_URL') . '/v1/instances/' . getenv('GRATIO_ID');
$auth = 'Authorization: Bearer ' . getenv('GRATIO_TOKEN');
$url = $base . '/sendMessage';
$payload = [
'chatId' => '+79991234567',
'message' => '*Занятие переносится* ~в 15:00~ в 16:00.
Расписание — [на сайте](https://school.ru/schedule).',
'clientMessageId' => 'notice-1',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [$auth, 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$response = json_decode(curl_exec($ch), true);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), PHP_EOL;
print_r($response);
В журнале, уведомлениях и getChatHistory остаётся исходный текст со спецсимволами.
Как показывает каждая площадка
| Стиль | MAX | Telegram | Почта | Чат на сайте | |
|---|---|---|---|---|---|
| жирный | пока со знаками | жирный | жирный | жирный | жирный |
| курсив | пока со знаками | курсив | курсив | курсив | курсив |
| подчёркнутый | пока со знаками | подчёркнутый | текстом | подчёркнутый | подчёркнутый |
| зачёркнутый | пока со знаками | зачёркнутый | зачёркнутый | зачёркнутый | зачёркнутый |
| спойлер | пока со знаками | спойлер | текстом | текстом | текстом |
| моноширинный | пока со знаками | код | код | код | код |
| блок кода | пока со знаками | блок кода | блок кода | блок кода | блок кода |
| цитата | пока со знаками | цитата | цитата | цитата | цитата |
| ссылка | пока со знаками | ссылка | «текст (адрес)» | ссылка | ссылка |
«Текстом» — без спецсимволов: __обязательно__ в WhatsApp дойдёт словом «обязательно». «Со знаками» — как написано, со звёздочками и скобками.
- MAX — разметка включится после проверки на живом номере; пока
formatting: falseв getCapabilities, и спецсимволы доходят как есть. - WhatsApp экранирования не знает: знак, который остался текстом, площадка может прочитать как своё оформление.
- Почта. Письмо уходит с HTML-оформлением; простая часть письма и тема — без спецсимволов.
- Чат на сайте — свои правила ссылок, см. Разметка в окне чата.
Где работает
| Метод | Где разметка |
|---|---|
| sendMessage, editMessage | текст |
| sendFileByUpload, sendFileByUrl | подпись caption |
| sendInteractiveButtons и sendButtons | шапка, текст и подвал |
| sendForm | заголовок и текст формы |
Входящие сообщения разметкой не размечаются: оформление собеседника в текст уведомления пока не переводится.
Чужой текст: formatting none
Параметр formatting: "gratio" — по умолчанию, "none" — текст как есть, без разбора. Другое значение — 400 validation.
Чужой текст — сообщение собеседника из другого канала, отзыв, ввод пользователя — отправляйте с "none". Иначе [Подтвердить](https://…) из такого текста станет ссылкой от имени компании, а случайные звёздочки — жирным:
curl -X POST "$GRATIO_URL/v1/instances/$GRATIO_ID/sendMessage" \
-H "Authorization: Bearer $GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"chatId": "+79991234567",
"message": "Ваш вопрос: «Можно *перенести* на воскресенье?» Передали администратору.",
"formatting": "none"
}'
Вместо "none" можно экранировать спецсимволы косой чертой: \*, \[, \_.
Кнопки оформления в интерфейсе
getCapabilities отвечает formatting: true, если канал переводит разметку в оформление. Показывайте кнопки «жирный», «курсив», «ссылка» в своём интерфейсе только для таких каналов — иначе собеседник увидит звёздочки.
Что дальше
- sendMessage — отправка текста.
- Разметка в окне чата — как разметку показывает чат на сайте.
- Возможности каналов — что умеет каждый канал.
