DARKBOOST API · v1

Интеграция, которую не нужно разгадывать

Сначала выберите сценарий. Затем просто повторите готовую схему. На странице есть рабочие запросы, ответы, webhook HMAC, статусы ошибок и checklist перед запуском.

DARKBOOST API · ПОЛНАЯ ИНТЕГРАЦИЯ Три режима. Один API.

Все интеграции: обязательные спонсоры, задания по одному, webhooks и отдельный Умный ОП.

Промпт для ИИ
SCENARIO 01Обязательная подпискаПолучить до 10 спонсоров одним блоком → показать все → проверить сессию. SCENARIO 02Задания по одномуОдно задание → check или skip → следующее. Без cooldown между заданиями. SCENARIO 03WebhooksПолучать subscription / unsubscription на свой HTTPS endpoint с HMAC-подписью.
00 · ДЛЯ ИИ И РАЗРАБОТЧИКОВ

Промпт для ИИ

Этот универсальный промпт охватывает все режимы DarkBoost: обязательный ОП, задания, Умный ОП, webhooks, Mini App и группы. Скопируйте его в ChatGPT или другой ИИ для интеграции вашего бота. Исходная документация остаётся ниже на этой странице.

Полный промпт для копирования

Промпт рассчитан на разработку без догадок. Если ИИ не может открыть эту страницу, скопируйте и отправьте текст вручную.

РОЛЬ: ты инженер Telegram-ботов и HTTP API. Прежде чем писать код, изучи всю документацию DarkBoost: https://darkboosts.com/docs. Не выдумывай endpoints, схемы JSON и статусы; если сайт недоступен, попроси скопировать страницу.

ОБЩИЕ ПРАВИЛА ВСЕХ РЕЖИМОВ
- Base URL: https://darkboosts.com. Отправляй JSON с заголовками Auth: YOUR_API_KEY и Content-Type: application/json. API-ключ только в защищённом backend/environment.
- Реальный Telegram user_id (не chat_id группы!), username, chat_id контекста, language_code, is_premium. Сохраняй server session_id, offer id и персональную ссылку link без изменений. Telegram Mini App обрабатывает переход; нельзя самостоятельно подменять URL провайдера.
- HTTP 200 значит доставку, а не выполнение. Анализируй status (ok / not_ok / busy / no_offers / expired / cooldown), missing, completed, rewarded, reward_rub и session_reward_rub_total. При not_ok обнови только оставшиеся кнопки. Новых выплат при повторном check может быть 0.
- Обеспечь idempotency, timeout, backoff+jitter при 429 и 5xx, повтор после retry_after_ms при busy. Не отправляй запросы непрерывно, не записывай токены в логи. Награды распределяет только сервер DarkBoost.

РЕЖИМ A — ОБЯЗАТЕЛЬНАЯ ПОДПИСКА (КЛАССИЧЕСКИЙ ОП)
POST /api/v1/sponsors: JSON {user_id, chat_id, max_sponsors:1..10}. Получи список, session_id и links. Покажи кнопку на каждый link. POST /api/v1/check с тем же user_id и session_id возвращает статус; POST /api/v1/check-offer проверяет только точный offer.id, который действительно был выдан. При not_ok оставь missing; пропускай пользователя только при ok.

РЕЖИМ B — ЗАДАНИЯ ПО ОДНОМУ
POST /api/v1/tasks/next, /api/v1/tasks/check, /api/v1/tasks/skip. Сохраняй состояние и session_id одного задания на пользователя; после проверки или пропуска запрашивай следующее по правилам документации. Не смешивай tasks-сессии с mandatory/check. Корректно отображай таймауты, provider unavailability, no_offers.

РЕЖИМ C — УМНЫЙ ОП (ОПЦИОНАЛЬНЫЙ, В КОНЦЕ ДОКУМЕНТАЦИИ)
POST /api/v1/smart-op с {tg_user_id,chat_id,lang,is_premium,offers_limit:1..10}. Первый запрос получает задания; повторный POST с session_id проверяет уже выданную сессию. Можно явно вызвать POST /api/v1/smart-op/check. Он похож по принципу на TGrass /offers, но работает внутри DarkBoost и использует ЕГО Auth. Старая API-интеграция остаётся рабочей и не требует миграции.

