Документация API

API Trafsly для интеграции Telegram-ботов: получение заданий обязательной подписки, проверка выполнения, баланс рекламодателя, статистика и вебхуки внешних провайдеров.

Base URL: https://api.trafsly.com JSON API Header auth: Auth v0.2.0

Все эндпоинты защищены API-токеном бота из вашего кабинета в @TrafslyBot. Запросы и ответы — JSON в UTF-8, время в ISO 8601.

Авторизация

Передавайте API-токен из настроек вашего бота в заголовке каждого запроса. Токен начинается с префикса at_.

Auth: at_xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
Внимание. Не публикуйте API-токен в открытом коде. Каждый токен привязан к конкретному боту-публишеру. Утечка токена позволит злоумышленнику отправлять запросы от вашего имени и списывать с баланса.

Где взять токен

Откройте @TrafslyBot → меню Мои боты → выберите бот → API-токен.

Получить задания

POST /api/v1/get-sponsors SDK

Возвращает список спонсорских заданий (каналы и боты для подписки) для пользователя. Если у пользователя нет невыполненных заданий, бот может пропускать его в основной флоу.

Request Body

{
  "user_id": 123456789,
  "chat_id": 123456789,
  "first_name": "Иван",
  "username": "ivan_durov",
  "language_code": "ru",
  "is_premium": false,
  "max_sponsors": 5,
  "action": "subscribe"
}
ПараметрТипОбязательноОписание
user_idintegerДаTelegram ID пользователя
chat_idintegerНетTelegram ID чата (если запрос идёт из группы)
first_namestringНетИмя пользователя для персонализации
usernamestringНетUsername пользователя без @
language_codestringНетЛокаль пользователя. По умолчанию "ru"
is_premiumbooleanНетЕсть ли Telegram Premium. По умолчанию false
max_sponsorsintegerНетСколько заданий вернуть. По умолчанию — из настроек бота
actionstringНетКонтекст запроса. По умолчанию "subscribe"

Response — у пользователя нет невыполненных заданий

{
  "status": "ok",
  "sponsors": [],
  "message": "User can proceed"
}

Response — есть задания для выполнения

{
  "status": "warning",
  "sponsors": [
    {
      "ads_id": 10421,
      "link": "https://t.me/cryptonews",
      "resource_type": "channel",
      "title": "Crypto News",
      "status": "unsubscribed"
    },
    {
      "ads_id": 10422,
      "link": "https://t.me/SomeBot?start=ref_xyz",
      "resource_type": "bot",
      "title": "Some Bot",
      "status": "unsubscribed"
    }
  ]
}
Логика на стороне бота. При status: "warning" покажите юзеру список sponsors с кнопками «Подписаться» (ведут на link) и кнопкой «Я подписался». По нажатию вызывайте /confirm-subscription для каждого ads_id.

Через API возвращаются только наши собственные задания Trafsly — никаких сторонних рекламных сетей в SDK-флоу нет.

cURL

curl -X POST https://api.trafsly.com/api/v1/get-sponsors \
  -H "Auth: at_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"user_id": 123456789, "max_sponsors": 5}'

Python (requests)

import requests

resp = requests.post(
    "https://api.trafsly.com/api/v1/get-sponsors",
    headers={"Auth": "at_xxxxxxxx", "Content-Type": "application/json"},
    json={"user_id": 123456789, "max_sponsors": 5},
)
data = resp.json()
if data["status"] == "ok":
    # допускаем пользователя дальше
    pass
else:
    for sponsor in data["sponsors"]:
        print(sponsor["link"])

Node.js (fetch)

const res = await fetch("https://api.trafsly.com/api/v1/get-sponsors", {
  method: "POST",
  headers: {
    "Auth": "at_xxxxxxxx",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ user_id: 123456789, max_sponsors: 5 }),
});
const data = await res.json();

Подтвердить подписку

POST /api/v1/confirm-subscription SDK

