Эта инструкция — для того, кто ещё ни разу не подключал API. К концу вечера у вас будет три вещи: свой ключ доступа, первый файл, сгенерированный одной командой, и телеграм-бот, который принимает заказ у человека и отдаёт готовый результат. Всё на одном нашем ключе: 26 операций — картинки, озвучка, музыка, видео — и один общий баланс.
Вкладывать деньги на старте не нужно: при выпуске ключа на счёт падает 50 ₽. Этого хватает на пять картинок или пять расшифровок — достаточно, чтобы довести первую версию до рабочего состояния и показать её людям.
Сколько времени это занимает
Ниже — реальные отрезки, не «ну примерно за недельку». Дольше всего идёт четвёртый шаг, и то потому, что там появляется ваша собственная логика.

Как устроен любой запрос
Схема одинаковая для всех операций: картинка, озвучка, музыка, видео — разница только в названии операции и в наборе полей. Вы отправляете один POST, получаете номер задачи, а через несколько секунд забираете ссылку на готовый файл.

Базовый адрес один: https://genius-bot.ru/wp-json/genius/v1. Ключ передаётся заголовком Authorization: Bearer ВАШ_КЛЮЧ — так же, как в большинстве известных вам сервисов.
Шаг 1. Ключ — две минуты
- Откройте раздел API и войдите — через Телеграм, ВКонтакте или почту, как удобнее.
- Нажмите «Получить ключ». Ключ выдаётся сразу, вместе с ним появляется секрет — он понадобится позже, для проверки подписи уведомлений.
- Скопируйте оба значения к себе. Ключ показывается один раз.
Проверьте, что ключ живой. Команда ниже работает в любом терминале — в Linux, в macOS, в Windows через PowerShell:
curl -H "Authorization: Bearer ВАШ_КЛЮЧ" \
https://genius-bot.ru/wp-json/genius/v1/balance
В ответ приходит баланс. Подаренные деньги показаны отдельной строкой:
{"balance":50,"currency":"RUB","trial":50,
"trial_note":"Пробные деньги за выпуск ключа: тратятся только на запросы к API."}
Шаг 2. Первый файл — одной командой
Самая дешёвая проверка — картинка по описанию, 9 ₽. Ставим задачу:
curl -X POST https://genius-bot.ru/wp-json/genius/v1/generate \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"service":"image","prompt":"кофе на столе, вид сверху, тёплый свет"}'
Ответ приходит мгновенно — это ещё не картинка, а номер задачи:
{"task_id":"ea320b3512ae7a65a87e06830dc906ad","service":"image",
"status":"pending","cost":9,"balance":433.53}
Через 10–40 секунд спрашиваем результат по этому номеру:
curl -H "Authorization: Bearer ВАШ_КЛЮЧ" \
https://genius-bot.ru/wp-json/genius/v1/tasks/ea320b3512ae7a65a87e06830dc906ad
{"task_id":"ea320b3512ae7a65a87e06830dc906ad","service":"image",
"status":"completed",
"files":[{"label":"Результат","kind":"image",
"url":"https://genius-bot.ru/wp-content/uploads/…/ea320b35-d5d0d8ee.jpg"}],
"cost":9}
Откройте ссылку в браузере — это ваш первый файл, сделанный из вашей команды. Всё остальное в этой статье — обвязка вокруг этих двух запросов.
Шаг 3. То же самое из кода
Пятнадцать строк на Python, которые делают обе части: ставят задачу и ждут файл. Сохраните как genius.py — дальше мы будем брать функцию отсюда.
import time
import requests
API_KEY = "gb_вставьте_свой_ключ"
BASE = "https://genius-bot.ru/wp-json/genius/v1"
HEADERS = {"Authorization": "Bearer " + API_KEY}
def generate(service, wait=600, **fields):
"""Ставит задачу и ждёт результат. Возвращает список готовых файлов."""
answer = requests.post(BASE + "/generate", headers=HEADERS,
json={"service": service, **fields}, timeout=60)
answer.raise_for_status()
task_id = answer.json()["task_id"]
deadline = time.time() + wait
while time.time() < deadline:
time.sleep(5)
state = requests.get(BASE + "/tasks/" + task_id,
headers=HEADERS, timeout=60).json()
if state["status"] == "completed":
return state["files"]
if state["status"] == "failed":
raise RuntimeError(state.get("message") or "задача не удалась")
raise TimeoutError("задача " + task_id + " не успела за отведённое время")
if __name__ == "__main__":
files = generate("image", prompt="кофе на столе, вид сверху, тёплый свет")
print(files[0]["url"])
Запуск — две команды:
pip install requests
python genius.py
В терминале появится ссылка на готовый файл. Ровно этот код мы прогнали на живом ключе перед публикацией: задача создалась, картинка пришла за 15 секунд.
Если вам ближе JavaScript, то же самое на Node:
const BASE = "https://genius-bot.ru/wp-json/genius/v1";
const HEAD = { "Authorization": "Bearer " + process.env.GENIUS_KEY,
"Content-Type": "application/json" };
async function generate(service, fields) {
const made = await fetch(BASE + "/generate", { method: "POST", headers: HEAD,
body: JSON.stringify({ service, ...fields }) }).then(r => r.json());
for (let i = 0; i < 120; i++) {
await new Promise(r => setTimeout(r, 5000));
const state = await fetch(`${BASE}/tasks/${made.task_id}`,
{ headers: HEAD }).then(r => r.json());
if (state.status === "completed") return state.files;
if (state.status === "failed") throw new Error(state.message);
}
throw new Error("задача не успела");
}
Шаг 4. Бот, который принимает заказы
Дальше начинается ваш продукт. Возьмём самый простой и самый ходовой вариант: бот рисует картинку по описанию. Первые три — бесплатно, дальше человек пишет вам. Это уже готовая витрина, с которой можно идти к первым клиентам.
import telebot # pip install pytelegrambotapi
from genius import generate # функция из прошлого шага
bot = telebot.TeleBot("ТОКЕН_ОТ_BOTFATHER")
free_left = {} # сколько бесплатных осталось у человека
@bot.message_handler(commands=["start"])
def hello(message):
free_left.setdefault(message.chat.id, 3)
bot.send_message(message.chat.id,
"Пришлите описание картинки — верну готовое изображение.\n"
"Первые три бесплатно.")
@bot.message_handler(func=lambda m: True)
def draw(message):
chat = message.chat.id
if free_left.get(chat, 3) <= 0:
bot.send_message(chat, "Бесплатные закончились. Напишите @ваш_ник, "
"чтобы продолжить.")
return
note = bot.send_message(chat, "Рисую, это занимает около полуминуты…")
try:
files = generate("image", prompt=message.text)
except Exception as error:
bot.edit_message_text("Не получилось: %s" % error, chat, note.message_id)
return
free_left[chat] = free_left.get(chat, 3) - 1
bot.delete_message(chat, note.message_id)
bot.send_photo(chat, files[0]["url"],
caption="Готово. Осталось бесплатных: %d" % free_left[chat])
bot.infinity_polling()
Токен бота берётся у @BotFather за минуту. Запускается всё так:
pip install requests pytelegrambotapi
python bot.py
Пока скрипт работает, бот отвечает. Закрыли терминал — бот замолчал; этим займёмся на следующем шаге.
Что доделать до того, как показывать бота людям:
- Счётчик бесплатных живёт в памяти. После перезапуска у всех снова три попытки. Для начала хватит, но как только пойдут люди — переносите в файл или в SQLite, это пара строк.
- Приём денег. Проще всего начать вручную: человек пишет вам, вы принимаете перевод и снимаете ограничение. Автоматическая оплата — следующий шаг, а не первый.
- Длинные операции. Музыка и видео идут минуты, а не секунды. Предупреждайте об этом сообщением, иначе человек решит, что бот завис.
- Свой предел. Поставьте потолок расходов в день: одна ошибка в цикле способна съесть баланс за час.
Шаг 5. Чтобы работало без вас
Бот полезен, когда отвечает круглосуточно, а не пока открыт ваш ноутбук. Для этого нужен сервер: подойдёт самый дешёвый — арендовать VPS можно за несколько сотен рублей в месяц, и этого с запасом хватает боту на Python.
Раскладываем код и окружение:
apt update && apt install -y python3-venv
mkdir -p /opt/mybot && cd /opt/mybot
# сюда кладём genius.py и bot.py
python3 -m venv venv
venv/bin/pip install requests pytelegrambotapi
Описываем службу, чтобы бот сам поднимался после перезагрузки и после падения — файл /etc/systemd/system/mybot.service:
[Unit]
Description=Мой бот на Genius API
After=network-online.target
[Service]
WorkingDirectory=/opt/mybot
ExecStart=/opt/mybot/venv/bin/python bot.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
systemctl enable --now mybot
journalctl -u mybot -f # смотреть, что происходит
Всё. С этого момента бот живёт своей жизнью, а вы видите его дневник одной командой.
Вебхук: чтобы не спрашивать, а узнавать
Опрос статуса раз в пять секунд — нормально для бота и скрипта. Но если запросов много или операция долгая, удобнее, чтобы мы сами сообщили о готовности. Для этого добавьте в запрос callback_url:
{"service":"music","prompt":"спокойный лоуфай для кофейни",
"callback_url":"https://ваш-сервер.ру/genius"}
Когда файл готов, мы постучимся на этот адрес и принесём тот же ответ, что отдаёт /tasks/…. Запрос подписан: в заголовке X-Genius-Signature лежит HMAC-SHA256 от тела, посчитанный вашим секретом. Проверять подпись обязательно — иначе на ваш адрес сможет написать кто угодно:
import hashlib
import hmac
from fastapi import FastAPI, Request
SECRET = "секрет_из_кабинета"
app = FastAPI()
@app.post("/genius")
async def ready(request: Request):
body = await request.body()
mine = hmac.new(SECRET.encode(), body, hashlib.sha256).hexdigest()
if not hmac.compare_digest(mine, request.headers.get("X-Genius-Signature", "")):
return {"ok": False}
task = await request.json()
if task["status"] == "completed":
print("готово:", task["task_id"], task["files"][0]["url"])
return {"ok": True}
Что брать под свою задачу
Одним ключом открываются 26 операций. Самые ходовые — ниже; название из строки service подставляется в запрос без изменений.

