GRAM показывает рекламу вашим пользователям и платит вам 70% от каждого показа. Подключение по API за 5 минут. Токен вашего бота передавать не нужно.
Режим self-serve: ваш бот сам решает, когда показать рекламу, и сам отправляет её своим токеном. Сеть только подбирает объявление и считает деньги. Три шага на каждый показ:
POST /pub/v1/ad/next с user_id — сеть подберёт подходящую кампанию и забронирует показ. Деньги ещё не движутся.
Полученное объявление (текст + кнопки) ваш бот отправляет пользователю обычным сообщением — своим токеном.
POST /pub/v1/ad/confirm с imp_token — показ засчитан, ваши 70% начислены на кошелёк площадки.
ad: null. Это штатно: просто ничего не показывайте.База: https://hubsmaxbot.ru · Авторизация: заголовок Authorization: Bearer <api_key>.
Ключ выдаётся при подключении — напишите нам в бота GRAM.
Подобрать объявление для пользователя и забронировать показ (тарификации ещё нет).
// запрос
{ "user_id": 123456789 }
// ответ — реклама есть
{
"ad": {
"text": "Забирай бесплатные робуксы!", // плоский текст
"html": "Забирай <b>бесплатные</b> робуксы!", // с форматированием
"format": "html", // "html" | "plain"
"buttons": [ { "text": "Перейти", "url": "https://max.ru/..." } ]
},
"imp_token": "одноразовый токен показа",
"expires_in": 600 // секунд на подтверждение
}
// ответ — рекламы нет (штатно, не ошибка)
{ "ad": null, "reason": "no_ad" }
buttons — до 10 кнопок; рендерите каждую отдельным рядом inline-клавиатуры.format == "html" → отправляйте поле html с format="html"; иначе поле text без формата.reason: no_ad (нет кампаний), user_frequency (человеку рано показывать), platform_paused, platform_daily_cap.Подтвердить, что объявление отправлено пользователю. Именно этот вызов засчитывает показ и начисляет ваши 70%.
// запрос
{ "imp_token": "..." }
// ответ
{ "ok": true, "campaign_id": 7 }
expires_in секунд → бронь сгорает, показ не засчитывается.Если отдадите сети токен бота при подключении — достаточно одного вызова: сеть сама подберёт и отправит рекламу вашим ботом.
// запрос
{ "user_id": 123456789 }
// ответ
{ "sent": true, "campaign_id": 7 } // или {"sent": false, "reason": "no_ad"}
Показы и заработок по дням + кошелёк площадки (JSON). Человеческая страница — /pub/stats?key=<api_key>.
Заявка на выплату: {"amount_kop": ...}. История — GET /pub/v1/payouts. Минималка и доступный остаток — в /pub/v1/stats.
import aiohttp
GRAM = "https://hubsmaxbot.ru"
KEY = "gram_..." # ваш api_key
async def _gram(path, payload):
try:
async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=12)) as s:
async with s.post(GRAM + path, json=payload,
headers={"Authorization": f"Bearer {KEY}"}) as r:
return await r.json() if r.status == 200 else None
except Exception:
return None
async def show_gram_ad(api, user_id):
r = await _gram("/pub/v1/ad/next", {"user_id": user_id})
if not r or not r.get("ad"):
return # рекламы нет — молчим
ad = r["ad"]
text = ad["html"] if ad.get("format") == "html" else ad["text"]
fmt = "html" if ad.get("format") == "html" else None
rows = [[{"type": "link", "text": b["text"], "url": b["url"]}]
for b in (ad.get("buttons") or [])[:10] if b.get("url")]
await api.send_message(user_id, text, buttons=rows, fmt=fmt) # СВОИМ токеном
await _gram("/pub/v1/ad/confirm", {"imp_token": r["imp_token"]})
401 — нет ключа, 403 — неверный ключ, 429 — слишком часто.Всё прозрачно: каждый подтверждённый показ — это деньги рекламодателя, 70% из которых сразу зачисляются на кошелёк вашей площадки.
| Что | Как |
|---|---|
| Ваша доля | 70% от расхода рекламодателя по каждому показу в вашем боте |
| Начисление | Мгновенно, в момент подтверждения показа (/ad/confirm) |
| Статистика | Страница /pub/stats?key=… и JSON /pub/v1/stats: показы и доход по дням, кошелёк |
| Выплаты | Заявка через POST /pub/v1/payout или через администратора сети |
Полное самообслуживание — ключ выдаётся автоматически, ни с кем списываться не нужно.
api_key выдаётся сразу./ad/confirm.