API рендера · v1

Видео и карточки подарков Telegram по одному запросу

Тот же движок, что у бота: видео, GIF, PNG и карточки подарков, коллажи до 18 штук, Lottie, TGS, SVG любого кадра и данные подарка в JSON. По ссылке на подарок или по любому сочетанию коллекции, модели, фона и символа. Видео можно замедлить в 2–4 раза.

Открыть кабинет API

Тарифы

Тариф — это объём запросов на месяц. Форматы можно смешивать: каждый запрос берёт свою долю тарифа.

Пробный
Бесплатно · 5 дн.
  • 1 000 PNG или 100 видео
  • в день до 300 PNG
  • первому ключу, один раз
Мини
4 GRAM · 30 дн.
  • 12 000 PNG, или 1 200 видео, или 1 200 карточек в месяц
  • в день до 1 000 PNG / 100 видео
  • до 1 в секунду
Старт
10 GRAM · 30 дн.
  • 40 000 PNG, или 4 000 видео, или 4 000 карточек в месяц
  • в день до 3 000 PNG / 300 видео
  • до 2 в секунду
Про
20 GRAM · 30 дн.
  • 120 000 PNG, или 12 000 видео, или 12 000 карточек в месяц
  • в день до 8 000 PNG / 800 видео
  • до 5 в секунду
Бизнес
50 GRAM · 30 дн.
  • 400 000 PNG, или 40 000 видео, или 40 000 карточек в месяц
  • в день до 25 000 PNG / 2 500 видео
  • до 10 в секунду
Пакет
3 GRAM · навсегда
  • 10 000 PNG, или 1 000 видео, или 1 000 карточек
  • в день до 3 000 PNG / 300 видео
  • не сгорает

Сколько запросов одного формата даёт тариф

ФорматМиниСтартПроБизнесПакет
PNG, JPG, JSON12 00040 000120 000400 00010 000
Lottie, TGS6 00020 00060 000200 0005 000
SVG4 00013 33340 000133 3333 333
Видео, GIF1 2004 00012 00040 0001 000
Карточка PNG6 00020 00060 000200 0005 000
Карточка видео / GIF1 2004 00012 00040 0001 000
Коллаж из 9 (PNG)4 00013 33340 000133 3333 333
Коллаж из 9 (видео)4441 4814 44414 814370

Замедленное видео ½× считается как 2 видео, ⅓× и ¼× — как 3. Неудачный запрос не списывается. Остаток тарифа переносится при продлении.

Нужно больше, чем «Бизнес», — Enterprise: свой объём, дневной лимит и приоритет. Калькулятор — в кабинете API. Оплата — GRAM: переводом с комментарием (мемо) или счётом в xRocket.

Быстрый старт

  1. Открой кабинет API (в боте — /api) и нажми «Создать API-ключ»: название, сервис и пара слов о проекте. Ключ показывается один раз — сохрани его. В кабинете — остаток, статистика и пополнение.
  2. Передавай ключ в каждом запросе: Authorization: Bearer nfp_… (или заголовок X-API-Key).
  3. Отправь задачу в POST /v1/render с "wait": 60 — ответ придёт, когда файл готов, со ссылкой file_url.
  4. Скачай файл по file_url с тем же ключом. Файл хранится 1 час.
curl
curl -X POST https://bot-production-b17c.up.railway.app/v1/render \
  -H "Authorization: Bearer $NFP_KEY" \
  -H "Content-Type: application/json" \
  -d '{"gift": "https://t.me/nft/PlushPepe-22", "format": "mp4", "wait": 60}'

Ключ и лимиты

Каждый запрос — с ключом в заголовке Authorization: Bearer <ключ> или X-API-Key: <ключ>. Ключ создаётся в кабинете API, у одного человека — до 3 ключей, у каждого свой тариф, остаток и статистика. Ключ можно перевыпустить в кабинете: старый сразу перестаёт работать.

ТарифЗапросов в секундуЗадач одновременноВ день до
Пробный11300 PNG / 30 видео
Мини111 000 PNG / 100 видео
Старт223 000 PNG / 300 видео
Про548 000 PNG / 800 видео
Бизнес10625 000 PNG / 2 500 видео
Пакет223 000 PNG / 300 видео
Общее правилоЗначение
Запросов к API на ключдо 120 в минуту (вместе с проверкой статуса)
Ожидание в ответе (wait)до 90 секунд
Хранение готового файла1 час после готовности, потом задача и файл удаляются
Дневной лимитобнуляется в 00:00 UTC
Неудачный рендерне списывается

