Channels API Reference — Омниканальные коммуникации
Полная документация API каналов Trigly: настройка Email, SMS, Telegram, WhatsApp, Push. Аналитика, бюджеты, smart-select.
Обзор модуля Channels
Модуль Channels обеспечивает омниканальную доставку сообщений через 6 адаптеров: Email (SMTP/Unisender), SMS (SMS.ru), Telegram (Bot API), WhatsApp (Cloud API), Web Push (VAPID). API предоставляет 38 эндпоинтов для настройки каналов, аналитики, бюджетов и умного выбора каналов.
Базовые URL:
- Конфигурация и аналитика:
/api/v1/channels - Провайдерские вебхуки:
/hooks/ - SDK:
/api/v1/sdk/
Конфигурация каналов
Модель ChannelConfig
| Поле | Тип | Описание |
|---|---|---|
id |
UUID | Уникальный идентификатор |
channel_type |
ChannelType | email, sms, telegram, whatsapp, push |
provider |
string | smtp, unisender, sms_ru, telegram_bot, whatsapp_cloud, webpush |
credentials |
JSONB | Креденшлы провайдера (api_key, bot_token и т.д.) |
is_active |
bool | Канал активен |
is_verified |
bool | Канал проверен и работоспособен |
sender_name |
string | Имя отправителя |
sender_address |
string | Адрес отправителя (email, номер телефона) |
daily_limit |
int | Дневной лимит сообщений |
monthly_limit |
int | Месячный лимит |
monthly_budget |
float | Месячный бюджет (в рублях) |
monthly_spent |
float | Потрачено в текущем месяце |
total_sent |
int | Всего отправлено |
settings |
JSONB | Дополнительные настройки |
last_error |
string | Последняя ошибка |
last_used_at |
datetime | Время последнего использования |
Уникальное ограничение: одна конфигурация на (organization_id, channel_type).
Подключение канала
POST /api/v1/channels/connect
Authorization: Bearer {token}
Content-Type: application/json
Email (SMTP)
{
"channel_type": "email",
"provider": "smtp",
"credentials": {
"host": "smtp.yandex.ru",
"port": 465,
"username": "noreply@company.ru",
"password": "app-password",
"use_tls": true
},
"sender_name": "Компания",
"sender_address": "noreply@company.ru"
}
Email (Unisender)
{
"channel_type": "email",
"provider": "unisender",
"credentials": {
"api_key": "your-unisender-api-key"
},
"sender_name": "Компания",
"sender_address": "noreply@company.ru"
}
SMS (SMS.ru)
{
"channel_type": "sms",
"provider": "sms_ru",
"credentials": {
"api_id": "your-sms-ru-api-id"
},
"sender_name": "COMPANY"
}
Telegram (Bot API)
{
"channel_type": "telegram",
"provider": "telegram_bot",
"credentials": {
"bot_token": "123456:ABC-DEF..."
}
}
При подключении Telegram Trigly автоматически:
- Вызывает
getMeдля проверки токена и получения имени бота - Устанавливает вебхук через
setWebhookна/hooks/telegram/{org_id} - Помечает канал как
is_verified = true
WhatsApp (Cloud API)
{
"channel_type": "whatsapp",
"provider": "whatsapp_cloud",
"credentials": {
"access_token": "your-meta-access-token",
"phone_number_id": "123456789",
"business_account_id": "987654321"
}
}
Web Push (VAPID)
{
"channel_type": "push",
"provider": "webpush"
}
VAPID-ключи генерируются автоматически при подключении push-канала и сохраняются в credentials.
Тестирование соединения
POST /api/v1/channels/{channel_id}/test
Authorization: Bearer {token}
Выполняет health check адаптера: проверяет подключение, валидность креденшлов, доступность API провайдера. Возвращает:
{
"healthy": true,
"provider": "telegram_bot",
"latency_ms": 145,
"details": {
"bot_name": "MyCompanyBot",
"bot_username": "my_company_bot"
}
}
CRUD-операции
GET /api/v1/channels — Список каналов организации
GET /api/v1/channels/{id} — Получить конфигурацию канала
PATCH /api/v1/channels/{id} — Обновить настройки
DELETE /api/v1/channels/{id} — Удалить канал
POST /api/v1/channels/{id}/health — Health check
GET /api/v1/channels/available — Доступные каналы для подключения
Умный выбор канала (Smart Select)
Trigly анализирует данные ClickHouse за последние 90 дней для каждого контакта и рекомендует оптимальный канал на основе engagement-скоринга.
Формула скоринга
score = (opens / delivered) × 0.4 + (clicks / delivered) × 0.6
Эндпоинты
GET /api/v1/channels/smart-select/{customer_id}
Ответ:
{
"customer_id": "uuid",
"recommended_channel": "telegram",
"scores": {
"email": 0.35,
"telegram": 0.82,
"sms": 0.15,
"push": 0.45
},
"reason": "Наивысший engagement в Telegram (82% взаимодействий)"
}
POST /api/v1/channels/smart-select/bulk
{
"segment_id": "uuid-сегмента"
}
Массовый выбор канала для всех контактов сегмента.
Бюджет и стоимость
Стоимость по каналам
| Канал | Провайдер | Стоимость |
|---|---|---|
| SMTP | Бесплатно | |
| Unisender | 0.1-0.5 руб./письмо | |
| SMS | SMS.ru | 2.5 руб./сегмент |
| Telegram | Bot API | Бесплатно |
| Cloud API | 5-8 руб./шаблонное сообщение | |
| Push | VAPID | Бесплатно |
Управление бюджетом
GET /api/v1/channels/{id}/budget
Ответ:
{
"channel_type": "sms",
"monthly_budget": 50000,
"monthly_spent": 32500,
"remaining": 17500,
"usage_percent": 65.0,
"forecast_monthly": 48750,
"will_exceed": false,
"daily_average": 1083.33
}
При достижении 80% бюджета генерируется предупреждение. При 100% канал автоматически переключается на бесплатную альтернативу (если настроена fallback-цепочка).
Оценка стоимости кампании
POST /api/v1/channels/cost/estimate
{
"channel": "sms",
"segment_id": "uuid-сегмента",
"message_text": "Текст SMS-сообщения для оценки количества сегментов"
}
Ответ:
{
"channel": "sms",
"recipients": 5000,
"segments_per_message": 2,
"cost_per_message": 5.0,
"total_cost": 25000.0,
"within_budget": true
}
Адаптация контента
ContentAdapterService автоматически адаптирует один HTML-шаблон для каждого канала:
POST /api/v1/channels/preview/omni
{
"template_id": "uuid-шаблона",
"customer_id": "uuid-контакта"
}
Ответ:
{
"email": {
"subject": "Скидки для Ивана!",
"body_html": "<h1>Привет, Иван!</h1>...",
"tracking_pixel": true,
"links_rewritten": true
},
"telegram": {
"text": "**Привет, Иван!**\n\nСкидки до 50%...",
"parse_mode": "Markdown",
"photo_url": "https://example.com/banner.jpg",
"inline_keyboard": [
[{"text": "Перейти в магазин", "url": "https://shop.example.com"}]
]
},
"sms": {
"text": "Privet, Ivan! Skidki do 50%. shop.example.com STOP",
"segments": 2,
"transliterated": true
},
"whatsapp": {
"template_name": "promo_discount",
"variables": ["Иван", "50%"]
},
"push": {
"title": "Скидки для Ивана!",
"body": "Скидки до 50% на весеннюю коллекцию",
"icon": "https://example.com/icon.png",
"url": "https://shop.example.com"
}
}
Правила адаптации:
- Email: HTML as-is + трекинг-пиксель + перезапись ссылок
- Telegram: HTML → Markdown, извлечение фото, inline-кнопки, макс. 4096 символов
- SMS: HTML → plain text, транслитерация, суффикс «СТОП», макс. 320 символов
- WhatsApp: маппинг переменных в HSM-шаблон
- Push: заголовок 50 символов, тело 100 символов, иконка, URL действия
Fallback-цепочки
Если основной канал недоступен (ошибка отправки, бюджет исчерпан, контакт отписан), Trigly автоматически пробует следующий канал из цепочки.
Настройка при создании кампании:
{
"channel": "email",
"fallback_channels": ["telegram", "sms"]
}
Логика:
- Попытка отправки через email
- При неудаче — отправка через Telegram
- При неудаче — отправка через SMS
- Все попытки логируются в ClickHouse
delivery_events
Аналитика каналов
7 аналитических эндпоинтов на основе ClickHouse:
GET /api/v1/channels/analytics/dashboard — Общая сводка по каналам
GET /api/v1/channels/analytics/compare — Сравнение каналов
GET /api/v1/channels/analytics/timeline — Временная шкала доставки
GET /api/v1/channels/analytics/funnel — Воронка доставки
GET /api/v1/channels/analytics/costs — Отчёт по затратам
GET /api/v1/channels/analytics/errors — Анализ ошибок
GET /api/v1/channels/analytics/health-timeline — Здоровье каналов во времени
Dashboard
GET /api/v1/channels/analytics/dashboard?period=30d
Ответ:
{
"channels": [
{
"channel": "email",
"total_sent": 125000,
"delivered": 122000,
"opened": 36600,
"clicked": 7320,
"delivery_rate": 97.6,
"open_rate": 30.0,
"click_rate": 6.0,
"total_cost": 12500.0
}
],
"period": "30d"
}
Воронка доставки
GET /api/v1/channels/analytics/funnel?channel=email&period=30d
{
"channel": "email",
"funnel": [
{"stage": "sent", "count": 125000, "rate": 100},
{"stage": "delivered", "count": 122000, "rate": 97.6},
{"stage": "opened", "count": 36600, "rate": 30.0},
{"stage": "clicked", "count": 7320, "rate": 6.0},
{"stage": "converted", "count": 1830, "rate": 1.5}
]
}
Виджеты подписки
Модель SubscriptionWidget
| Поле | Тип | Описание |
|---|---|---|
name |
string | Название виджета |
widget_type |
enum | popup, inline, floating |
channels |
JSONB | Каналы для подписки |
design |
JSONB | Дизайн (title, colors, position) |
targeting_rules |
JSONB | Правила показа (pages, delay, scroll) |
is_active |
bool | Активен |
total_views |
int | Всего показов |
total_subscriptions |
int | Всего подписок |
CRUD виджетов
POST /api/v1/channels/widgets — Создать виджет
GET /api/v1/channels/widgets — Список виджетов
GET /api/v1/channels/widgets/{id} — Получить виджет
PATCH /api/v1/channels/widgets/{id} — Обновить
DELETE /api/v1/channels/widgets/{id} — Удалить
Telegram Deep Links
Для привязки Telegram-аккаунта к контакту CDP используются deep links с HMAC-подписью:
POST /api/v1/channels/telegram-link/{customer_id}
Authorization: Bearer {token}
Ответ:
{
"link": "https://t.me/your_bot?start=base64_hmac_token",
"expires_at": "2026-03-21T12:00:00Z"
}
Токен содержит org_id:customer_id:timestamp, подписан HMAC-SHA256. Срок действия — 24 часа. При переходе по ссылке пользователь открывает бота, отправляет /start, и Trigly автоматически привязывает telegram_chat_id к контакту.
Celery-задачи каналов
| Задача | Расписание | Описание |
|---|---|---|
update_preferred_channels |
Ежедневно 4:00 | ClickHouse 90-day engagement → Customer.preferred_channel |
reset_monthly_budgets |
1-е число месяца | Сброс monthly_spent = 0 для всех конфигураций |
Коды ошибок
| HTTP-код | Описание |
|---|---|
| 400 | Некорректные параметры (невалидный провайдер, неверные креденшлы) |
| 404 | Канал не найден |
| 409 | Канал уже подключён (уникальное ограничение org_id + channel_type) |
| 429 | Превышен rate limit (500/мин) |
| 503 | Провайдер недоступен (health check failed) |
Не нашли ответ?
Swagger UI с интерактивной документацией и поддержка в Telegram.