WEBHOOK, MINI APP, ГРУППЫ, ПОДПИСКИ
- Принцип обработки подписки/отписки подробно описан в разделе Webhooks: проверяй X-DarkBoost-Signature как sha256=HMAC_SHA256(secret, точные bytes тела); constant-time compare; UNIQUE(event_id), retries и атомарное изменение состояния. Никогда не кредитуй по неподтверждённому web-клику.
- В чатах и комментариях передавай настоящий Telegram user_id и chat_id группы; кнопки обрабатывай для этого же пользователя. Если человек закрывает Mini App, повторно проверь задания, уже выполненные убери из кнопок.
- Рекламодатель может отправить папку t.me/addlist/... до 100 чатов. Стоимость считается по полному составу; факт импорта папки Telegram не раскрывает Bot API. DarkBoost использует переход плюс подписку на один из контрольных чатов с правами бота как приближённое подтверждение; не называй это доказательством импорта.

ЧТО СГЕНЕРИРОВАТЬ
Уточни язык/фреймворк бота, если неизвестны. Напиши готовый интеграционный модуль, HTTP-клиент (timeout/retry), handlers на выдачу и «Проверить», хранение session_id по bot/user/chat, кнопки Telegram URL, HMAC webhook (если требуется), обработку status и HTTP отдельно, учёт неполных проверок, идемпотентные операции и graceful degradation. Добавь тесты успеха, неполной подписки, Already completed, busy, expired, no_offers, 401, 403, 429, 5xx, потерянных webhook и повторов. Не делай самовольную миграцию старого работающего режима в новый. Сверь код с текущей документацией DarkBoost.

Открыть «Умный ОП» → · Обычный обязательный ОП → · Задания →

01 · QUICK START

Самая короткая схема

Обязательная подписка
/sponsors→показать links→/check→status=ok

Используйте, когда пользователь должен выполнить сразу весь список.

Задания
/tasks/next→1 task→/tasks/check→next

Используйте, когда задания показываются строго по одному.

Не смешивайте режимы. Сессия из /api/v1/tasks/next проверяется через /api/v1/tasks/check. Mandatory-сессия из /api/v1/sponsors — через /api/v1/check.
02 · USER PAYLOAD

Какие данные пользователя передавать

ПолеОбязательноЧто передавать
user_idдаTelegram ID пользователя.
chat_idжелательноКонтекст, где выдали спонсоров. В личке обычно равен user_id.
usernameнетБез @. Если неизвестен — не выдумывайте.
first_name / last_nameнетПередавайте только реальные значения Telegram.
language_codeнетНапример ru. Не подставляйте ru, если язык неизвестен.
is_premiumнетtrue/false только если значение реально известно.

Чем точнее профиль, тем корректнее upstream-таргетинг сторонних сервисов.

POST/api/v1/sponsorsMANDATORY

Получить список спонсоров

DarkBoost собирает общий пул из всех включённых для бота источников, дедуплицирует его, фильтрует недоступные офферы и только потом ограничивает результат вашим max_sponsors. Максимум — 10.

01Запросите

Передайте user payload и нужный лимит.

02Сохраните session_id

Он нужен для последующей проверки.

03Покажите link

Используйте персональную ссылку DarkBoost из ответа.

04Проверьте

Когда пользователь закончил — вызовите /check.

curl -X POST https://darkboosts.com/api/v1/sponsors \
  -H 'Auth: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "user_id": 123456789,
    "chat_id": 123456789,
    "username": "example",
    "language_code": "ru",
    "is_premium": true,
    "max_sponsors": 10
  }'
import aiohttp

async def get_sponsors(user):
    payload = {
        "user_id": user.id,
        "chat_id": user.id,
        "username": user.username or "",
        "max_sponsors": 10,
    }
    async with aiohttp.ClientSession() as s:
        async with s.post(
            "https://darkboosts.com/api/v1/sponsors",
            headers={"Auth": API_KEY}, json=payload
        ) as r:
            return await r.json()