Как указать подарок

Одним из двух способов — в любом формате, кроме коллажа (у него список, см. ниже).

Настоящий подарок

Поле gift: ссылка https://t.me/nft/PlushPepe-22, t.me/nft/PlushPepe-22 или просто слаг PlushPepe-22. Модель, фон и символ берутся настоящие, номер — из ссылки.

Любое сочетание (как в Конструкторе)

Поля collection + model + backdrop, по желанию symbol и number. Названия — как в Telegram (Plush Pepe, Aqua Plush, Electric Purple, Star). Можно собрать и несуществующую комбинацию. Без symbol — фон без узора, number (до 7 цифр) рисуется на карточке и ленте коллажа.

JSON
{ "gift": "PlushPepe-22", "format": "png" }

{ "collection": "Plush Pepe", "model": "Aqua Plush", "backdrop": "Electric Purple",
  "symbol": "Star", "number": "777", "format": "card" }

Форматы

Формат выбирается полем format. Цена в единицах тарифа — в скобках (1 = один PNG).

mp4 — видео (10)

Анимация модели на фоне с узором, 1062×1062, 60 кадров в секунду, ~3 с, ~1 МБ, video/mp4. Поддерживает speed.

gif — GIF (10)

То же видео как настоящий GIF: 512 px, 30 кадров в секунду, бесконечный повтор, ~3–4 МБ, image/gif. Поддерживает speed.

png — картинка (1)

Кадр без потерь 1062×1062, image/png. Поле frame — номер кадра анимации (60 кадров = 1 секунда), по умолчанию первый.

jpg — картинка, сжатая (1)

То же, что png, но JPEG: в 3–8 раз легче, удобно для ботов и превью. image/jpeg, качество — поле quality от 40 до 100 (по умолчанию 90). Поддерживает frame. JPG есть и у карточки (card_format: "jpg") и у коллажа (collage_format: "jpg") — по цене PNG.

card — карточка подарка (PNG 2 · видео и GIF 10)

Горизонтальная карточка как в Telegram: подарок, название, номер, модель. card_format: mp4 (по умолчанию), gif, png или jpg. Для собранного сочетания номер берётся из number. Видео и GIF поддерживают speed.

collage — коллаж (PNG — 1 за каждые 3 подарка · видео — 3 за подарок)

Сетка подарков как в Сборщике. Поля:

ПолеТипОписание
giftsarray1–18 подарков. Каждый — ссылка, слаг или объект {collection, model, backdrop, symbol, number}, можно вперемешку.
collage_formatstringpng (по умолчанию), jpg (сжатый, та же цена) или mp4 — живой коллаж.
ribbonsboolЛенты с номерами в углу. По умолчанию true. Номер — из ссылки или number.
symbolsboolУзор символов на фоне ячеек. По умолчанию true.
bgstringФон холста: black (по умолчанию), white, graphite, cream, navy, plum, forest, sand.

Раскладка: по 3 в ряд; 1–2 подарка стоят в один ряд без пустых мест; неполный последний ряд не заполняется пустыми карточками. Видео-коллажи собираются по одному, поэтому дольше ждут в очереди.

lottie — анимация (2)

Lottie JSON 512×512: фон-градиент, узор символов и анимированная модель — собирается у нас из частей подарка: модели, символа и цветов фона. Играется в lottie-web, rlottie и любом Lottie-плеере. application/json, ~150 КБ.

tgs — стикер Telegram (2)

Та же анимация, сжатая gzip, — формат анимированных стикеров Telegram. ~15–20 КБ.

svg — вектор кадра (3)

Любой кадр (frame) векторным SVG 512×512: кривые без потерь, градиенты, маски. Можно масштабировать без мыла и красить через CSS. Эффекты Lottie (размытие, тени) в SVG не переносятся. image/svg+xml, ~60 КБ.

json — данные подарка (1)

Без рендера: из чего собран подарок. Блок build — слои снизу вверх: фон (радиальный градиент center → edge), узор из символа цвета pattern и модель по центру. У модели и символа — название, редкость и файлы (Lottie и PNG), всё с нашего сервера. Плюс длительность анимации.

