Campaigns API — Кампании, Шаблоны, Потоки
Справочник API кампаний: создание, запуск, A/B тесты, Flow Builder, триггеры.
Обзор модуля кампаний
Модуль кампаний Trigly охватывает полный цикл маркетинговых коммуникаций: от создания шаблона до анализа результатов. Он включает 80 эндпоинтов, распределённых по 7 подмодулям.
Подмодули:
| Подмодуль | Эндпоинты | Описание |
|---|---|---|
| Кампании | 37 | CRUD, запуск, статистика, AI, аналитика |
| Шаблоны | 11 | CRUD, библиотека, предпросмотр |
| Потоки (Flows) | 14 | Journey Builder, DAG-движок |
| A/B тесты | 5 | Сплит-тестирование, выбор победителя |
| Триггеры | 7 | Событийные рассылки |
| Трекинг | 4 | Пиксель, клики, отписка |
| Webhooks | 5 | Исходящие уведомления |
Базовый URL: https://api.trigly.ru/api/v1
Кампании
Типы кампаний
| Тип | Описание |
|---|---|
one_time |
Разовая рассылка по сегменту |
recurring |
Повторяющаяся по cron-расписанию |
triggered |
Запускается при наступлении события |
Жизненный цикл кампании
draft → scheduled → running → completed
↓
paused → running
↓
failed
Создание кампании
POST /api/v1/campaigns
{
"name": "Весенняя распродажа 2026",
"channel": "email",
"campaign_type": "one_time",
"segment_id": "SEGMENT_UUID",
"template_id": "TEMPLATE_UUID",
"subject": "Скидки до 50% — только 3 дня! 🔥",
"scheduled_at": "2026-03-25T10:00:00Z",
"tags": ["весна", "распродажа"],
"folder": "Промо"
}
Каналы: email, sms, telegram, whatsapp, push
Дополнительные поля для омниканальных кампаний:
{
"fallback_channels": ["email", "telegram", "sms"],
"send_local_time": "10:00"
}
fallback_channels— цепочка каналов: если первый не доступен, Trigly попробует следующийsend_local_time— отправка по местному времени получателя (на основеcustomer.timezone)
Повторяющаяся кампания
{
"name": "Еженедельный дайджест",
"channel": "email",
"campaign_type": "recurring",
"segment_id": "SEGMENT_UUID",
"template_id": "TEMPLATE_UUID",
"subject": "Ваш дайджест за неделю",
"cron_expression": "0 10 * * 1"
}
Поддерживается стандартный cron-формат (5 полей). Celery beat проверяет расписание каждые 60 секунд.
Список кампаний
GET /api/v1/campaigns?page=1&per_page=20&status=running&channel=email
Параметры фильтрации:
| Параметр | Описание |
|---|---|
status |
draft, scheduled, running, paused, completed, failed |
channel |
email, sms, telegram, whatsapp, push |
campaign_type |
one_time, recurring, triggered |
folder |
Имя папки |
search |
Поиск по названию |
Запуск кампании
POST /api/v1/campaigns/{campaign_id}/launch
curl -X POST https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/launch \
-H "Authorization: Bearer $TOKEN"
Ответ:
{
"id": "CAMPAIGN_ID",
"status": "running",
"total_recipients": 1543,
"started_at": "2026-03-20T10:00:00Z"
}
При запуске Trigly:
- Загружает получателей из сегмента
- Исключает отписанных и подавленных контактов
- Проверяет частотные ограничения (frequency capping)
- Рендерит шаблон для каждого получателя (Jinja2)
- Отправляет пакетами по 50 через канальный адаптер
- Логирует каждое сообщение в PostgreSQL
Пауза и возобновление
# Пауза
curl -X POST https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/pause \
-H "Authorization: Bearer $TOKEN"
# Возобновление
curl -X POST https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/resume \
-H "Authorization: Bearer $TOKEN"
Клонирование кампании
POST /api/v1/campaigns/{campaign_id}/clone
Создаёт копию кампании в статусе draft с суффиксом « (копия)» в названии.
Статистика кампании
GET /api/v1/campaigns/{campaign_id}/stats
{
"total_recipients": 1543,
"sent": 1540,
"delivered": 1498,
"opened": 734,
"clicked": 189,
"bounced": 42,
"failed": 3,
"suppressed": 12,
"open_rate": 49.0,
"click_rate": 12.6,
"bounce_rate": 2.8
}
Список сообщений кампании
GET /api/v1/campaigns/{campaign_id}/messages?page=1&per_page=50&status=delivered
Тестовая отправка
POST /api/v1/campaigns/{campaign_id}/test-send
{
"email": "test@company.ru"
}
Отправляет одно тестовое сообщение на указанный адрес, не затрагивая статистику кампании.
AI-генерация контента
# Генерация вариантов темы
curl -X POST https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/ai/generate-copy \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"prompt": "промо-рассылка для интернет-магазина обуви"}'
# AI-оценка темы
curl -X POST https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/ai/score-subject \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"subject": "Скидки 50% на кроссовки — только 3 дня!"}'
# Предсказание эффективности
curl -X POST https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/ai/predict-performance \
-H "Authorization: Bearer $TOKEN"
# Оптимальное время отправки
curl https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/ai/optimize-send-times \
-H "Authorization: Bearer $TOKEN"
# Рекомендация сегмента
curl https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/ai/recommend-segment \
-H "Authorization: Bearer $TOKEN"
Аналитика кампаний
# Сравнение кампаний
curl "https://api.trigly.ru/api/v1/campaigns/analytics/compare?campaign_ids=id1,id2,id3" \
-H "Authorization: Bearer $TOKEN"
# Выручка
curl "https://api.trigly.ru/api/v1/campaigns/analytics/revenue?period=30d" \
-H "Authorization: Bearer $TOKEN"
# Тепловая карта открытий
curl "https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/analytics/heatmap" \
-H "Authorization: Bearer $TOKEN"
# Доставляемость
curl "https://api.trigly.ru/api/v1/campaigns/analytics/deliverability?period=30d" \
-H "Authorization: Bearer $TOKEN"
# Когортный анализ
curl "https://api.trigly.ru/api/v1/campaigns/analytics/cohort?period=90d" \
-H "Authorization: Bearer $TOKEN"
# Календарь рассылок
curl "https://api.trigly.ru/api/v1/campaigns/analytics/calendar?month=2026-03" \
-H "Authorization: Bearer $TOKEN"
Оценка стоимости кампании
POST /api/v1/campaigns/{campaign_id}/estimate-cost
Рассчитывает предварительную стоимость на основе количества получателей и канала. Учитывает сегментацию SMS и стоимость шаблонов WhatsApp.
Умное расписание
POST /api/v1/campaigns/{campaign_id}/schedule-smart
AI анализирует исторические данные об открытиях и рекомендует оптимальное время отправки.
Шаблоны
Создание шаблона
POST /api/v1/templates
{
"name": "Промо — скидка на обувь",
"channel": "email",
"subject": "{{ first_name }}, ваша скидка {{ discount }}% ждёт!",
"body_html": "<div style='font-family: Arial'><h1>Привет, {{ first_name }}!</h1><p>Мы приготовили для вас скидку <b>{{ discount }}%</b> на {{ category }}.</p><p>Промокод: <code>{{ promo_code }}</code></p><a href='{{ shop_url }}'>Перейти в магазин</a></div>",
"body_text": "Привет, {{ first_name }}! Скидка {{ discount }}% на {{ category }}. Промокод: {{ promo_code }}. {{ shop_url }}",
"variables": ["first_name", "discount", "category", "promo_code", "shop_url"]
}
Шаблонизатор
Trigly использует Jinja2 SandboxedEnvironment. Доступные возможности:
Переменные контакта:
| Переменная | Описание |
|---|---|
{{ first_name }} |
Имя |
{{ last_name }} |
Фамилия |
{{ email }} |
|
{{ city }} |
Город |
{{ phone }} |
Телефон |
{{ custom_fields.KEY }} |
Произвольные поля |
Встроенные фильтры:
| Фильтр | Пример | Результат |
|---|---|---|
currency |
{{ 4990 | currency }} |
4 990 ₽ |
date_format |
{{ date | date_format('%d.%m.%Y') }} |
20.03.2026 |
Условия и циклы:
{% if total_orders > 5 %}
<p>Спасибо за лояльность! Ваша персональная скидка — 15%.</p>
{% else %}
<p>Добро пожаловать! Промокод WELCOME10 для первого заказа.</p>
{% endif %}
Предпросмотр шаблона
POST /api/v1/templates/{template_id}/preview
{
"variables": {
"first_name": "Иван",
"discount": 20,
"category": "кроссовки",
"promo_code": "SPRING20"
}
}
Омниканальный предпросмотр
POST /api/v1/templates/{template_id}/preview-omni
Показывает как шаблон будет выглядеть во всех каналах: email (HTML), Telegram (Markdown), SMS (plain text), WhatsApp (template), Push (title + body).
Библиотека готовых шаблонов
GET /api/v1/templates/library
15 готовых шаблонов: welcome, promo, cart_abandoned, order_confirmation, shipping, review_request, birthday, reactivation, newsletter, flash_sale, loyalty_points, referral, survey, win_back, seasonal.
Потоки (Flows) — Journey Builder
Потоки позволяют создавать автоматизированные цепочки коммуникаций с DAG-движком (направленный ациклический граф).
Создание потока
POST /api/v1/campaigns/flows
{
"name": "Welcome-серия",
"trigger_type": "event",
"trigger_config": {
"event_name": "signup"
},
"steps": [
{
"id": "step_1",
"type": "send_email",
"config": {
"template_id": "TEMPLATE_UUID",
"subject": "Добро пожаловать!"
},
"next": ["step_2"]
},
{
"id": "step_2",
"type": "wait",
"config": {"duration": "2d"},
"next": ["step_3"]
},
{
"id": "step_3",
"type": "condition",
"config": {
"field": "total_orders",
"operator": "greater_than",
"value": 0
},
"next_true": ["step_4_yes"],
"next_false": ["step_4_no"]
},
{
"id": "step_4_yes",
"type": "send_email",
"config": {
"template_id": "THANKS_TEMPLATE",
"subject": "Спасибо за первый заказ!"
},
"next": []
},
{
"id": "step_4_no",
"type": "send_telegram",
"config": {
"text": "Привет! У нас есть промокод FIRST10 для вашего первого заказа 🎁"
},
"next": []
}
],
"settings": {
"exit_on_goal": true,
"goal_event": "purchase",
"max_duration_days": 30
}
}
Типы шагов
| Шаг | Описание |
|---|---|
send_email |
Отправка email |
send_sms |
Отправка SMS |
send_telegram |
Отправка в Telegram |
send_whatsapp |
Отправка WhatsApp |
send_push |
Web Push уведомление |
smart_send |
AI выбирает лучший канал |
channel_switch |
Условный выбор канала |
wait |
Задержка (1h, 2d, 1w) |
condition |
Ветвление по условию |
update_contact |
Обновление полей контакта |
add_tag |
Добавление тега |
remove_tag |
Удаление тега |
exit |
Завершение потока |
Активация и управление
# Активация
curl -X POST https://api.trigly.ru/api/v1/campaigns/flows/FLOW_ID/activate \
-H "Authorization: Bearer $TOKEN"
# Пауза
curl -X POST https://api.trigly.ru/api/v1/campaigns/flows/FLOW_ID/pause \
-H "Authorization: Bearer $TOKEN"
# Архивация
curl -X POST https://api.trigly.ru/api/v1/campaigns/flows/FLOW_ID/archive \
-H "Authorization: Bearer $TOKEN"
Пресеты потоков
GET /api/v1/campaigns/flows/presets
5 готовых пресетов:
| Пресет | Описание |
|---|---|
abandoned_cart |
Брошенная корзина: напоминание через 1ч, скидка через 24ч |
welcome |
Welcome-серия из 3 писем |
reactivation |
Реактивация неактивных (email → telegram → SMS) |
birthday |
Поздравление с ДР + промокод |
post_purchase |
Пост-покупка: благодарность → отзыв → допродажа |
Статистика потока
GET /api/v1/campaigns/flows/FLOW_ID/stats
Выполнения потока
GET /api/v1/campaigns/flows/FLOW_ID/executions?page=1&per_page=20
Тестирование потока
POST /api/v1/campaigns/flows/FLOW_ID/test
{
"customer_id": "CUSTOMER_UUID"
}
A/B тесты
Создание A/B теста
POST /api/v1/campaigns/ab-tests
{
"campaign_id": "CAMPAIGN_UUID",
"test_percentage": 20,
"winner_criteria": "open_rate",
"auto_select_winner": true,
"min_sample_size": 100,
"variants": [
{
"name": "Вариант A",
"subject": "Скидки до 50% — только сегодня!",
"template_id": "TEMPLATE_A_UUID",
"weight": 50
},
{
"name": "Вариант B",
"subject": "🔥 Последний шанс: -50% на всё",
"template_id": "TEMPLATE_B_UUID",
"weight": 50
}
]
}
Критерии выбора победителя
| Критерий | Описание |
|---|---|
open_rate |
Процент открытий |
click_rate |
Процент кликов |
conversion_rate |
Процент конверсий |
Ручной выбор победителя
POST /api/v1/campaigns/ab-tests/{test_id}/select-winner
{
"variant_id": "VARIANT_A_UUID"
}
При выборе победителя оставшиеся 80% аудитории получают победивший вариант.
Байесовский анализ
Trigly использует байесовский подход с Beta-распределениями и методом Монте-Карло (10 000 симуляций) для определения статистической значимости результатов.
Триггеры
Создание триггера
POST /api/v1/campaigns/triggers
{
"campaign_id": "CAMPAIGN_UUID",
"name": "Покупка — благодарность",
"event_type": "purchase",
"conditions": {
"revenue": {"operator": "greater_than", "value": 1000}
},
"delay_seconds": 3600,
"is_active": true,
"priority": 10,
"max_triggers_per_contact": 1,
"cooldown_seconds": 86400
}
Параметры триггера
| Параметр | Описание |
|---|---|
event_type |
Тип события, на которое реагирует триггер |
conditions |
Условия фильтрации свойств события |
delay_seconds |
Задержка перед отправкой (для branding campaigns) |
priority |
Приоритет (выше — важнее, при конкуренции триггеров) |
max_triggers_per_contact |
Максимальное количество срабатываний на контакт |
cooldown_seconds |
Минимальный интервал между срабатываниями |
Активация/деактивация
curl -X POST https://api.trigly.ru/api/v1/campaigns/triggers/TRIGGER_ID/activate \
-H "Authorization: Bearer $TOKEN"
curl -X POST https://api.trigly.ru/api/v1/campaigns/triggers/TRIGGER_ID/deactivate \
-H "Authorization: Bearer $TOKEN"
Ручное срабатывание
POST /api/v1/campaigns/triggers/{trigger_id}/fire
{
"customer_id": "CUSTOMER_UUID",
"event_data": {
"revenue": 5990,
"product": "Кроссовки"
}
}
Трекинг (публичные эндпоинты)
Эти эндпоинты не требуют аутентификации — они используются в email-сообщениях.
Пиксель открытия
GET /api/v1/campaigns/track/pixel?message_id=MSG_UUID
Возвращает прозрачный 1x1 GIF. Обновляет статус сообщения на opened и увеличивает счётчик открытий кампании.
Отслеживание кликов
GET /api/v1/campaigns/track/click?tracking_id=TRACK_UUID
Редирект на оригинальный URL. Обновляет статус сообщения на clicked и увеличивает total_clicks у TrackedLink.
Отписка
GET /api/v1/campaigns/track/unsubscribe?message_id=MSG_UUID
Устанавливает is_unsubscribed = true для контакта и показывает страницу подтверждения отписки.
Статистика трекинга
GET /api/v1/campaigns/track/stats?campaign_id=CAMPAIGN_UUID
Исходящие Webhooks
Создание webhook
POST /api/v1/campaigns/webhooks
{
"url": "https://myapp.ru/webhooks/trigly",
"event_types": ["message.sent", "message.delivered", "message.opened", "message.clicked", "message.bounced"],
"secret": "my_webhook_secret_key",
"is_active": true
}
Подпись запросов
Trigly подписывает каждый webhook HMAC-SHA256. Заголовок X-Trigly-Signature содержит hex-дайджест тела запроса.
Проверка подписи:
import hmac
import hashlib
def verify_webhook(body: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature)
Повторные попытки
Если ваш сервер отвечает кодом >= 400 или не отвечает в течение 10 секунд, Trigly повторит запрос до 3 раз с экспоненциальной задержкой.
Frequency Capping
Trigly ограничивает частоту отправки на уровне контакта для предотвращения спама:
| Ограничение | Лимит |
|---|---|
| В день | 3 сообщения на контакт |
| В неделю | 10 сообщений на контакт |
| В месяц | 30 сообщений на контакт |
| Тихие часы | 22:00 — 09:00 (по часовому поясу контакта) |
Rate limiting на уровне организации:
| Канал | Лимит в минуту |
|---|---|
| Email (SMTP) | 100 |
| Email (Unisender) | 50 |
| Telegram | 30 |
| SMS | 100 |
| 80 | |
| Push | 100 |
Проверка и управление:
# Проверить можно ли отправить контакту
curl "https://api.trigly.ru/api/v1/campaigns/frequency/check?customer_id=CUSTOMER_ID" \
-H "Authorization: Bearer $TOKEN"
Все счётчики хранятся в Redis и обнуляются при сбросе Redis. Это не влияет на безопасность, так как после сброса лимиты просто начинают считаться заново.
Не нашли ответ?
Swagger UI с интерактивной документацией и поддержка в Telegram.