Лиды, журнал и статистика
Просмотр и выгрузка лидов, чтение необработанного журнала активности в чате и получение агрегированной статистики.
Все эндпоинты на этой странице требуют активной оплаченной подписки. Если подписка
истекла и льготный период завершился, они возвращают ошибку unpaid. Кроме неё любой
из них может вернуть системные ошибки key, ban и db; они описаны в разделе
Авторизация и соглашения. Эндпоинт-специфичные ошибки
указаны в таблицах ниже.
Статусы лидов
Все поля фильтрации и ответов, связанные со статусом лида, используют числовые коды.
| Код | Название | Значение |
|---|---|---|
0 | wait | Подписчик открыл ссылку бота, но ещё не вступил в чат |
1 | hold | Отправил заявку на вступление, ожидает одобрения администратора |
2 | approve | Вступил в чат (или заявка была одобрена) |
3 | cancel | Покинул чат добровольно |
4 | trash | Исключён или забанен в чате |
Полные правила переходов и условия отправки постбэков — в разделе Жизненный цикл лида.
Список лидов
GET /api/leads/list.json
Возвращает лиды текущего аккаунта, соответствующие фильтрам, от новых к старым.
| Параметр | Описание |
|---|---|
campaign | Фильтр по ID кампании (0 или отсутствует — все кампании) |
status | Фильтр по коду статуса лида (0–4). Применяется всегда, когда параметр передан, включая status=0 (фильтр по wait) |
from | Начало диапазона дат создания лида, Unix-время в секундах (применяется при значении > 0) |
to | Конец диапазона дат создания лида, Unix-время в секундах (применяется при значении > 0) |
q | Поиск по подписчику: значение из одних цифр — точное совпадение по ID подписчика; иначе — поиск подстроки по username (ведущий @ отбрасывается) |
limit | Размер страницы (по умолчанию 50, максимум 200) |
offset | Смещение для пагинации (отрицательное приводится к 0) |
{
"status": "ok",
"data": [
{
"id": 1001,
"campaign": 12,
"bot": 7,
"click": "abc456xyz",
"subscriber": 9876543210,
"username": "alice",
"status": 2,
"start_time": 1747735200,
"join_time": 1747735260,
"leave_time": 0,
"created": 1747735200
}
]
}data — массив лидов (пустой [], если ничего не найдено); поля total в ответе нет.
username — пустая строка, если у подписчика нет username в Telegram.
click — пустая строка, если подписчик пришёл без click-payload (например, открыл
ссылку бота напрямую, а не через диплинк).
start_time, join_time, leave_time и created — Unix-время в секундах; значение
0 означает, что событие ещё не произошло (например, join_time равен 0, пока лид
находится в статусе wait или hold).
Счётчики по статусам
GET /api/leads/summary.json
Возвращает количество лидов в разбивке по каждому статусу для текущего фильтра. Сам
фильтр status здесь намеренно игнорируется — возвращается полная разбивка по всем
статусам, поэтому интерфейс может показать общую картину и позволить переключаться между
статусами.
| Параметр | Описание |
|---|---|
campaign | Фильтр по ID кампании |
from | Начало диапазона дат создания лида (Unix-время в секундах) |
to | Конец диапазона дат создания лида (Unix-время в секундах) |
q | Поиск по подписчику (число — точный ID подписчика, иначе подстрока по username) |
{
"status": "ok",
"total": 540,
"counts": {
"0": 50,
"1": 12,
"2": 420,
"3": 35,
"4": 23
}
}Поля total и counts лежат на верхнем уровне ответа (не во вложенном объекте data).
counts — карта, где ключ — код статуса лида в виде строки, а значение — количество
лидов в этом статусе. total — сумма по всем статусам.
Выгрузка лидов в CSV
GET /api/leads/export.csv
Отдаёт отфильтрованные лиды текущего аккаунта в виде файла CSV для скачивания. Принимает те же фильтры, что и список лидов, но без пагинации: выгружается весь подходящий набор (не более 100000 строк).
| Параметр | Описание |
|---|---|
campaign | Фильтр по ID кампании |
status | Фильтр по коду статуса лида (применяется, когда параметр передан) |
from | Начало диапазона дат создания лида (Unix-время в секундах) |
to | Конец диапазона дат создания лида (Unix-время в секундах) |
q | Поиск по подписчику (число — точный ID подписчика, иначе подстрока по username) |
В отличие от остальных эндпоинтов, ответ — не JSON. Это text/csv; charset=utf-8 c
UTF-8 BOM (чтобы кириллица в названиях кампаний корректно открывалась в Excel) и
заголовком Content-Disposition: attachment; filename="leads-ГГГГММДД.csv".
Строка заголовка и порядок столбцов:
created,status,subscriber,username,campaign,bot,click,started,joined,leftstatus— словесное название (wait,hold,approve,cancel,trash; для неизвестного кода — само число).created,started,joined,left— время в UTC в форматеГГГГ-ММ-ДД ЧЧ:ММ:СС; пустая строка, если событие ещё не произошло.campaign— название кампании (если оно пустое — её код, иначе#<id>).bot— username бота (если он пустой —#<id>).
Если запрос не прошёл ещё до начала отдачи файла, возвращается обычный JSON-ответ с
ошибкой (например, db). После того как заголовок CSV отправлен, ответ уже зафиксирован,
поэтому сбой при чтении строки просто завершает поток — клиент получает укороченный файл.
Журнал активности в чате
GET /api/journal/list.json
Возвращает журнал активности одного чата — все события вступления и выхода, включая органическую активность (пользователи, вступившие без запуска бота), от новых к старым. Это необработанный источник динамики канала; органические события не создают лидов и не отправляют постбэки. Эндпоинт привязан к конкретной паре бот + чат, поэтому оба параметра обязательны.
| Параметр | Обязательный | Описание |
|---|---|---|
bot | ✓ | ID бота. Должен принадлежать текущему аккаунту, иначе — ошибка access |
chat | ✓ | ID чата в Telegram |
action | Фильтр по типу действия (см. таблицу ниже). Применяется, когда параметр передан | |
paid | paid=1 — только записи, привязанные к лиду (lead ≠ 0); любое другое значение — только органические записи (lead = 0). Применяется, когда параметр передан | |
from | Начало диапазона дат, Unix-время в секундах | |
to | Конец диапазона дат, Unix-время в секундах | |
limit | Размер страницы (по умолчанию 50, максимум 200) | |
offset | Смещение для пагинации |
{
"status": "ok",
"data": [
{
"id": 5001,
"chat": -1001234567890,
"subscriber": 9876543210,
"username": "alice",
"action": 0,
"lead": 1001,
"time": 1747735260
}
]
}data — массив записей (пустой [], если ничего не найдено); поля total в ответе нет.
action — числовой код действия (см. таблицу ниже), а не строка. lead — ID
связанного лида или 0 для органической активности. time — Unix-время в секундах.
action | Значение |
|---|---|
0 | join — подписчик вступил в чат |
1 | leave — подписчик покинул чат добровольно |
2 | kicked — подписчик исключён или забанен |
3 | request — подписчик отправил заявку на вступление |
| Ошибка | Значение |
|---|---|
func | Не передан bot или chat |
access | Указанный бот не принадлежит текущему аккаунту |
Выгрузка журнала в CSV
GET /api/journal/list.csv
Отдаёт журнал активности одного чата в виде файла CSV для скачивания. Принимает те же
параметры области и фильтры, что и журнал активности
(bot и chat обязательны, опционально action/paid/from/to), но без пагинации:
выгружается весь подходящий набор (не более 100000 строк).
В отличие от JSON-эндпоинтов, ответ — text/csv; charset=utf-8 c UTF-8 BOM и
заголовком Content-Disposition: attachment; filename="activity-ГГГГММДД.csv".
Строка заголовка и порядок столбцов:
time,subscriber,username,action,typetime— время события в UTC в форматеГГГГ-ММ-ДД ЧЧ:ММ:СС.action— словесное название действия (join,leave,ban,request).type—paid, если запись привязана к лиду, иначеorganic.
Поведение при ошибках — как у выгрузки лидов:
сбой до начала отдачи возвращает JSON-ошибку (func/access/db), а после отправки
заголовка CSV поток просто завершается.
| Ошибка | Значение |
|---|---|
func | Не передан bot или chat |
access | Указанный бот не принадлежит текущему аккаунту |
Сводная статистика
GET /api/stats/summary.json
Агрегированные счётчики за период (по умолчанию — последние 30 дней) по всему аккаунту или по одной кампании. Считается в реальном времени из актуальных данных: лиды учитываются по своему текущему статусу (срез на момент запроса), поэтому пять статусов в сумме дают общее число запусков. Ответ кешируется на несколько минут, так что цифры обновляются с небольшой задержкой.
| Параметр | Описание |
|---|---|
campaign | Фильтр по одной кампании (не указывайте для статистики по всему аккаунту). Если кампания указана, но не принадлежит аккаунту — ошибка access |
from | Начало периода, Unix-время в секундах (по умолчанию — полночь 29 дней назад; окно охватывает последние 30 дней, включая сегодня) |
to | Конец периода, Unix-время в секундах (по умолчанию — текущий момент) |
{
"status": "ok",
"totals": {
"wait": 50,
"hold": 12,
"approve": 420,
"cancel": 35,
"trash": 23,
"org_join": 150,
"org_leave": 42
},
"starts": 540,
"confirms": 420,
"unsubs": 35,
"lefts": 23,
"cr": 0.7777777777777778
}Все поля лежат на верхнем уровне ответа (не во вложенном объекте data). totals — это
семь базовых счётчиков: пять статусов лидов (wait, hold, approve, cancel, trash)
плюс органические org_join и org_leave. Производные поля:
starts— сумма пяти статусов лидов (wait+hold+approve+cancel+trash).confirms— равноtotals.approve.unsubs— равноtotals.cancel.lefts— равноtotals.trash.cr— конверсия как доля от 0 до 1 (approve / starts), без умножения на 100 и без округления (например,0.84). Еслиstartsравно 0,crравно 0.
| Ошибка | Значение |
|---|---|
access | Кампания указана, но не принадлежит текущему аккаунту |
Временной ряд по дням
GET /api/stats/series.json
Счётчики по дням для построения графиков. Принимает те же фильтры, что и сводная статистика.
| Параметр | Описание |
|---|---|
campaign | Фильтр по одной кампании. Если кампания указана, но не принадлежит аккаунту — ошибка access |
from | Начало периода, Unix-время в секундах (по умолчанию — последние 30 дней) |
to | Конец периода, Unix-время в секундах (по умолчанию — текущий момент) |
{
"status": "ok",
"series": [
{ "date": "2026-05-20", "wait": 5, "hold": 1, "approve": 19, "cancel": 2, "trash": 0, "org_join": 8, "org_leave": 3 },
{ "date": "2026-05-21", "wait": 4, "hold": 0, "approve": 15, "cancel": 1, "trash": 1, "org_join": 5, "org_leave": 2 }
],
"group": "day"
}series — массив точек (по одной на день; пустой [], если данных нет); каждая точка
содержит дату и те же семь счётчиков, что и totals в сводке. group всегда равно
"day". Дни без активности пропускаются. Как и сводка, ряд считается в реальном времени
из актуальных данных (лиды — по текущему статусу) и кешируется на несколько минут.
| Ошибка | Значение |
|---|---|
access | Кампания указана, но не принадлежит текущему аккаунту |
Топ кампаний
GET /api/stats/campaigns.json
Рейтинг кампаний по эффективности за период — панель «Топ кампаний» в дашборде. Считает
лидов по каждой неудалённой кампании аккаунта и сортирует по числу подтверждённых
подписчиков (approve), затем по starts, затем по ID. Как и сводка, считается в
реальном времени из актуальных данных (лиды — по текущему статусу) и кешируется на
несколько минут; органика в рейтинге не участвует.
| Параметр | Описание |
|---|---|
from | Начало периода, Unix-время в секундах (по умолчанию — последние 30 дней) |
to | Конец периода, Unix-время в секундах (по умолчанию — текущий момент) |
limit | Размер рейтинга (по умолчанию 5; значение ≤ 0 или > 50 приводится к 5) |
{
"status": "ok",
"data": [
{
"id": 12,
"name": "Spring promo",
"code": "abc123",
"chat_title": "My Channel",
"wait": 50,
"hold": 12,
"approve": 420,
"cancel": 35,
"trash": 23,
"starts": 540,
"cr": 0.7777777777777778
}
]
}data — массив кампаний, отсортированный по убыванию approve, затем starts, затем по
возрастанию ID и обрезанный до limit. Для каждой кампании: wait, hold, approve,
cancel, trash — счётчики по статусам лидов; starts — их сумма; cr — конверсия как
доля от 0 до 1 (approve / starts), как и в сводке. Отдельного фильтра по кампании здесь
нет — рейтинг строится по всем неудалённым кампаниям аккаунта.
Сводный отчёт
GET /api/stats/report.json
Группированная таблица статистики — экран «Статистика» в дашборде. Считает запуски и лидов по статусам (из актуальных данных, лиды — по текущему статусу) плюс активность в чате (вступления, выходы, баны), сгруппированные по выбранному измерению.
| Параметр | Описание |
|---|---|
group | Измерение группировки: date (по умолчанию), campaign или bot |
traffic | Какой трафик учитывать в столбцах активности: all (по умолчанию), organic (только органика) или campaign (только из кампаний). Влияет только на joins/leaves/bans, не на счётчики по статусам |
from | Начало периода, Unix-время в секундах (по умолчанию — последние 30 дней) |
to | Конец периода, Unix-время в секундах (по умолчанию — текущий момент) |
bots | Список ID ботов через запятую — фильтр по нескольким ботам |
campaigns | Список ID кампаний через запятую — фильтр по нескольким кампаниям |
{
"status": "ok",
"group": "date",
"traffic": "all",
"rows": [
{
"key": "2026-06-20",
"label": "2026-06-20",
"total": 540,
"valid": 517,
"wait": 50,
"hold": 12,
"approve": 420,
"cancel": 35,
"trash": 23,
"cr": 0.7777777777777778,
"validity": 0.9574074074074074,
"joins": 95,
"leaves": 18,
"bans": 4
}
],
"totals": {
"key": "",
"label": "",
"total": 540,
"valid": 517,
"wait": 50,
"hold": 12,
"approve": 420,
"cancel": 35,
"trash": 23,
"cr": 0.7777777777777778,
"validity": 0.9574074074074074,
"joins": 95,
"leaves": 18,
"bans": 4
}
}| Поле | Значение |
|---|---|
key | Ключ группы: дата (ГГГГ-ММ-ДД) либо ID кампании/бота строкой |
label | Подпись группы для показа (дата / название кампании / @bot) |
code | Код кампании (присутствует только при group=campaign) |
total | Все лиды (= сумма пяти статусов, т.е. все запуски /start) |
valid | Все лиды кроме trash (total − trash) |
wait…trash | Счётчики по статусам лидов |
cr | approve / total, доля от 0 до 1 |
validity | valid / total, доля от 0 до 1 |
joins / leaves / bans | Активность в чате: вступления / добровольные выходы / баны (разделены, в отличие от свёрток) |
rows отсортированы по дате (от новых к старым), а для группировки по кампании/боту — по
убыванию total, затем approve, затем по ID. totals — те же метрики, просуммированные
по всем строкам (поля key/label пустые).
| Ошибка | Значение |
|---|---|
db | Ошибка базы данных |
Сводный отчёт в CSV
GET /api/stats/report.csv
Те же данные, что и сводный отчёт, с теми же
параметрами (group/traffic/from/to/bots/campaigns), в виде файла CSV для
скачивания. Ответ — text/csv; charset=utf-8 c UTF-8 BOM и заголовком
Content-Disposition: attachment; filename="stats-ГГГГММДД.csv".
Первый столбец — измерение группировки (date, campaign или bot; для группировки по
кампании добавляется столбец code), далее
total,valid,wait,hold,approve,cancel,trash,cr,validity,joins,leaves,bans. Последняя
строка — итоговая (total) с суммами по всем группам.
| Ошибка | Значение |
|---|---|
db | Ошибка базы данных |