const data = await fetch('https://darkboosts.com/api/v1/sponsors', {
  method: 'POST',
  headers: {'Content-Type':'application/json', Auth: process.env.DARKBOOST_KEY},
  body: JSON.stringify({user_id:user.id, chat_id:user.id, max_sponsors:10})
}).then(r => r.json());

Нормальный ответ

{
  "ok": true,
  "status": "ok",
  "session_id": 1042,
  "sponsors": [
    {"id":"s1","title":"Спонсор #1","link":"https://t.me/DarkBoostsBot?startapp=offer_TOKEN&mode=compact"},
    {"id":"s2","title":"Спонсор #2","link":"https://t.me/DarkBoostsBot?startapp=offer_TOKEN2&mode=compact"}
  ],
  "count": 2
}
Если запросили 10, а получили 2: это означает, что после объединения всех включённых источников для конкретного пользователя осталось только 2 подходящих уникальных оффера. Не нужно повторять запрос в цикле сразу же.
POST/api/v1/check

Проверить весь обязательный список

Передайте того же пользователя и session_id. Уже подтверждённые офферы фиксируются идемпотентно. В missing остаются только невыполненные.

curl -X POST https://darkboosts.com/api/v1/check \
  -H 'Auth: YOUR_API_KEY' -H 'Content-Type: application/json' \
  -d '{"user_id":123456789,"chat_id":123456789,"session_id":1042}'
status = ok

Вся обязательная часть выполнена. Можно пропускать пользователя дальше.

status = not_ok

Покажите пользователю массив missing и после выполнения повторите тот же check.

completed и rewarded — разные вещи. completed означает подтверждённую подписку. rewarded — сколько из них прямо сейчас создали новое начисление владельцу площадки. Поэтому completed:1, rewarded:0 может быть корректным результатом.
POST/api/v1/check-offerOPTIONAL

Проверить конкретный оффер

Полезно, если у каждого спонсора отдельная кнопка «Проверить». Можно передать offer_id, offer_link, а также массивы offer_ids / offer_links.

{
  "user_id": 123456789,
  "session_id": 1042,
  "offer_ids": ["s1", "s2"]
}

Неизвестный оффер вернёт HTTP 404 до начислений. Повторная проверка уже завершённой сессии возвращает сохранённый результат с cached:true.

POST/api/v1/tasks/nextTASKS

Получить одно текущее задание

Tasks mode всегда выдаёт ровно одно задание. Если текущее ещё активно, повторный запрос вернёт его же с тем же session_id.

curl -X POST https://darkboosts.com/api/v1/tasks/next \
  -H 'Auth: YOUR_API_KEY' -H 'Content-Type: application/json' \
  -d '{"user_id":123456789,"chat_id":123456789,"username":"example"}'
{
  "ok": true,
  "status": "ok",
  "mode": "tasks",
  "session_id": 2088,
  "task": {"id":"s1","title":"Спонсор #1","link":"https://t.me/DarkBoostsBot?startapp=offer_TOKEN&mode=compact"},
  "count": 1,
  "no_timeout": true,
  "cooldown": false
}
POST/api/v1/tasks/check/api/v1/tasks/skip

Проверить или пропустить задание

Check
{"user_id":123456789,"session_id":2088}

При status=ok текущее задание завершено.

Skip
{"user_id":123456789,"session_id":2088}

Пропуск не создаёт оплачиваемое выполнение.

После успешного check/skip можно сразу запросить /api/v1/tasks/next. DarkBoost не вводит cooldown между заданиями.

DELIVERY SAFETY

Первичный /start gate

Интеграции ничего менять не нужно. Если пользователь ещё не запускал @DarkBoostsBot, ссылка спонсора сначала откроет основной бот. После /start пользователь продолжит в тот же offer по тому же session/tracking token. Для уже активировавших DarkBoost ссылка сразу ведёт в Mini App.

