РусскийПользовательский APIКампании, экраны и медиа

Кампании, экраны и медиа

Полное управление кампаниями (CRUD, диплинк, пауза/возобновление), интеграция с трекером (поток и его статистика), триггерные дожимы, многоэкранные приветственные сценарии с кнопками, CAS-защита, чистка групп и загрузка медиа.

Все эндпоинты на этой странице требуют активной подписки (см. Авторизация и соглашения). При истёкшей подписке возвращается unpaid, при неверной авторизации — key. Ответ всегда приходит с кодом HTTP 200 и телом application/json; успех или ошибка указываются в поле status. Общие правила — в разделе Авторизация и соглашения.


Список кампаний

GET /api/camp/list.json

Возвращает все неудалённые кампании (статус кампании ≠ 2) текущего аккаунта, новые первыми. Каждая кампания — полная карточка с пожизненными счётчиками и (если поток создан) разрешённым URL потока трекера.

{
  "status": "ok",
  "data": [
    {
      "id": 12,
      "code": "a1b2c3d4",
      "bot": 7,
      "bot_username": "mytrackbot",
      "chat": -1001234567890,
      "chat_type": 0,
      "chat_title": "My Channel",
      "chat_about": "Эксклюзивный контент для подписчиков",
      "chat_link": "https://t.me/mychannel",
      "name": "Летняя кампания",
      "text": "Подпишитесь на *{title}* — эксклюзив внутри!",
      "media": "",
      "media_type": 0,
      "button": "Получить доступ",
      "link": "https://example.com/lander?click={click}",
      "mode": 0,
      "cas_ban": 0,
      "auto_accept": 0,
      "pb_wait": "",
      "pb_hold": "",
      "pb_approve": "",
      "pb_cancel": "",
      "pb_trash": "",
      "unsub_window": 2592000,
      "track_organic": 1,
      "notify_level": 1,
      "flow_id": 0,
      "flow_url": "",
      "status": 0,
      "created": 1746860400,
      "counters": {
        "wait": 120,
        "hold": 30,
        "approve": 98,
        "cancel": 8,
        "trash": 4,
        "org_join": 15,
        "org_leave": 3
      }
    }
  ]
}
ПолеЗначение
code8-символьный код кампании, используется в диплинке
chat_type0 канал, 1 группа
chat_aboutОписание канала/группы, подтянутое из Telegram (только чтение)
chat_linkПубличная ссылка на чат (t.me/<username> или инвайт), "" если неизвестна (только чтение)
modeТип приветствия: 0 классическое одно сообщение, 1 многоэкранный сценарий
cas_ban1 — кикать вступающих из списка CAS (см. CAS-защита)
auto_accept1 — автоматически принимать входящие заявки на вступление (см. Создать кампанию)
track_organic1 — логировать органические вступления/выходы, 0 — нет
notify_levelУведомления о лидах: 0 выкл, 1 approve, 2 approve + wait, 3 все статусы
flow_id / flow_urlПоток трекера, привязанный к кампании (0/"", пока поток не создан)
createdUnix-время создания (целое число секунд)
countersПожизненные счётчики из дневных агрегатов; нули, пока статистики нет
statusЗначение
0Активна
1На паузе
2Удалена (мягко — лиды и статистика сохраняются; в списке не показывается)
3Сон (приостановлена воркером при истечении тарифа; пробуждается при продлении)

Получить одну кампанию

GET /api/camp/get.json

Возвращает карточку одной кампании по id (та же структура, что в списке) с пожизненными счётчиками и разрешённым URL потока.

