Рассылки
Настройка триггерных дожимов по статусам кампании и создание и запуск ручных массовых рассылок. Концепции — в руководстве по рассылкам; эта страница — справочник по API.
Все эндпоинты рассылок требуют активной оплаченной сессии (иначе error: unpaid).
Функцию рассылки на тарифе проверяют только действия, создающие отправки:
add, edit, start ручных рассылок и включение триггерного блока (on=1) —
без неё они вернут error: broadcasts. Просмотр и сворачивание уже существующих
рассылок (list, quota, get, pause, resume, reset, cancel, del, test)
функции не требуют, поэтому при понижении тарифа существующие рассылки можно
доглядеть и аккуратно завершить.
Все ответы — HTTP 200 с application/json; успех или ошибка указаны в теле. Время —
unix-секунды (0 = не задано).
Получить блоки кампании
GET /api/camp/broadcast.json
Блоки сообщений по кампании и статусу. Пять статусов, по одному блоку:
0 wait · 1 hold · 2 approve · 3 cancel · 4 trash. Возвращает все пять
блоков; статусы без блока приходят как нулевой блок (on: 0).
| Параметр | Обязательный | Описание |
|---|---|---|
id | ✓ | ID кампании |
{
"status": "ok",
"data": [
{ "status": 0, "on": 1, "delay": 1800,
"text": "Добро пожаловать! Жмите кнопку ниже 👇",
"media": "", "media_type": 0,
"button": "Открыть", "link": "https://example.com/l?click={click}" },
{ "status": 1, "on": 0, "delay": 0, "text": "", "media": "", "media_type": 0, "button": "", "link": "" },
{ "status": 2, "on": 0, "delay": 0, "text": "", "media": "", "media_type": 0, "button": "", "link": "" },
{ "status": 3, "on": 0, "delay": 0, "text": "", "media": "", "media_type": 0, "button": "", "link": "" },
{ "status": 4, "on": 0, "delay": 0, "text": "", "media": "", "media_type": 0, "button": "", "link": "" }
]
}delay — в секундах после попадания лида в статус. media_type: 0 нет,
1 фото, 2 видео.
| Ошибка | Значение |
|---|---|
func | id не задан (0) |
access | Кампания не ваша |
db | Ошибка базы данных |
Сохранить один блок
POST /api/camp/broadcast.json
Создаёт или обновляет блок одного статуса.
| Параметр | Обязательный | Описание |
|---|---|---|
id | ✓ | ID кампании |
status | ✓ | Статус лида 0–4 |
on | 1 включить, 0 выключить | |
delay | Секунды после попадания в статус до отправки | |
text | Текст сообщения (Telegram Markdown) | |
media | Ссылка на медиа из media/upload; "" если нет. Проверяется на принадлежность вам | |
media_type | 1 фото, 2 видео (из ответа загрузки) | |
button | Подпись кнопки | |
link | URL кнопки (можно с макросами); проверяется на корректность |
{ "status": "ok" }Включение блока (on=1) требует функции рассылок → иначе error: broadcasts.
Выключение или правка уже выключенного блока разрешены всегда (чтобы при понижении
тарифа блок можно было выключить). Смена медиа сбрасывает кэшированный file_id.
| Ошибка | Значение |
|---|---|
func | id/status неверны, либо ссылка некорректна, либо медиа не ваше |
broadcasts | Включение блока на тарифе без функции рассылок |
access | Кампания не ваша |
db | Ошибка базы данных |
Отправить блок себе
POST /api/camp/btest.json
Доставляет превью одного сохранённого блока статуса в Telegram авторизованного пользователя через сервисного бота (только текст и кнопка — медиа не включается).
| Параметр | Обязательный | Описание |
|---|---|---|
id | ✓ | ID кампании |
status | ✓ | Статус лида 0–4 |
{ "status": "ok" }| Ошибка | Значение |
|---|---|
func | id/status неверны |
access | Кампания не ваша |
db | Ошибка базы данных |
Список рассылок
GET /api/broadcast/list.json
Возвращает ручные рассылки пользователя, новые сверху, со сохранёнными счётчиками.
Статусы рассылки: 0 черновик · 1 идёт · 2 готово · 3 отменена · 4 пауза.
Параметров нет. Каждая карточка содержит полный набор полей (тот же, что у
get), но без живого пересчёта: remaining
всегда 0, total — сохранённое значение, а campaigns — null (список кампаний
заполняет только get).
{
"status": "ok",
"data": [
{
"id": 5,
"name": "Майский возврат",
"status": 1,
"statuses": 24,
"campaigns": null,
"created_from": 0, "created_to": 0,
"status_from": 1714521600, "status_to": 1717113600,
"text": "Мы скучаем — держите скидку 20% 🎁",
"media": "", "media_type": 0,
"button": "Забрать", "link": "https://example.com/back?click={click}",
"total": 1240, "remaining": 0,
"queued": 440, "sent": 800, "failed": 0,
"started": 1717500000, "created": 1717490000
}
]
}statuses — битовая маска целевых статусов лида (бит 0 wait … бит 4 trash);
24 = биты 3+4 = cancel + trash.
| Ошибка | Значение |
|---|---|
db | Ошибка базы данных |
Шкала дневного лимита
GET /api/broadcast/quota.json
Дневной бюджет ручных отправок: лимит из тарифа, ручные отправки за сегодня (день по UTC) и текущая глубина очереди отправки. Параметров нет.
{ "status": "ok", "data": { "cap": 500, "used": 120, "queued": 440 } }| Поле | Значение |
|---|---|
cap | Дневной лимит ручных отправок из тарифа; 0 = без ограничений |
used | Ручных сообщений отправлено сегодня (день по UTC); 0, если строки за день ещё нет |
queued | Все ждущие в очереди сообщения пользователя (триггерные + ручные) |
| Ошибка | Значение |
|---|---|
db | Ошибка базы данных |
Получить одну рассылку
GET /api/broadcast/get.json
Возвращает рассылку целиком, включая область кампаний и фильтры. Для незапущенной
рассылки (не в статусе идёт) пересчитывает total (живая аудитория) и remaining
(размер Доделать — лиды, ещё не охваченные). Для идущей рассылки сохранённые
счётчики оставлены как есть.
| Параметр | Обязательный | Описание |
|---|---|---|
id | ✓ | ID рассылки |
{
"status": "ok",
"data": {
"id": 5, "name": "Майский возврат", "status": 2, "statuses": 24,
"campaigns": [12, 18],
"created_from": 0, "created_to": 0,
"status_from": 1714521600, "status_to": 1717113600,
"text": "Мы скучаем — держите скидку 20% 🎁",
"media": "", "media_type": 0,
"button": "Забрать", "link": "https://example.com/back?click={click}",
"total": 1300, "remaining": 60,
"queued": 0, "sent": 1240, "failed": 0,
"started": 1717500000, "created": 1717490000
}
}campaigns нормализуется к [] (никогда не null); пустой список = все ваши кампании.
| Ошибка | Значение |
|---|---|
func | id не задан (0) |
access | Рассылка не ваша или не найдена |
db | Ошибка базы данных |
Создать черновик
POST /api/broadcast/add.json
Создаёт пустой черновик рассылки. Требует функции рассылок. На пользователя действует
мягкий лимит в 100 рассылок: при достижении вернётся error: limit — удалите
ненужную, чтобы освободить место.
| Параметр | Описание |
|---|---|
name | Необязательное название |
{ "status": "ok", "id": 5 }id приходит верхним полем рядом со status, не внутри data.
| Ошибка | Значение |
|---|---|
broadcasts | Функция рассылок не включена на тарифе |
limit | Уже 100 рассылок — удалите одну, чтобы создать новую |
db | Ошибка базы данных |
Изменить рассылку
POST /api/broadcast/edit.json
Заменяет поля рассылки и область кампаний. Требует функции рассылок. Разрешено в
любом состоянии — тело берётся в момент отправки, поэтому правка идущей рассылки
влияет на ещё не ушедшие сообщения. Ссылка проверяется на корректность, а медиа — на
принадлежность вам; иначе error: func.
| Параметр | Обязательный | Описание |
|---|---|---|
id | ✓ | ID рассылки |
name | Название | |
statuses | Битовая маска целевых статусов (бит 0 wait … бит 4 trash) | |
campaigns | ID кампаний через запятую; пусто = все ваши кампании. Чужие ID молча отбрасываются | |
created_from / created_to | Фильтр по времени появления лида (unix; 0 = без границы) | |
status_from / status_to | Фильтр по времени смены статуса лида (unix; 0 = без границы) | |
text | Текст сообщения (Telegram Markdown) | |
media / media_type | Ссылка на медиа из media/upload и её тип (1 фото, 2 видео) | |
button / link | Подпись кнопки + URL (можно с макросами) |
{ "status": "ok" }| Ошибка | Значение |
|---|---|
func | id не задан, либо ссылка некорректна, либо медиа не ваше |
broadcasts | Функция рассылок не включена на тарифе |
access | Рассылка не ваша |
db | Ошибка базы данных |
Запуск (всегда «доделать»)
POST /api/broadcast/start.json
Ставит аудиторию в очередь и переводит рассылку в идёт. Требует функции рассылок.
Это всегда доделать: в очередь попадают только лиды, которых рассылка ещё не
охватила, поэтому повторный запуск готово/отменена рассылки уйдёт только новым
лидам. Разрешено из черновик/готово/отменена; рассылка в состоянии
идёт/пауза вернёт error: state.
| Параметр | Обязательный | Описание |
|---|---|---|
id | ✓ | ID рассылки |
{ "status": "ok", "queued": 60 }queued приходит верхним полем — число поставленных в очередь сообщений. 0
означает, что охватывать было некого, и статус рассылки не меняется:
{ "status": "ok", "queued": 0 }| Ошибка | Значение |
|---|---|
func | id не задан (0) |
broadcasts | Функция рассылок не включена на тарифе |
state | Рассылка идёт или пауза — используйте pause/cancel или resume |
access | Рассылка не ваша |
db | Ошибка базы данных |
Пауза
POST /api/broadcast/pause.json
идёт → пауза: неотправленные сообщения паркуются и сохраняются (отправщик их
пропускает, но не теряет).
| Параметр | Обязательный | Описание |
|---|---|---|
id | ✓ | ID рассылки |
{ "status": "ok" }| Ошибка | Значение |
|---|---|
func | id не задан (0) |
state | Рассылка не идёт или не ваша |
db | Ошибка базы данных |
Продолжить
POST /api/broadcast/resume.json
пауза → идёт: запаркованные сообщения снова становятся актуальными, и отправка
продолжается ровно с места остановки.
| Параметр | Обязательный | Описание |
|---|---|---|
id | ✓ | ID рассылки |
{ "status": "ok" }| Ошибка | Значение |
|---|---|
func | id не задан (0) |
state | Рассылка не на паузе или не ваша |
db | Ошибка базы данных |
Сбросить
POST /api/broadcast/reset.json
Очищает множество охваченных лидов и счётчики и возвращает черновик/готово/отменена
рассылку в черновик, сохраняя название, фильтры и тело. Следующий запуск тогда
переотправит всей аудитории. Рассылку в состоянии идёт/пауза нужно сначала
отменить.
| Параметр | Обязательный | Описание |
|---|---|---|
id | ✓ | ID рассылки |
{ "status": "ok" }| Ошибка | Значение |
|---|---|
func | id не задан (0) |
state | Рассылка идёт/пауза (сначала отмените) или не ваша |
db | Ошибка базы данных |
Остановить (отмена)
POST /api/broadcast/cancel.json
идёт/пауза → отменена: сбрасывает остаток сообщений в очереди. Множество уже
охваченных лидов сохраняется, поэтому будущий запуск Доделать им не напишет
повторно.
| Параметр | Обязательный | Описание |
|---|---|---|
id | ✓ | ID рассылки |
{ "status": "ok" }| Ошибка | Значение |
|---|---|
func | id не задан (0) |
state | Рассылка не идёт/пауза или не ваша |
db | Ошибка базы данных |
Удалить
POST /api/broadcast/del.json
Удаляет рассылку и её область, очередь и записи об охвате. Рассылку пауза удалить
можно (её запаркованные сообщения уходят вместе с ней); заблокировано только
состояние идёт — её сначала нужно отменить.
| Параметр | Обязательный | Описание |
|---|---|---|
id | ✓ | ID рассылки |
{ "status": "ok" }| Ошибка | Значение |
|---|---|
func | id не задан (0) |
state | Рассылка идёт (сначала отмените) или не ваша |
db | Ошибка базы данных |
Отправить себе
POST /api/broadcast/test.json
Доставляет превью тела рассылки авторизованному пользователю через сервисного бота (только текст и кнопка — медиа не включается). Функции рассылок не требует — можно проверить существующую рассылку и на тарифе без неё.
| Параметр | Обязательный | Описание |
|---|---|---|
id | ✓ | ID рассылки |
{ "status": "ok" }| Ошибка | Значение |
|---|---|
func | id не задан (0) |
access | Рассылка не ваша |
db | Ошибка базы данных |
Ошибки
| Ошибка | Значение |
|---|---|
broadcasts | Функция рассылок не включена на тарифе — повысьте тариф |
limit | Достигнут лимит в 100 рассылок на пользователя |
state | Действие недопустимо для текущего статуса рассылки (например, запуск идущей) |
access | Рассылка или кампания не ваша / не найдена |
func | Отсутствует или неверен обязательный параметр (либо некорректна ссылка / чужое медиа) |
unpaid | Подписка неактивна |
db | Ошибка базы данных |