Важно: всегда показывайте URL из поля link. Не подменяйте его исходной ссылкой провайдера — DarkBoost сам управляет gate, tracking и продолжением сессии.
TRACKING

Почему нельзя заменять link из ответа

01Выдача

DarkBoost создаёт персональный tracking token.

02Mini App

Пользователь открывает выданный startapp=offer_….

03Провайдер

DarkBoost переводит на оригинальный offer URL без потери параметров.

04Check

Проверка идёт против того сервиса, который реально выдал оффер.

Главное: храните session_id и возвращайте пользователю именно поле link. Не собирайте ссылку вручную.
OWNER WEBHOOKS

Webhooks без сюрпризов

Включите webhook у подключённого бота и укажите HTTPS URL + secret. DarkBoost отправляет события subscription и unsubscription. Получатель должен вернуть любой HTTP 2xx.

subscription

Отправляется, когда DarkBoost подтвердил факт выполнения оффера — даже если payout ещё pending или provider не начислил вознаграждение.

unsubscription

Отправляется, когда DarkBoost получил достоверный сигнал отписки по ранее учтённой продаже. Для first-party DarkBoost также работает retention-monitor.

Подпись

X-DarkBoost-Event: subscription
X-DarkBoost-Event-Id: 64-char-event-id
X-DarkBoost-Signature: sha256=HEX_HMAC
HMAC считается по RAW body. Формула: HMAC_SHA256(webhook_secret, raw_request_body). Не делайте JSON parse → stringify до проверки подписи.

subscription payload

{
  "event": "subscription",
  "event_id": "…",
  "occurred_at": 1791121403,
  "occurred_at_iso": "2026-10-04T13:43:23Z",
  "bot_id": 87,
  "user_id": 5091745714,
  "session_id": 509680,
  "service": "flyer",
  "offer_id": "212b133c99",
  "offer_link": "https://t.me/+…",
  "reward_rub": 0.0,
  "reward_status": "pending",
  "provider_status": "waiting"
}
reward_statusЗначение
confirmed / pending_retentionНачисление создано.
pendingПодписка подтверждена, provider payout ещё ожидается.
not_counted / provider statusПодписка подтверждена, но этот provider не начислил выплату.

unsubscription payload

{
  "event": "unsubscription",
  "event_id": "…",
  "occurred_at_iso": "2026-10-08T09:10:00Z",
  "bot_id": 87,
  "user_id": 5091745714,
  "service": "darkboost",
  "offer_link": "https://t.me/example",
  "penalty_rub": 0.61,
  "reason": "retention_unsubscribe"
}

Готовый обработчик

import hashlib, hmac, json
from fastapi import FastAPI, Request, HTTPException

app = FastAPI()
WEBHOOK_SECRET = "your-secret"

@app.post("/darkboost/webhook")
async def darkboost_webhook(request: Request):
    raw = await request.body()
    got = request.headers.get("X-DarkBoost-Signature", "")
    expected = "sha256=" + hmac.new(
        WEBHOOK_SECRET.encode(), raw, hashlib.sha256
    ).hexdigest()
    if not hmac.compare_digest(got, expected):
        raise HTTPException(403, "bad signature")

    event = json.loads(raw)
    event_id = event["event_id"]
    # В БД сделайте UNIQUE(event_id), чтобы retry не обработался дважды.
    await process_once(event_id, event)
    return {"ok": True}
import crypto from 'node:crypto';
import express from 'express';
const app = express();
app.use(express.raw({type:'application/json'}));

app.post('/darkboost/webhook', async (req, res) => {
  const got = req.get('X-DarkBoost-Signature') || '';
  const expected = 'sha256=' + crypto
    .createHmac('sha256', process.env.DARKBOOST_WEBHOOK_SECRET)
    .update(req.body).digest('hex');
  if (got.length !== expected.length ||
      !crypto.timingSafeEqual(Buffer.from(got), Buffer.from(expected))) {
    return res.sendStatus(403);
  }
  const event = JSON.parse(req.body.toString('utf8'));
  await processOnce(event.event_id, event);
  res.json({ok:true});
});

