Открыть бота

API для владельцев ботов

Обновлено 20.10.2026

Свой бот можно монетизировать через Pulsar двумя форматами: ОП при /start и задания. Pulsar подбирает спонсоров, проверяет подписки и платит за подписчиков, а твой бот показывает каналы и отправляет один-два запроса. Код программист пишет один раз.

Базовый адрес API: https://pulsarx.sale/api/v1. Проверить, что сервер отвечает и адрес верный, можно запросом GET /op/info, ключ для него не нужен.

Два формата

ОП при /startЗадания
Что нужно от человекаподписаться на все каналы, частичные подписки не проходятподписаться хотя бы на 1 из N, засчитывается каждый канал
Кто показывает каналытвой бот, кнопками из ответа APIMini App Pulsar по одной постоянной ссылке
Что делает твой ботпускает человека при all_subscribed: trueвыдаёт свой бонус по subscribed_count
Ключapi_key в каждом запросеMini App работает без ключа, боту ключ нужен для /op/tasks/status

Подключение

  1. В боте @PulsarAdsBot открой «Продать» и подключи своего бота токеном от @BotFather.
  2. Выбери формат «ОП при /start» или «Задания», задай число спонсоров (кнопка «Спонсоров», от 1 до 6), цену и ГЕО, включи продажу.
  3. В кабинете формата нажми «Как подключить API» (у заданий «Инструкция») и открой раздел «Для программиста». На странице «Ключи (передай программисту)» лежат platform_id, api_key и базовый адрес.

Ключ и авторизация

Эндпоинты

ЗапросКлючЧто делает
GET /op/infoне нуженсписок эндпоинтов
GET /op/sponsorsX-Api-Keyспонсоры: с telegram_user_id только неподписанные (mode: op), без него каталог сетки (mode: catalog)
POST /op/check-subscriptionsapi_key в телеОП: подписан ли человек на всех спонсоров
POST /op/startapi_key в телезафиксировать /start, если проверка по токену бота недоступна
GET /op/checkX-Api-Keyзапускал ли человек бота
GET /op/statsX-Api-Keyсчётчики интеграции
GET /op/tasks/linkX-Api-Keyпостоянная ссылка Mini App заданий
POST /op/tasks/checkapi_key в телезадания: на сколько каналов подписан человек
GET /op/tasks/statusX-Api-Keyсохранённый результат заданий для бонуса
POST /op/tasks/contextinit_dataMini App: неподписанные каналы и прогресс
POST /op/tasks/check-webappinit_dataMini App: проверка и сохранение результата

Пути /op/tasks/verify-webapp и /op/tasks/complete устарели: это старые имена check-webapp и tasks/check.

ОП при /start

1. Покажи спонсоров на /start

Как только человек нажал /start, запроси спонсоров для него. В ответе только каналы, на которые он ещё не подписан, со ссылками трекинга Pulsar, клики по ним видны в кабинете.

curl "https://pulsarx.sale/api/v1/op/sponsors?platform_id=plt_...&telegram_user_id=123456789&language_code=ru" \
      -H "X-Api-Key: $PULSAR_API_KEY"

language_code бери из from_user.language_code. По нему подбираются спонсоры с ГЕО: без него часть спонсоров не покажется, и подписка на них не оплатится. Показывай спонсоров сразу: Pulsar платит за подписку, сделанную в течение 2 часов после первого ответа «не подписан».

Тот же запрос без telegram_user_id вернёт каталог всей сетки (mode: catalog), он нужен только для обзора. Человеку показывай режим op: у каждого свой набор спонсоров.

2. Проверь подписки по кнопке

Человек подписался и нажал «Проверить подписки» в твоём боте. Отправь запрос с его Telegram ID:

curl -X POST "https://pulsarx.sale/api/v1/op/check-subscriptions" \
      -H "Content-Type: application/json" \
      -d '{
        "platform_id": "plt_...",
        "api_key": "КЛЮЧ_ИЗ_БОТА",
        "telegram_user_id": 123456789,
        "language_code": "ru"
      }'

Ответ, сокращённо:

{
      "ok": true,
      "platform_id": "plt_...",
      "telegram_user_id": 123456789,
      "all_subscribed": false,
      "no_sponsors": false,
      "subscribed_count": 1,
      "pending_count": 1,
      "total": 2,
      "sponsors": [
        {
          "id": 512,
          "title": "Канал спонсора",
          "username": "sponsor_channel",
          "type": "channel",
          "url": "https://...",
          "subscribed": false
        }
      ],
      "subscribed_sponsors": [
        {"id": 377, "title": "Другой спонсор", "username": "other_sponsor", "type": "channel"}
      ]
    }

id спонсора бывает числом или строкой. Кроме полей выше, в ответе есть служебные: platform_numeric_id, bot_username, limit, у спонсора target_url и track_token.

3. /start без токена

Если Pulsar не может проверить /start по токену твоего бота, зафиксируй его сам запросом POST /op/start с тем же телом, что у check-subscriptions. GET /op/check с platform_id и telegram_user_id отвечает, запускал ли человек бота: поле started, способ проверки в поле method.

Задания

  1. Возьми постоянную ссылку Mini App. Она есть в боте, в разделе «Твоя ссылка», и в ответе GET /op/tasks/link (поля open_link и mini_app_url). Ссылка одна на весь бот, одинаковая для всех пользователей и не меняется.
  2. Поставь её на кнопку в боте, например «Задания» или «Получить бонус». Mini App показывает человеку только каналы, на которые он не подписан, и по кнопке «Проверить» сохраняет результат.
  3. Твой бот читает сохранённый результат и выдаёт свой бонус. Логику решаешь ты: например, 1 канал = 10 монет, 2 канала = 25.
curl "https://pulsarx.sale/api/v1/op/tasks/status?platform_id=plt_...&telegram_user_id=123456789" \
      -H "X-Api-Key: $PULSAR_API_KEY"

В ответе has_progress, subscribed_count, subscribed_sponsors и saved_at. Если человек отписался, после следующей проверки subscribed_count уменьшится.

Проверить задания со своего сервера, без Mini App, можно запросом POST /op/tasks/check: тело как у check-subscriptions плюс поле task_id (по умолчанию subscribe). Запросы /op/tasks/context и /op/tasks/check-webapp делает сам Mini App Pulsar, передавая init_data из Telegram.WebApp.initData. Повторять их в боте не нужно.

Когда платят

В кабинете у каждой подписки видно состояние: 12 ч на проверке, подтверждено, заработано. Счётчики интеграции отдаёт GET /op/stats: op_starts (зафиксированные /start), task_users (люди с заданиями) и tasks_completed (проверки заданий).

Ответы и ошибки

ОтветЧто значит
401нет ключа в заголовке X-Api-Key, или Mini App прислал неверный init_data
403 «Неверный API-ключ»ключ не подходит, например его перевыпустили
404 «Площадка не найдена»неверный platform_id
403, code: platform_inactiveплощадка не активна
403, code: format_not_configuredформат ОП или заданий не настроен
200, no_sponsors: true, listing: listing_pausedлот на паузе: ты выключил продажу. Каталог сетки и /op/tasks/link в этом случае отвечают 403 с code: listing_paused

Перед запуском проверь

Пустой список спонсоров значит, что в сети сейчас нет подходящих закупок. Подожди или измени цену и ГЕО в кабинете.