ПараметрОбязательныйОписание
idID кампании
{
  "status": "ok",
  "data": {
    "id": 12,
    "code": "a1b2c3d4",
    "bot": 7,
    "bot_username": "mytrackbot",
    "chat": -1001234567890,
    "chat_type": 0,
    "chat_title": "My Channel",
    "chat_about": "Эксклюзивный контент для подписчиков",
    "chat_link": "https://t.me/mychannel",
    "name": "Летняя кампания",
    "text": "Подпишитесь на *{title}* — эксклюзив внутри!",
    "media": "",
    "media_type": 0,
    "button": "Получить доступ",
    "link": "https://example.com/lander?click={click}",
    "mode": 0,
    "cas_ban": 0,
    "auto_accept": 0,
    "pb_wait": "",
    "pb_hold": "",
    "pb_approve": "",
    "pb_cancel": "",
    "pb_trash": "",
    "unsub_window": 2592000,
    "track_organic": 1,
    "notify_level": 1,
    "flow_id": 0,
    "flow_url": "",
    "status": 0,
    "created": 1746860400,
    "counters": {
      "wait": 120,
      "hold": 30,
      "approve": 98,
      "cancel": 8,
      "trash": 4,
      "org_join": 15,
      "org_leave": 3
    }
  }
}

Пустые поля pb_* означают, что кампания наследует глобальные шаблоны постбэков. unsub_window — в секундах; 0 означает, что окно никогда не закрывается (постбэки cancel/trash отправляются всегда, независимо от времени отписки).

ОшибкаЗначение
funcid не передан или равен 0
accessКампания не найдена или принадлежит другому аккаунту

Создать кампанию

POST /api/camp/add.json

Создаёт кампанию на принадлежащем вам, не удалённом боте и чате. Применяется лимит кампаний вашего тарифа (-1 = безлимит). Название и тип чата подтягиваются из кеша админ-чатов бота; код из 8 символов генерируется автоматически.

bot и chat должны быть получены из bots/chats — это бот-администратор и чат, в котором он состоит.