Retry policy

Ответ endpointЧто делает DarkBoost
2xxСобытие считается доставленным.
408 / 409 / 425 / 429 / 5xx / timeoutПовторная доставка с backoff. Один медленный endpoint не блокирует остальные.
прочие 4xxСчитаются постоянной ошибкой конфигурации и не повторяются десятки раз.
Всегда делайте обработчик идемпотентным по event_id. Сетевой retry может повторить один и тот же логический event.

Самопроверка webhook

Не нужно вручную собирать тестовый HMAC. Поставьте безопасное событие test в ту же production-очередь, а затем посмотрите результат доставки.

curl -X POST https://darkboosts.com/api/v1/webhook/test \
  -H 'Auth: YOUR_API_KEY'
{
  "ok": true,
  "status": "queued",
  "delivery_id": 1201,
  "event_id": "…"
}
curl https://darkboosts.com/api/v1/webhook/status/1201 \
  -H 'Auth: YOUR_API_KEY'

Test-event не означает подписку и не влияет на баланс. Если ваш обработчик принимает только два известных типа событий, добавьте ветку event === "test" и просто верните 200.

SAFE TEST ENVIRONMENT

Sandbox — тестируйте интеграцию без денег и реальных подписок

Создайте sandbox key в Control Plane у нужного подключённого бота. Ключ начинается с dbx_test_, хранится на сервере только как SHA-256 и показывается один раз.

Никакого production side effect: sandbox не вызывает TGrass/Trafsly/Flyer/PiarFlow/BotoHub, не создаёт реальные rewards и не меняет баланс.

Поддерживаемые сценарии

  • ok
  • not_ok
  • pending_reward
  • provider_timeout
  • unsubscription
  • no_offers

Endpoint'ы

  • /api/v1/sandbox/sponsors
  • /api/v1/sandbox/check
  • /api/v1/sandbox/tasks/next
  • /api/v1/sandbox/tasks/check
  • /api/v1/sandbox/webhook
cURL
curl -X POST https://darkboosts.com/api/v1/sandbox/sponsors \
  -H 'Auth: dbx_test_...' -H 'Content-Type: application/json' \
  -d '{"user_id":123456789,"max_sponsors":3,"scenario":"pending_reward"}'

Для проверки HMAC-доставки вызовите POST /api/v1/sandbox/webhook с sandbox key. Событие проходит через тот же durable webhook pipeline, но имеет "sandbox": true.

OPTIONAL PYTHON SDK

Официальная Python-библиотека

SDK полностью необязателен. Все старые и новые REST-интеграции продолжают работать напрямую. Библиотека — только удобная обёртка над тем же API v1.
pip install https://darkboosts.com/static/sdk/darkboost_sdk-1.0.0-py3-none-any.whl
from darkboost_sdk import AsyncDarkBoostClient

async with AsyncDarkBoostClient("YOUR_API_KEY") as db:
    session = await db.sponsors(user_id=123456789, max_sponsors=10)
    result = await db.check(
        user_id=123456789,
        session_id=session["session_id"],
    )

В SDK есть sync/async клиенты, mandatory/tasks/check-offer, webhook test/status, отдельные sandbox-клиенты и проверка HMAC по исходным байтам body.

from darkboost_sdk import verify_webhook
verify_webhook(WEBHOOK_SECRET, raw_body, request.headers["X-DarkBoost-Signature"])
OBSERVABILITY

Control Plane — почему именно эта интеграция не работает

Открыть Control Plane →

Для каждого подключённого бота доступны Provider Health, end-to-end funnel, webhook p50/p95, delivery history + Retry, sandbox key, anti-fraud summary и marketplace ROI-рекомендации.

Администратору: дополнительно показываются NOC incidents, reconciliation findings и безопасный запуск сверки. Control Plane не подменяет ledger и не «дорисовывает» provider confirmations.
STATUS MATRIX

HTTP код и status — это не одно и то же

Сначала проверяйте HTTP-код. Затем JSON-поле status. Например, HTTP 200 + status=not_ok — это нормальный бизнес-ответ, а не ошибка API.