JSON
{
  "collection": "Plush Pepe", "model": "Aqua Plush", "backdrop": "Electric Purple", "symbol": "Star",
  "colors": { "center": "#c27ce6", "edge": "#8a4fc0", "pattern": "#6b2fa3", "text": "#f1d2ff" },
  "build": {
    "backdrop": { "name": "Electric Purple", "rarity": "2%", "center": "#c27ce6", "edge": "#8a4fc0", "pattern": "#6b2fa3", "text": "#f1d2ff" },
    "symbol":   { "name": "Star", "rarity": "0.4%", "color": "#6b2fa3",
                  "lottie": "https://bot-production-b17c.up.railway.app/cdn/patterns/Plush%20Pepe/lottie/Star.json", "png": "https://bot-production-b17c.up.railway.app/cdn/patterns/Plush%20Pepe/png/Star.png" },
    "model":    { "name": "Aqua Plush", "rarity": "1.2%",
                  "lottie": "https://bot-production-b17c.up.railway.app/cdn/models/Plush%20Pepe/lottie/Aqua%20Plush.json", "png": "https://bot-production-b17c.up.railway.app/cdn/models/Plush%20Pepe/png/Aqua%20Plush.png" }
  },
  "rarity": { "model": "1.2%", "backdrop": "2%", "symbol": "0.4%" },
  "animation": { "fps": 60, "frames": 180, "duration_sec": 3.0 },
  "slug": "PlushPepe-22", "number": 22, "link": "https://t.me/nft/PlushPepe-22"
}

Замедление (speed)

Для mp4, gif и видео-карточки: 1, 0.75, 0.5, 0.33, 0.25. Анимация растягивается плавно, без повторов кадров: при 0.5 трёхсекундное видео идёт 6 секунд. Цена: 0.5 — ×2, 0.33 и 0.25 — ×3.

Рендер

POST/v1/render

Ставит задачу в очередь. Тело — JSON со всеми полями ниже (подарок + формат + параметры формата).

ПолеТипОписание
giftstringСсылка или слаг настоящего подарка.
collection, model, backdrop, symbolstringСочетание вместо gift; symbol необязателен.
numberstringНомер для карточки и ленты коллажа, до 7 цифр.
formatstringmp4 (по умолчанию), gif, png, jpg, card, collage, lottie, tgs, svg, json.
framenumberКадр для png, jpg и svg.
qualitynumberКачество JPEG 40–100 для jpg (картинка, карточка, коллаж). По умолчанию 90.
card_formatstringДля card: mp4, gif, png, jpg.
gifts, collage_format, ribbons, symbols, bg—Для collage, см. выше.
speednumberЗамедление видео: 1, 0.75, 0.5, 0.33, 0.25.
waitnumberСколько секунд держать ответ до готовности: 0–90. Без него ответ приходит сразу со статусом queued.

Ответ — 202, пока задача в работе, и 200, когда она закончилась:

JSON
{
  "ok": true,
  "job_id": "3f1c9a…",
  "status": "done",
  "format": "mp4",
  "file_url": "https://…/v1/jobs/3f1c9a…/file",
  "content_type": "video/mp4",
  "file_name": "PlushPepe-22.mp4",
  "size": 1843221,
  "render_ms": 4120,
  "expires_at": 1763140800,
  "cost": 10,
  "credits_left": 1990
}
Поле ответаТипОписание
job_idstringId задачи для /v1/jobs/{job_id}.
statusstringqueued, rendering, done или error.
positionnumberМесто в очереди, пока queued.
file_url, content_type, file_name, size—Готовый файл — когда done.
render_msnumberСколько шёл рендер.
expires_atnumberUnix-время, когда файл удалится.
cost, credits_leftnumberСколько единиц тарифа списано и сколько осталось (1 = один PNG). При ошибке cost = 0.
errorstringПричина, когда error: gift_not_found или render_failed.

Задачи и файлы

GET/v1/jobs/{job_id}

Статус задачи — те же поля, что у ответа рендера. Принимает ?wait= (до 90 с): удобно ждать готовности одним запросом вместо частых опросов.