ПараметрОбязательныйОписание
botID бота
chatID чата (знаковое число, из bots/chats)
nameНазвание кампании
textТекст приветственного сообщения (Telegram Markdown)
mediaСсылка на медиа из media/upload; не указывается для текстового сообщения
media_typeТип медиа: 1 фото, 2 видео
buttonПодпись CPA-кнопки в приветственном сообщении
linkURL CPA-кнопки — может содержать {click} и другие макросы (валидируется: https://, http://, tg://, t.me/, telegram.me/, @handle или пусто)
pb_waitШаблон URL постбэка для события wait
pb_holdШаблон URL постбэка для события hold
pb_approveШаблон URL постбэка для события approve
pb_cancelШаблон URL постбэка для события cancel
pb_trashШаблон URL постбэка для события trash
unsub_windowСекунд после вступления, в течение которых отправляются постбэки cancel/trash; 0 = всегда
track_organicЛогировать органические вступления/выходы. По умолчанию включено; выключается только явным falsy-значением (0/false/no/off)
auto_acceptАвтоматически принимать входящие заявки на вступление в чат. По умолчанию выключено; включается явным truthy-значением (1/true/yes/on). Тарифом не ограничено
notify_levelУровень уведомлений о лидах: 0 выкл, 1 approve, 2 approve + wait, 3 все статусы
{ "status": "ok", "id": 12, "code": "a1b2c3d4" }

При создании название, описание и публичная ссылка чата подтягиваются из Telegram (не критично — при недоступности заполняются позже) и сохраняются в карточку (chat_title, chat_about, chat_link).

ОшибкаЗначение
funcbot или chat равны 0, либо link не прошёл валидацию
accessБот не принадлежит вам или удалён
limitДостигнут лимит кампаний по тарифу — повысьте тариф

Изменить кампанию

POST /api/camp/edit.json

Частичное обновление: изменяются только переданные поля, остальные остаются как есть. Каждое поле, включая каждый из pb_*, редактируется независимо. Бот и чат после создания изменить нельзя. Изменение media сбрасывает закешированный file_id Telegram (файл будет загружен заново при следующем /start).

ПараметрОбязательныйОписание
idID кампании
nameНовое название кампании
textНовый текст приветственного сообщения
mediaНовая ссылка на медиа (должна принадлежать вам; передайте "", чтобы удалить текущее медиа)
media_typeНовый тип медиа: 1 фото, 2 видео
buttonНовая подпись CPA-кнопки
linkНовый URL CPA-кнопки
pb_waitНовый шаблон URL постбэка wait
pb_holdНовый шаблон URL постбэка hold
pb_approveНовый шаблон URL постбэка approve
pb_cancelНовый шаблон URL постбэка cancel
pb_trashНовый шаблон URL постбэка trash
unsub_windowНовое окно отписки в секундах
track_organic1/true/yes/on — логировать органику, иначе — нет
auto_accept1/true/yes/on — принимать заявки на вступление автоматически, иначе — нет
notify_levelНовый уровень уведомлений о лидах (0–3)
{ "status": "ok" }
ОшибкаЗначение
funcid равен 0, либо link или собственное media не прошли валидацию
accessКампания не принадлежит вам

GET /api/camp/link.json

Возвращает диплинк для подписчиков данной кампании и флаг подключения трекера. Распространяйте эту ссылку через источники трафика — когда подписчик открывает её, бот приветствует его и конверсия фиксируется.

ПараметрОбязательныйОписание
idID кампании
{
  "status": "ok",
  "code": "a1b2c3d4",
  "url": "https://t.me/mytrackbot?start=a1b2c3d4-{click}",
  "tracker_connected": true
}

В ссылке всегда присутствует литеральный макрос {click} — трекер рекламодателя подставляет реальный click ID в момент перехода. tracker_connected показывает, подключён ли у вас трекер (можно ли создать поток через camp/flow).

ОшибкаЗначение
funcid равен 0
accessКампания не принадлежит вам

Поставить на паузу или возобновить

POST /api/camp/pause.json

ПараметрОбязательныйОписание
idID кампании
pause1 — поставить на паузу, 0/отсутствует — возобновить
{ "status": "ok", "camp_status": 1 }

camp_status — новый статус кампании в ответе: 1 на паузе, 0 активна.

ОшибкаЗначение
funcid равен 0
accessКампания не принадлежит вам

Удалить кампанию

POST /api/camp/del.json

Мягко удаляет кампанию (статус кампании = 2). Существующие лиды, записи журнала и статистика сохраняются и продолжают ссылаться на кампанию.

ПараметрОбязательныйОписание
idID кампании
{ "status": "ok" }
ОшибкаЗначение
funcid равен 0
accessКампания не принадлежит вам

Переключить режим приветствия

POST /api/camp/mode.json

Переключает приветственный сценарий между классическим одним сообщением (mode = 0) и многоэкранным сценарием (mode = 1). Первое включение режима экранов создаёт стартовый экран из классического креатива (текст/медиа + CTA-кнопка), так что переход не теряет данные и сразу пригоден к работе.

Включение режима экранов требует функции экранов на вашем тарифе (проверяется на сервере); выключение разрешено всегда — пользователь без функции может вернуться к классическому сообщению.

ПараметрОбязательныйОписание
idID кампании
mode1 — многоэкранный сценарий, 0 — классическое сообщение (поле должно присутствовать)
{ "status": "ok", "mode": 1 }
ОшибкаЗначение
funcid равен 0, либо mode не передан
accessКампания не принадлежит вам
screensФункция экранов не включена на тарифе (только при включении) — повысьте тариф

Создать поток трекера

POST /api/camp/flow.json

Создаёт поток (flow) в подключённом трекере AlterCPA Lite для диплинка кампании, сохраняет ID и URL потока в кампанию и возвращает URL. Если поток уже создан — возвращает сохранённый URL, не обращаясь к трекеру. Требуется подключённый трекер (см. подключение трекера).

ПараметрОбязательныйОписание
idID кампании
{ "status": "ok", "url": "https://track.example.com/abcd1234" }

Если вызов создания потока в трекере не удался, ответ остаётся status: ok, но содержит мягкую ошибку:

{ "status": "ok", "error": "create" }
ОшибкаЗначение
funcid равен 0
accessКампания не принадлежит вам либо трекер не подключён
createТрекер не смог создать поток (мягкая ошибка, status = ok)

Пересинхронизировать поток

POST /api/camp/flowsync.json

Восстанавливает связь кампании с потоком трекера, если поток мог быть удалён на стороне трекера. Проверяет сохранённый поток: если он на месте — обновляет URL и возвращает recreated: false; если трекер сообщает, что поток удалён — пересоздаёт его из диплинка кампании, сохраняет новый ID и URL и возвращает recreated: true. Если трекер недоступен, поток не пересоздаётся (чтобы не плодить дубликаты). Используйте этот вызов для восстановления потока, удалённого на стороне трекера.

ПараметрОбязательныйОписание
idID кампании
{ "status": "ok", "url": "https://track.example.com/abcd1234", "recreated": false }

Мягкие ошибки приходят с status: ok и полем error:

{ "status": "ok", "error": "sync" }
ОшибкаЗначение
funcid равен 0
accessКампания не принадлежит вам либо трекер не подключён
noflowУ кампании ещё нет потока — сначала создайте его через camp/flow (мягкая ошибка, status = ok)
syncТрекер недоступен, пересоздание пропущено (мягкая ошибка, status = ok)
createПоток удалён в трекере, но пересоздать его не удалось (мягкая ошибка, status = ok)
busyСлишком частые запросы (лимит 30 в минуту)

Статистика потока

GET /api/camp/flowstats.json

Возвращает дневную статистику из подключённого трекера для потока кампании за последние N дней.

ПараметрОбязательныйОписание
idID кампании
daysКоличество дней; по умолчанию 7, максимум 90
{
  "status": "ok",
  "rows": [
    {
      "date": "2026-06-20",
      "clicks": 540,
      "unique": 512,
      "wait": 120,
      "hold": 30,
      "approve": 98,
      "cancel": 8,
      "trash": 4,
      "cr": 19.14,
      "ar": 81.67,
      "exit_pct": 10.91
    }
  ]
}

Если у кампании ещё нет потока, rows пуст ([]). При сбое запроса к трекеру ответ остаётся status: ok с мягкой ошибкой {"status":"ok","error":"stats"}.

ПолеЗначение
clicks / uniqueВсего переходов / уникальных переходов
crCR%: валидные лиды / уникальные переходы (рассчитывает трекер)
arAR%: одобренные / валидные лиды (рассчитывает трекер)
exit_pct(cancel + trash) / (approve + cancel + trash), %
ОшибкаЗначение
funcid равен 0
accessКампания не принадлежит вам либо трекер не подключён
statsТрекер не смог отдать статистику (мягкая ошибка, status = ok)

Триггерные дожимы: получить

GET /api/camp/broadcast.json

Возвращает пять блоков триггерных авто-сообщений кампании — по одному на каждый статус лида (0 wait, 1 hold, 2 approve, 3 cancel, 4 trash). Статус без сохранённого блока возвращается как нулевой блок (on = 0). Это триггерные дожимы по статусу; массовые ручные рассылки описаны на странице Рассылки.

ПараметрОбязательныйОписание
idID кампании
{
  "status": "ok",
  "data": [
    {
      "status": 0,
      "on": 1,
      "delay": 3600,
      "text": "Ещё думаете? Доступ закрывается!",
      "media": "",
      "media_type": 0,
      "button": "Вступить",
      "link": "https://t.me/mytrackbot?start=a1b2c3d4-{click}"
    }
  ]
}
ОшибкаЗначение
funcid равен 0
accessКампания не принадлежит вам

Триггерные дожимы: сохранить

POST /api/camp/broadcast.json

Сохраняет (upsert) один блок дожима по статусу. Включение (on = 1) требует функции рассылок на вашем тарифе; выключение и редактирование выключенного блока разрешены всегда. Изменение media сбрасывает закешированный file_id.

ПараметрОбязательныйОписание
idID кампании
statusСтатус лида 04 (>4func)
on1 — включить дожим (требует функции рассылок), иначе выключить
delayСекунд после входа в статус перед отправкой
textТекст сообщения
mediaСсылка на медиа из media/upload (должна принадлежать вам)
media_typeТип медиа: 1 фото, 2 видео
buttonПодпись CTA-кнопки
linkURL CTA-кнопки (валидируется как у кампании)
{ "status": "ok" }
ОшибкаЗначение
funcid равен 0, status > 4, либо link/media не прошли валидацию
accessКампания не принадлежит вам
broadcastsФункция рассылок не включена на тарифе (только при включении) — повысьте тариф

Тест дожима

POST /api/camp/btest.json

Ставит в очередь «отправку себе» — превью блока дожима (только текст + CTA) владельцу через служебного бота. Блок должен быть предварительно сохранён.

ПараметрОбязательныйОписание
idID кампании
statusСтатус блока 04
{ "status": "ok" }
ОшибкаЗначение
funcid равен 0 или status > 4
accessКампания не принадлежит вам

Приветственные экраны: список

GET /api/screen/list.json

Возвращает экраны кампании (стартовый первым; сортировка по scr_order, scr_id), каждый со своими упорядоченными кнопками. Доступ только владельцу; функцией экранов не ограничен (но требует активной подписки).

Многоэкранный сценарий используется кампанией при режиме кампании mode = 1 (см. режим приветствия). Экран — это медиа + текст + упорядоченный список inline-кнопок, которые бот раскладывает по строкам шириной columns.

ПараметрОбязательныйОписание
campID кампании
{
  "status": "ok",
  "data": [
    {
      "id": 30,
      "campaign": 12,
      "order": 0,
      "name": "Старт",
      "text": "Привет! Готовы вступить?",
      "media": "",
      "media_type": 0,
      "columns": 1,
      "created": 1746860400,
      "buttons": [
        { "id": 51, "order": 0, "label": "Подробнее", "kind": 1, "link": "", "target": 31 },
        { "id": 52, "order": 1, "label": "Открыть сайт", "kind": 0, "link": "https://example.com/lander", "target": 0 }
      ]
    }
  ]
}
Поле кнопкиЗначение
kind0 URL-кнопка (задан link), 1 навигация на другой экран (задан target)
targetscr_id целевого экрана этой же кампании (для kind = 1)
ОшибкаЗначение
funccamp равен 0
accessКампания не принадлежит вам

Добавить экран

POST /api/screen/add.json

Добавляет экран в кампанию (лимит screens_max, по умолчанию 10). Первый экран получает order 0 (стартовый). Возвращает новую карточку экрана.

ПараметрОбязательныйОписание
campID кампании
nameНазвание экрана
textТекст экрана
mediaСсылка на медиа из media/upload (должна принадлежать вам; пусто допустимо)
media_typeТип медиа: 1 фото, 2 видео
columnsКнопок в строке, зажато в диапазон 1–8 (по умолчанию 1)
{
  "status": "ok",
  "data": {
    "id": 32,
    "campaign": 12,
    "order": 2,
    "name": "Бонус",
    "text": "Дарим бонус новым подписчикам",
    "media": "",
    "media_type": 0,
    "columns": 1,
    "buttons": [],
    "created": 0
  }
}
ОшибкаЗначение
funccamp равен 0 либо media не прошло валидацию
accessКампания не принадлежит вам
screensФункция экранов не включена на тарифе — повысьте тариф
limitДостигнут лимит экранов (screens_max)

Изменить экран

POST /api/screen/edit.json

Частичное обновление содержимого экрана: изменяются только переданные поля. Изменение media сбрасывает закешированный file_id. Требует функции экранов на тарифе.

ПараметрОбязательныйОписание
idID экрана
nameНовое название экрана
textНовый текст экрана
mediaНовая ссылка на медиа (должна принадлежать вам)
media_typeНовый тип медиа: 1 фото, 2 видео
columnsКнопок в строке, зажато в диапазон 1–8
{ "status": "ok" }
ОшибкаЗначение
funcid равен 0 либо media не прошло валидацию
accessЭкран не принадлежит вам
screensФункция экранов не включена на тарифе

Копировать экран

POST /api/screen/copy.json

Дублирует экран (текст + медиа + кнопки) и добавляет копию в ту же кампанию (лимит screens_max). Навигационные кнопки сохраняют свой target. Требует функции экранов.

ПараметрОбязательныйОписание
idID исходного экрана
{
  "status": "ok",
  "data": {
    "id": 33,
    "campaign": 12,
    "order": 3,
    "name": "Старт",
    "text": "Привет! Готовы вступить?",
    "media": "",
    "media_type": 0,
    "columns": 1,
    "buttons": [
      { "id": 60, "order": 0, "label": "Открыть сайт", "kind": 0, "link": "https://example.com/lander", "target": 0 }
    ],
    "created": 1750000000
  }
}

Если не удалось перечитать копию из БД, ответ — резервный {"status":"ok","id":33} (только id, без data).

ОшибкаЗначение
funcid равен 0
accessЭкран не принадлежит вам
screensФункция экранов не включена на тарифе
limitДостигнут лимит экранов (screens_max)

Удалить экран

POST /api/screen/del.json

Удаляет экран и его кнопки. Отказывает, если это единственный экран кампании или если на него ещё ведёт навигационная кнопка. Требует функции экранов.

ПараметрОбязательныйОписание
idID экрана
{ "status": "ok" }
ОшибкаЗначение
funcid равен 0
accessЭкран не принадлежит вам
screensФункция экранов не включена на тарифе
lastЭто единственный экран кампании — удалить нельзя
linkedНа этот экран ещё ведёт навигационная кнопка — сначала перенаправьте её

Переупорядочить экраны

POST /api/screen/reorder.json

Переназначает порядок экранов по списку их ID. Экран на позиции 0 становится стартовым. ID, не принадлежащие кампании, молча пропускаются. Требует функции экранов.

ПараметрОбязательныйОписание
campID кампании
orderID экранов через запятую в желаемом порядке, например 5,3,7
{ "status": "ok" }
ОшибкаЗначение
funccamp равен 0 либо список order пуст
accessКампания не принадлежит вам
screensФункция экранов не включена на тарифе

Тест экрана

POST /api/screen/test.json

Отправляет «себе» превью экрана (только текст + кнопки; медиа опускается) владельцу через служебного бота. Доступ только владельцу; функцией экранов не ограничен.

ПараметрОбязательныйОписание
idID экрана
{ "status": "ok" }
ОшибкаЗначение
funcid равен 0
accessЭкран не принадлежит вам

Добавить кнопку

POST /api/button/add.json

Добавляет кнопку на экран (лимит screen_buttons_max, по умолчанию 8). kind, link и target валидируются совместно. Требует функции экранов. Возвращает новую карточку кнопки.

ПараметрОбязательныйОписание
screenID экрана
labelПодпись кнопки
kind0 URL-кнопка (по умолчанию), 1 навигация на другой экран
linkОбязателен при kind = 0: валидный URL (https/http/tg/t.me/telegram.me/@handle); при kind = 1 принудительно очищается
targetОбязателен при kind = 1: scr_id другого экрана этой же кампании (не этого экрана); при kind = 0 принудительно 0
{
  "status": "ok",
  "data": { "id": 61, "order": 1, "label": "Подробнее", "kind": 1, "link": "", "target": 31 }
}
ОшибкаЗначение
funcscreen равен 0 либо недопустимое сочетание kind/link/target
accessЭкран не принадлежит вам
screensФункция экранов не включена на тарифе
limitДостигнут лимит кнопок (screen_buttons_max)

Изменить кнопку

POST /api/button/edit.json

Полностью заменяет label/kind/link/target кнопки (не частичное обновление — все поля переписываются как единое целое). kind/link/target валидируются совместно, как при добавлении. Требует функции экранов.

ПараметрОбязательныйОписание
idID кнопки
labelНовая подпись кнопки
kind0 URL-кнопка, 1 навигация
linkОбязателен при kind = 0 (валидный URL); при kind = 1 очищается
targetОбязателен при kind = 1 (другой экран той же кампании); при kind = 0 → 0
{ "status": "ok" }
ОшибкаЗначение
funcid равен 0 либо недопустимое сочетание kind/link/target
accessКнопка не принадлежит вам
screensФункция экранов не включена на тарифе

Удалить кнопку

POST /api/button/del.json

Удаляет кнопку. Требует функции экранов.

ПараметрОбязательныйОписание
idID кнопки
{ "status": "ok" }
ОшибкаЗначение
funcid равен 0
accessКнопка не принадлежит вам
screensФункция экранов не включена на тарифе

Переупорядочить кнопки

POST /api/button/reorder.json

Переназначает порядок кнопок одного экрана по списку их ID. ID, не принадлежащие экрану, молча пропускаются. Требует функции экранов.

ПараметрОбязательныйОписание
screenID экрана
orderID кнопок через запятую в желаемом порядке
{ "status": "ok" }
ОшибкаЗначение
funcscreen равен 0 либо список order пуст
accessЭкран не принадлежит вам
screensФункция экранов не включена на тарифе

CAS-защита

POST /api/camp/cas.json

Включает или выключает CAS-защиту кампании — автокик вступающих, числящихся в списке банов CAS. Включение требует функции экранов на вашем тарифе (та же функция, что и для экранов); выключение разрешено всегда.

ПараметрОбязательныйОписание
idID кампании
cas_ban1 — включить защиту, 0 — выключить (поле должно присутствовать)
{ "status": "ok", "cas_ban": 1 }
ОшибкаЗначение
funcid равен 0 либо cas_ban не передан
accessКампания не принадлежит вам
screensФункция экранов не включена на тарифе (только при включении) — повысьте тариф

Запустить чистку группы

POST /api/camp/clean.json

Запускает чистку группы: собирает наблюдаемую базу участников (вступившие лиды, оставшиеся в чате ∪ участники из журнала, числящиеся как присутствующие) в очередь и ставит задачу, которую разбирает наш бэкенд. Одновременно может идти только одна чистка на кампанию. Требует функции экранов на вашем тарифе.

ПараметрОбязательныйОписание
idID кампании
{ "status": "ok", "clean_id": 5, "total": 842, "state": 0 }

Если проверять некого, задача завершается сразу: {"status":"ok","clean_id":5,"total":0,"state":1}.

stateЗначение
0Выполняется
1Завершена
ОшибкаЗначение
screensФункция экранов не включена на тарифе — повысьте тариф
funcid равен 0
accessКампания не принадлежит вам
runningЧистка этой кампании уже выполняется

Статус чистки

GET /api/camp/clean.json

Возвращает последнюю задачу чистки кампании для опроса прогресса. Чтение статуса функцией экранов не ограничено (в отличие от запуска чистки).

ПараметрОбязательныйОписание
idID кампании

Если чистка никогда не запускалась:

{ "status": "ok", "exists": false }

Если задача есть:

{
  "status": "ok",
  "exists": true,
  "state": 0,
  "total": 842,
  "checked": 310,
  "kicked_cas": 4,
  "kicked_dead": 12,
  "failed": 1,
  "started": 1750000000,
  "finished": 0
}
ПолеЗначение
state0 выполняется, 1 завершена
total / checkedВсего участников в базе / уже проверено
kicked_casКикнуто по списку CAS
kicked_deadКикнуто как удалённые/неактивные аккаунты
failedНе удалось проверить
started / finishedUnix-время старта и завершения (0 для незавершённого)
ОшибкаЗначение
funcid равен 0
accessКампания не принадлежит вам

Загрузить медиа

POST /api/media/upload.json

Загружает изображение или видео для приветственного сообщения кампании, экрана, дожима или рассылки. Возвращает ссылку на медиа и код типа для сохранения через camp/add, camp/edit, screen/* и т. д.

Отправляйте как multipart/form-data, файл — в поле file. Допустимые форматы: jpg, jpeg, png, webp, gif (фото) и mp4, mov, webm (видео); документы не принимаются. Размер ограничен (по умолчанию ~20 МиБ). Лимит — 20 загрузок в час на аккаунт.

{ "status": "ok", "media": "17/abc123.jpg", "media_type": 1 }

media — путь относительно медиа-каталога (его и нужно сохранять в кампанию/экран). media_type — код типа: 1 фото, 2 видео; передавайте его вместе с media.

ОшибкаЗначение
funcФайл не передан (нет части file) либо ошибка сохранения
typeНедопустимый формат файла (не из списка фото/видео)
sizeФайл превышает лимит размера
busyПревышен лимит 20 загрузок в час