status / HTTPЧто означаетЧто делать
okУспех.Продолжить сценарий.
not_okПроверка выполнена, но не всё подтверждено.Показать missing, затем повторить check.
busyПараллельный запрос того же пользователя уже обрабатывается.Повторить через retry_after_ms.
cooldownНовая mandatory-сессия пока не разрешена.Ждать reset_seconds.
no_offersНет подходящих офферов.Не спамить API; повторить позднее.
expiredAssignment провайдера истёк.Запросить новую сессию.
HTTP 401Нет/неверный Auth.Проверить API key.
HTTP 403Бот выключен/заблокирован политикой.Проверить состояние подключённого бота.
HTTP 404 check-offerОффер не принадлежит этой сессии.Использовать ID/link из исходной выдачи.
TROUBLESHOOTING

Если что-то не работает

Webhook не приходит

Проверьте: webhook включён → URL начинается с HTTPS → secret задан → endpoint доступен извне → отвечает 2xx → вы проверяете RAW body HMAC → не фильтруете событие из-за rewarded:0. subscription приходит по факту confirmed, а не только по факту выплаты.

Webhook приходит, но HMAC неверный

Не используйте уже распарсенный JSON. HMAC считается по исходным байтам request body и вашему webhook secret. Сравнивайте строку с префиксом sha256=.

/check возвращает not_ok

Это HTTP 200 и нормальный ответ. Покажите пользователю missing. Для точечной проверки используйте только ID/link из этой же сессии.

Запросил 10, получил меньше

DarkBoost уже опрашивает все включённые источники и объединяет их. Меньшее число означает реальный дефицит подходящих уникальных офферов после фильтров.

Пользователь подписался, rewarded=0

Смотрите completed. Если completed>0, подписка подтверждена. Reward может быть pending, уже учтён ранее либо не начислен сторонним provider'ом.

Tasks выдаёт всегда один оффер

Это ожидаемо. Tasks mode специально выдаёт задания по одному. Список до 10 используется только в mandatory режиме.

BEFORE PRODUCTION

Checklist перед запуском

  1. API key и webhook secret хранятся только на backend.
  2. Пользователь получает только link из ответа DarkBoost.
  3. session_id сохраняется до завершения проверки.
  4. HTTP-код и JSON status обрабатываются отдельно.
  5. busy повторяется по retry_after_ms, а не считается ошибкой.
  6. Webhook HMAC проверяется до изменения баланса/состояния.
  7. Webhook обработчик имеет UNIQUE по event_id.
  8. Ваш endpoint быстро возвращает 2xx; тяжёлую работу делайте через собственную очередь.
NEW API V1 · ОТДЕЛЬНЫЙ РЕЖИМ

Умный ОП — один адрес на выдачу и проверку