Сколько это стоит на самом деле
Считать удобно не в рублях за запрос, а в результатах за тысячу рублей — сразу видно, на чём строится продукт:
| Операция | service |
Цена | Сколько на 1000 ₽ |
|---|---|---|---|
| Картинка по описанию | image | 9 ₽ | 111 картинок |
| Текст песни | lyrics | 9 ₽ | 111 текстов |
| Расшифровка записи | stt | 10 ₽ | 100 расшифровок |
| Озвучка текста | tts | 18 ₽ | 55 озвучек |
| Оживить фото | photo-video | 25 ₽ | 40 роликов |
| Создать музыку | music | 59 ₽ | 16 треков |
| Видео по описанию | video | 119 ₽ | 8 роликов |
| Говорящий аватар | avatar | 120 ₽ | 8 роликов |
Дальше арифметика простая. Если ваш бот делает обложки и вы берёте за пакет из трёх штук 300 ₽, себестоимость пакета — 27 ₽. Остальное уходит на вашу работу, продвижение и прибыль. Главное — знать первую цифру, чтобы не продавать в минус на длинных операциях вроде дубляжа.
GET /wp-json/genius/v1/services, и ключ для этого запроса не нужен.
Когда что-то пошло не так
Сервис отвечает понятным кодом и текстом по-русски. Вот всё, что вы реально встретите:
| Код | Что случилось | Что делать |
|---|---|---|
| 401 | Ключа нет в заголовке или он отозван | Проверьте Authorization: Bearer и сам ключ в разделе API |
| 402 | На балансе меньше, чем стоит операция | Пополните счёт; в ответе видно, сколько есть и сколько нужно |
| 400 | Не хватает обязательного поля или операция названа неверно | Сверьтесь со списком /services: там перечислены поля каждой операции |
| 429 | Больше 60 запросов в минуту с одного ключа | Почти всегда это цикл без паузы. Ставьте sleep между попытками |
| 404 | Задача не найдена | Проверьте номер: он выдаётся один раз при создании |
| 403 | Задача принадлежит другому ключу | Спрашивайте статус тем же ключом, которым создавали |
| 502 / 503 | Сбой на стороне модели или операция временно выключена | Повторите через минуту; деньги за неудачную задачу возвращаются сами |
Чек-лист: что должно быть готово к концу вечера
- Ключ получен,
/balanceотвечает вашим балансом. - Первый файл создан командой из терминала и открывается по ссылке.
- Скрипт
genius.pyработает у вас на компьютере. - Бот отвечает в Телеграме и присылает результат.
- Бот поднят на сервере и переживает перезагрузку.
- Поставлен предел расходов и придуман способ принимать деньги.
Дальше расширяется просто: новая операция — это другое значение service и другие поля, вся остальная обвязка уже написана. Полная справка по всем 26 операциям, готовая спецификация OpenAPI и коллекция Postman лежат в разделе API. Если хочется сначала пощупать инструменты руками, без кода — они же собраны в нашем боте и в кабинете озвучки.