Вызывайте этот эндпоинт после того, как пользователь нажал «Я подписался» в вашем боте. Trafsly проверит факт подписки через getChatMember и зачислит вознаграждение за выполненное задание на ваш баланс (если подписка реальна).

Request Body

{
  "user_id": 123456789,
  "ads_id": 10421
}
ПараметрТипОбязательноОписание
user_idintegerДаTelegram ID пользователя
ads_idintegerДаID задания из /get-sponsors

Response — успех

{
  "status": "ok",
  "subscribed": true,
  "credited": 1.10,
  "message": "Subscription confirmed"
}

Response — пользователь не подписался

{
  "status": "warning",
  "subscribed": false,
  "message": "User is not subscribed"
}
Антифрод. Если пользователь отпишется от канала в течение суток после подтверждения, начисление будет автоматически списано — Trafsly мониторит подписки и сторнирует выплаты по «накруточным» юзерам.

Таргетинг

Рекламодатели могут настроить таргетинг заказов по 21 фильтру в @TrafslyBot. API автоматически фильтрует задания: пользователь получит только те, чьи фильтры совпадают с его профилем.

Как это работает

При вызове /get-sponsors передавайте данные пользователя Telegram. API сопоставит их с фильтрами каждого заказа и вернёт только подходящие задания.

Важно. Чем больше данных вы передаёте, тем точнее таргетинг. Минимум — user_id. Для полной фильтрации передавайте все доступные поля.

Поля для таргетинга в /get-sponsors

ПараметрКакие фильтры используетПример
language_codeЯзыки"ru", "en", "uk"
is_premiumTelegram Premiumtrue / false
first_nameНаличие имени, кириллица, пол"Иван"
usernameНаличие юзернейма"ivan_durov"

Дополнительные данные из профиля

Если пользователь ранее проходил через smart-link Trafsly, в его профиле могут быть:

ПолеФильтры
Страна / городГеотаргетинг (Россия, Москва и т.д.)
Тип устройстваСмартфон / Десктоп / Планшет
ОСAndroid / iOS / Windows / macOS
Возраст аккаунтаМинимальный возраст (2-9 лет)
РейтингМинимальный уровень (1-10)

Эти данные собираются автоматически и используются при фильтрации, если доступны. SDK-боту не нужно их передавать.

Категории фильтров

География

  • Языки интерфейса
  • Страна (с коэффициентом)
  • Город (с коэффициентом)

Профиль

  • Возраст пользователя (с коэффициентом)
  • Пол (эвристика по имени)
  • Возраст аккаунта (с коэффициентом)

Устройство

  • Тип устройства (с коэффициентом)
  • ОС (с коэффициентом)
  • Telegram Premium

Наличие параметров

  • Фото / Реальное фото
  • Имя / Юзернейм / Био
  • Аудио-описание

Настройки имени

  • Русское имя
  • Кириллица в имени

Качество аккаунта

  • Рейтинг (с коэффициентом)
  • Подарки (с коэффициентом)

Логика фильтрации

  • Strict mismatch: если у пользователя есть данные и они не совпадают с фильтром - задание скрывается
  • Unknown = pass: если данных нет (поле пустое) - задание показывается. Это значит, что чем больше данных передано, тем точнее выборка
  • Коэффициенты: фильтры с пометкой «с коэффициентом» увеличивают цену за подписку для рекламодателя (x1.1 - x2.0), но не влияют на выплату публишеру

Пример запроса с таргетингом

curl -X POST https://api.trafsly.com/api/v1/get-sponsors \
  -H "Auth: at_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "user_id": 123456789,
    "first_name": "Иван",
    "username": "ivan_durov",
    "language_code": "ru",
    "is_premium": true,
    "max_sponsors": 5
  }'
Настройка фильтров. Рекламодатель настраивает таргетинг в @TrafslyBot через меню заказа: Настройки - Настройка пользователей. SDK-бот не может управлять фильтрами через API - только получать отфильтрованные задания.

Health-check

GET /api/v1/health Public