По логике TGrass /offers: первый запрос выдаёт спонсоров, повторный запрос того же пользователя проверяет активную сессию. Это дополнительный режим. Ранее работающие /api/v1/sponsors, /api/v1/check, /api/v1/check-offer и /api/v1/tasks/* остаются на месте.

POST/api/v1/smart-opSMART OP
1. ПолучитьPOST с реальным Telegram user_id
2. ПоказатьКнопки с URL из offers[].link
3. ПроверитьПовторный POST с session_id

Точный запрос

curl -X POST 'https://darkboosts.com/api/v1/smart-op' \
  -H 'Auth: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "tg_user_id":123456789,
    "chat_id":123456789,
    "tg_login":"example",
    "lang":"ru",
    "is_premium":false,
    "offers_limit":5
  }'

user_id и tg_user_id — алиасы, как language_code/lang и username/tg_login. Лимит офферов: 1–10. В запросе можно использовать max_sponsors, limit или offers_limit. Запрещено подменять Telegram user_id идентификатором группы.

Первый ответ — задания ещё не выполнены

{
  "ok":true, "mode":"smart_op", "status":"not_ok",
  "session_id":1042,
  "offers":[
    {"id":"s1","offer_id":"s1","name":"Спонсор #1","title":"Спонсор #1",
     "link":"https://t.me/DarkBoostsBot?startapp=offer_TOKEN&mode=compact",
     "subscribed":false,"type":"resource"}
  ],
  "count":1
}

Покажите каждому пользователю ровно ссылку link. Она уже указывает на нужное Telegram Mini App и содержит трекинг. Никогда не переносите пользователя на адрес самого провайдера вручную.

Повторная проверка того же задания

curl -X POST 'https://darkboosts.com/api/v1/smart-op' \
  -H 'Auth: YOUR_API_KEY' -H 'Content-Type: application/json' \
  -d '{"tg_user_id":123456789,"chat_id":123456789,"session_id":1042}'

Если часть заданий ещё не выполнена, вернётся status=not_ok и только невыполненные элементы. Убирайте выполненные кнопки. Если всё подтверждено, вернётся status=ok — можно пропустить пользователя. Когда status=no_offers, это отсутствие новых заданий, а не доказательство подписки.

POST/api/v1/smart-op/checkEXPLICIT CHECK

Дополнительный явный адрес проверки. Тот же JSON с session_id; проверка работает через общий защищённый контур DarkBoost. Для отдельного оффера используйте существующий /api/v1/check-offer и исходный id.

Ответ после проверки

{
  "ok":true,
  "mode":"smart_op",
  "status":"ok",
  "completed":1,
  "rewarded":1,
  "reward_rub":"0.90",
  "offers":[]
}

Данные примеров иллюстративные. rewarded — количество фактических проводок за конкретную проверку, а не обещанная сумма. Начисления выполняются только сервером DarkBoost. Повторные проверки идемпотентны.

Статусы и поведение клиента

СтатусКогдаЧто сделать
not_okОстались невыполненные предложенияПоказать только offers; дать проверить снова
okУсловия сессии подтвержденыПродолжить действие пользователя
no_offersНет доступных предложенийПовторить позднее либо применить бизнес-правило своего бота
busyКонкурирующая проверкаПовторить после retry_after_ms
expiredСессия истеклаЗапросить новый список без старого session_id
HTTP 401 / 403Неверный ключ / бот запрещёнНе пропускать подписку; исправить настройки
HTTP 429 / 5xxЛимит или недоступностьBackoff с jitter, без начисления
Про папки Telegram: t.me/addlist/... может содержать до 100 ресурсов. Bot API не подтверждает импорт папки в клиент Telegram; проверяется членство во всех доступных каналах, либо результат остаётся неподтверждённым. Нельзя начислять за клик.

Python · aiogram 3 + httpx

import httpx
API = "https://darkboosts.com/api/v1/smart-op"
KEY = "YOUR_API_KEY"  # Только backend/environment!
async def smart_op(user, chat_id, session_id=None):
    body = {"tg_user_id":user.id,"chat_id":chat_id,
            "lang":user.language_code or "ru",
            "is_premium":bool(user.is_premium),
            "offers_limit":5}
    if session_id: body["session_id"]=session_id
    async with httpx.AsyncClient(timeout=15) as client:
        response=await client.post(API,json=body,headers={"Auth":KEY})
    response.raise_for_status()
    result=response.json()
    if not result.get("ok"): raise ValueError(result.get("error","provider_error"))
    return result
# При not_ok показать result["offers"]; сохранить session_id.
# По нажатию Проверить повторить smart_op(..., session_id).
# Только status == "ok" разрешает пропускать; при busy/429/5xx повторять с задержкой.

Совместимость и границы режима

Вдохновлено схемой TGrass, но не является прокси и не требует ключ TGrass. Авторизация, платёжные проводки, antifraud, сессии и ссылки — собственные DarkBoost. Дополнительные поля TGrass могут отсутствовать; используйте описанные здесь значения, не ожидайте идентичной структуры offer_id/price. Ранее созданные боты могут продолжить использовать классический двухшаговый режим без миграции.

Ничего не найдено. Попробуйте «webhook», «check», «busy» или «tasks».
Скопировано