statusЧто значит
queuedЖдёт в очереди.
renderingРендерится. PNG, JSON, Lottie, SVG — доли секунды, видео — 3–10 секунд, с замедлением и видео-коллажи — дольше.
doneГотово, есть file_url.
errorНе получилось: gift_not_found (нет такого подарка) или render_failed. Не списывается.
GET/v1/jobs/{job_id}/file

Сам файл, с тем же ключом. Задача видна только ключу, которым её поставили. Через час после готовности файл и задача удаляются.

Ключ и остаток

GET/v1/me

Тариф, остаток и лимиты ключа. Остаток credits — в единицах тарифа: PNG — 1, JSON — 1, Lottie и TGS — 2, SVG — 3, видео и GIF — 10, карточка — 2 (PNG) или 10 (видео, GIF), коллаж PNG — 1 за каждые 3 подарка, коллаж-видео — 3 за подарок.

JSON
{
  "ok": true,
  "key": { "name": "Gift Market Bot", "hint": "9f3a" },
  "plan": "start",
  "plan_until": 1765900000,
  "credits": { "plan": 23410, "pack": 10000, "total": 33410 },
  "limits": { "rps": 2, "parallel_jobs": 2, "daily_credits": 3000 },
  "today": { "renders": 59, "credits": 590 },
  "renders_total": 412,
  "credits_spent": 8120,
  "costs": { "png": 1, "mp4": 10, "gif": 10, "card": 10, "card_png": 2, … }
}
ПолеТипОписание
plan, plan_untilstring, numberТариф (trial, mini, start, pro, business, pack, none) и до какого времени он действует.
creditsobjectОстаток: plan — тарифа (сгорает в конце срока), pack — пакетов (не сгорает), total — всего. Сначала тратится тариф.
limitsobjectЗапросов в секунду, задач одновременно и дневной лимит в единицах.
todayobjectСегодня (UTC): успешных запросов и списано единиц.
costsobjectЦена каждого формата в единицах.

Ошибки

Ошибка всегда приходит JSON-ом: {"ok": false, "error": "код", "message": "текст"}. В message — объяснение по-русски.

HTTPerrorЧто значит
400bad_jsonТело — не JSON-объект.
400bad_gift, missing_params, unknown_collection, bad_collection, bad_model, bad_backdrop, bad_symbol, bad_numberНе получилось понять подарок: нет ссылки или полей, коллекция не найдена, недопустимые символы, номер длиннее 7 цифр.
400bad_format, bad_card_format, bad_speed, bad_frame, bad_qualityНеизвестный формат или параметр.
400bad_gifts, bad_collage_format, bad_bgКоллаж: пустой список или больше 18, неизвестный формат или фон.
401no_key, bad_keyНет ключа или он неверный/перевыпущен.
402no_creditsОстатка тарифа не хватает на этот запрос — пополни ключ в кабинете. В ответе есть cost и credits_left.
403key_disabled, banned, coming_soonКлюч отключён (причина в message), доступ закрыт или API ещё не открыто.
404not_foundЗадача чужая или уже удалена.
409not_readyФайл ещё не готов — дождаться done.
429daily_limitДневной лимит тарифа исчерпан — обновится в 00:00 UTC. Есть daily_limit и used_today.
429too_many_jobs, too_many_requestsСлишком много задач одновременно или запросов в секунду — повторить чуть позже.
503busy, disabledОчередь заполнена — повторить через retry_after секунд; API временно выключено.

Советы

Примеры

import requests

API = "https://bot-production-b17c.up.railway.app"
H = {"Authorization": "Bearer nfp_…"}

# карточка собранного подарка, замедленная в 2 раза
r = requests.post(f"{API}/v1/render", headers=H, json={
    "collection": "Plush Pepe", "model": "Aqua Plush",
    "backdrop": "Electric Purple", "symbol": "Star",
    "format": "card", "card_format": "mp4", "speed": 0.5, "wait": 90,
}).json()

while r["status"] in ("queued", "rendering"):
    r = requests.get(f"{API}/v1/jobs/{r['job_id']}?wait=60", headers=H).json()

if r["status"] == "done":
    open(r["file_name"], "wb").write(requests.get(r["file_url"], headers=H).content)
else:
    print("ошибка:", r.get("error"))
Ключ — секрет: не кладите его в код сайта, который видят посетители. Вызывайте API со своего сервера. Если ключ утёк, нажмите в боте «Новый ключ» — старый сразу перестанет работать.