Простой health-check. Возвращает {"status": "ok"}, если API живо. Авторизация не требуется.

curl https://api.trafsly.com/api/v1/health

Баланс

POST /api/v1/get-balance Account

Возвращает текущий баланс владельца API-токена и список всех его ботов.

Request

Тело не обязательно. Авторизация через заголовок Auth.

Response

{
  "balance": 922.05,
  "hold_balance": 494.47,
  "bots_info": [
    {
      "bot_id": 1,
      "bot_username": "MyAwesomeBot",
      "is_active": true
    }
  ]
}
ПолеТипОписание
balancenumberДоступный баланс в рублях
hold_balancenumberСумма в холде (ещё не подтверждённые начисления)
bots_info[]arrayСписок ботов владельца токена

Статистика

GET /statistic Account

Универсальный статистический эндпоинт. Возвращает данные в зависимости от параметра action. Авторизация — через query-параметр api_token.

Query-параметры

ПараметрТипОбязательноОписание
api_tokenstringДаAPI-токен любого вашего бота
actionstringНетallbots (default), bots, allads, ads
bot_idintegerНетID бота для action=bots
output_formatstringНетjson (default) или html

action=allbots — сводка по всем ботам

{
  "bots": [
    {
      "bot_id": 1,
      "bot_username": "MyAwesomeBot",
      "is_active": true,
      "total_subscribers": 532,
      "revenue": 585.20
    }
  ]
}

action=bots&bot_id=1 — последние подписки в боте

{
  "bot": "MyAwesomeBot",
  "subscriptions": [
    {
      "user_id": 123456789,
      "order_id": 10421,
      "status": "subscribed",
      "amount": 1.10,
      "created_at": "2026-05-22T09:11:42+00:00"
    }
  ]
}

action=allads — статистика своих рекламных заказов

{
  "orders": [
    {
      "order_id": 87,
      "name": "Канал «Crypto News»",
      "status": "active",
      "price_per_sub": 2.50,
      "subscribers": 412,
      "cr_pct": 38.4,
      "spent": 1030.00
    }
  ]
}
HTML-формат. Добавьте &output_format=html — API вернёт готовую таблицу для встраивания в админ-панель.

Статусы заданий

СтатусОписание
subscribedПользователь подписался и подписка зачтена
unsubscribedПользователь не подписан (никогда или отписался)
notgettedПодписка не была засчитана (повторный заход уже учтённого юзера, антифрод)
holdПодписка в холде, ждёт подтверждения внешним провайдером

Ошибки

API возвращает стандартные HTTP-коды. Ответ при ошибке — JSON с полем detail.

HTTPdetailОписание
400Bad RequestНеверный формат запроса
401Invalid or inactive Bot API KeyНеверный или отключённый API-токен
404Bot not foundБот / задание / пользователь не найдены
422Validation errorPydantic-валидация полей не прошла
429Too Many RequestsСлишком много запросов — снизьте частоту
500Internal Server ErrorВнутренняя ошибка сервера, попробуйте позже

Пример ошибки

HTTP/1.1 401 Unauthorized
Content-Type: application/json

{ "detail": "Invalid or inactive Bot API Key" }

Логика работы

Базовый сценарий встраивания обязательной подписки Trafsly в свой Telegram-бот:

1Пользователь запускает вашего бота
2Бот вызывает /get-sponsors
3API возвращает задания или пустой список
4Бот показывает задания пользователю
5Пользователь подписывается и жмёт «Я подписался»
6Бот вызывает /confirm-subscription
7Если всё ок — открыть доступ, баланс начислен

Что дальше

  • Получите API-токен в @TrafslyBot → Мои боты.
  • Реализуйте два эндпоинта: /get-sponsors на старте бота и /confirm-subscription на кнопке «Я подписался».
  • Следите за балансом через /get-balance или в кабинете @TrafslyBot.
  • Если что-то не работает — канал Trafsly или напишите в поддержку из кабинета.