Тот же движок, что у бота: видео, GIF, PNG и карточки подарков, коллажи до 18 штук, Lottie, TGS, SVG любого кадра и данные подарка в JSON. По ссылке на подарок или по любому сочетанию коллекции, модели, фона и символа. Видео можно замедлить в 2–4 раза.
Открыть кабинет APIТариф — это объём запросов на месяц. Форматы можно смешивать: каждый запрос берёт свою долю тарифа.
| Формат | Мини | Старт | Про | Бизнес | Пакет |
|---|---|---|---|---|---|
| PNG, JPG, JSON | 12 000 | 40 000 | 120 000 | 400 000 | 10 000 |
| Lottie, TGS | 6 000 | 20 000 | 60 000 | 200 000 | 5 000 |
| SVG | 4 000 | 13 333 | 40 000 | 133 333 | 3 333 |
| Видео, GIF | 1 200 | 4 000 | 12 000 | 40 000 | 1 000 |
| Карточка PNG | 6 000 | 20 000 | 60 000 | 200 000 | 5 000 |
| Карточка видео / GIF | 1 200 | 4 000 | 12 000 | 40 000 | 1 000 |
| Коллаж из 9 (PNG) | 4 000 | 13 333 | 40 000 | 133 333 | 3 333 |
| Коллаж из 9 (видео) | 444 | 1 481 | 4 444 | 14 814 | 370 |
Замедленное видео ½× считается как 2 видео, ⅓× и ¼× — как 3. Неудачный запрос не списывается. Остаток тарифа переносится при продлении.
Нужно больше, чем «Бизнес», — Enterprise: свой объём, дневной лимит и приоритет. Калькулятор — в кабинете API. Оплата — GRAM: переводом с комментарием (мемо) или счётом в xRocket.
/api) и нажми «Создать API-ключ»: название, сервис и пара слов о проекте. Ключ показывается один раз — сохрани его. В кабинете — остаток, статистика и пополнение.Authorization: Bearer nfp_… (или заголовок X-API-Key).POST /v1/render с "wait": 60 — ответ придёт, когда файл готов, со ссылкой file_url.file_url с тем же ключом. Файл хранится 1 час.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 ключей, у каждого свой тариф, остаток и статистика. Ключ можно перевыпустить в кабинете: старый сразу перестаёт работать.
| Тариф | Запросов в секунду | Задач одновременно | В день до |
|---|---|---|---|
| Пробный | 1 | 1 | 300 PNG / 30 видео |
| Мини | 1 | 1 | 1 000 PNG / 100 видео |
| Старт | 2 | 2 | 3 000 PNG / 300 видео |
| Про | 5 | 4 | 8 000 PNG / 800 видео |
| Бизнес | 10 | 6 | 25 000 PNG / 2 500 видео |
| Пакет | 2 | 2 | 3 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 цифр) рисуется на карточке и ленте коллажа.
{ "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 за подарок)Сетка подарков как в Сборщике. Поля:
| Поле | Тип | Описание |
|---|---|---|
gifts | array | 1–18 подарков. Каждый — ссылка, слаг или объект {collection, model, backdrop, symbol, number}, можно вперемешку. |
collage_format | string | png (по умолчанию), jpg (сжатый, та же цена) или mp4 — живой коллаж. |
ribbons | bool | Ленты с номерами в углу. По умолчанию true. Номер — из ссылки или number. |
symbols | bool | Узор символов на фоне ячеек. По умолчанию true. |
bg | string | Фон холста: 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), всё с нашего сервера. Плюс длительность анимации.
{
"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.
/v1/renderСтавит задачу в очередь. Тело — JSON со всеми полями ниже (подарок + формат + параметры формата).
| Поле | Тип | Описание |
|---|---|---|
gift | string | Ссылка или слаг настоящего подарка. |
collection, model, backdrop, symbol | string | Сочетание вместо gift; symbol необязателен. |
number | string | Номер для карточки и ленты коллажа, до 7 цифр. |
format | string | mp4 (по умолчанию), gif, png, jpg, card, collage, lottie, tgs, svg, json. |
frame | number | Кадр для png, jpg и svg. |
quality | number | Качество JPEG 40–100 для jpg (картинка, карточка, коллаж). По умолчанию 90. |
card_format | string | Для card: mp4, gif, png, jpg. |
gifts, collage_format, ribbons, symbols, bg | — | Для collage, см. выше. |
speed | number | Замедление видео: 1, 0.75, 0.5, 0.33, 0.25. |
wait | number | Сколько секунд держать ответ до готовности: 0–90. Без него ответ приходит сразу со статусом queued. |
Ответ — 202, пока задача в работе, и 200, когда она закончилась:
{
"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_id | string | Id задачи для /v1/jobs/{job_id}. |
status | string | queued, rendering, done или error. |
position | number | Место в очереди, пока queued. |
file_url, content_type, file_name, size | — | Готовый файл — когда done. |
render_ms | number | Сколько шёл рендер. |
expires_at | number | Unix-время, когда файл удалится. |
cost, credits_left | number | Сколько единиц тарифа списано и сколько осталось (1 = один PNG). При ошибке cost = 0. |
error | string | Причина, когда error: gift_not_found или render_failed. |
/v1/jobs/{job_id}Статус задачи — те же поля, что у ответа рендера. Принимает ?wait= (до 90 с): удобно ждать готовности одним запросом вместо частых опросов.
| status | Что значит |
|---|---|
| queued | Ждёт в очереди. |
| rendering | Рендерится. PNG, JSON, Lottie, SVG — доли секунды, видео — 3–10 секунд, с замедлением и видео-коллажи — дольше. |
| done | Готово, есть file_url. |
| error | Не получилось: gift_not_found (нет такого подарка) или render_failed. Не списывается. |
/v1/jobs/{job_id}/fileСам файл, с тем же ключом. Задача видна только ключу, которым её поставили. Через час после готовности файл и задача удаляются.
/v1/meТариф, остаток и лимиты ключа. Остаток credits — в единицах тарифа: PNG — 1, JSON — 1, Lottie и TGS — 2, SVG — 3, видео и GIF — 10, карточка — 2 (PNG) или 10 (видео, GIF), коллаж PNG — 1 за каждые 3 подарка, коллаж-видео — 3 за подарок.
{
"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_until | string, number | Тариф (trial, mini, start, pro, business, pack, none) и до какого времени он действует. |
credits | object | Остаток: plan — тарифа (сгорает в конце срока), pack — пакетов (не сгорает), total — всего. Сначала тратится тариф. |
limits | object | Запросов в секунду, задач одновременно и дневной лимит в единицах. |
today | object | Сегодня (UTC): успешных запросов и списано единиц. |
costs | object | Цена каждого формата в единицах. |
Ошибка всегда приходит JSON-ом: {"ok": false, "error": "код", "message": "текст"}. В message — объяснение по-русски.
| HTTP | error | Что значит |
|---|---|---|
| 400 | bad_json | Тело — не JSON-объект. |
| 400 | bad_gift, missing_params, unknown_collection, bad_collection, bad_model, bad_backdrop, bad_symbol, bad_number | Не получилось понять подарок: нет ссылки или полей, коллекция не найдена, недопустимые символы, номер длиннее 7 цифр. |
| 400 | bad_format, bad_card_format, bad_speed, bad_frame, bad_quality | Неизвестный формат или параметр. |
| 400 | bad_gifts, bad_collage_format, bad_bg | Коллаж: пустой список или больше 18, неизвестный формат или фон. |
| 401 | no_key, bad_key | Нет ключа или он неверный/перевыпущен. |
| 402 | no_credits | Остатка тарифа не хватает на этот запрос — пополни ключ в кабинете. В ответе есть cost и credits_left. |
| 403 | key_disabled, banned, coming_soon | Ключ отключён (причина в message), доступ закрыт или API ещё не открыто. |
| 404 | not_found | Задача чужая или уже удалена. |
| 409 | not_ready | Файл ещё не готов — дождаться done. |
| 429 | daily_limit | Дневной лимит тарифа исчерпан — обновится в 00:00 UTC. Есть daily_limit и used_today. |
| 429 | too_many_jobs, too_many_requests | Слишком много задач одновременно или запросов в секунду — повторить чуть позже. |
| 503 | busy, disabled | Очередь заполнена — повторить через retry_after секунд; API временно выключено. |
wait — один запрос вместо опросов. Если пришёл queued, жди через GET /v1/jobs/{id}?wait=60.429 и 503 повторяй с паузой, растущей с каждой попыткой (1, 2, 4… секунды).png и json; для анимаций на сайте — lottie (лёгкий и чёткий на любом экране).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"))
const API = "https://bot-production-b17c.up.railway.app";
const H = { Authorization: "Bearer nfp_…", "Content-Type": "application/json" };
let r = await fetch(`${API}/v1/render`, {
method: "POST", headers: H,
body: JSON.stringify({ gift: "PlushPepe-22", format: "gif", wait: 60 }),
}).then(x => x.json());
while (r.status === "queued" || r.status === "rendering") {
r = await fetch(`${API}/v1/jobs/${r.job_id}?wait=60`, { headers: H }).then(x => x.json());
}
if (r.status === "done") {
const gif = await fetch(r.file_url, { headers: H }).then(x => x.arrayBuffer());
}
# 1) поставить задачу и дождаться
curl -s -X POST https://bot-production-b17c.up.railway.app/v1/render \
-H "Authorization: Bearer $NFP_KEY" -H "Content-Type: application/json" \
-d '{"gift":"PlushPepe-22","format":"png","wait":60}'
# 2) скачать файл по file_url из ответа
curl -s -H "Authorization: Bearer $NFP_KEY" -o gift.png "FILE_URL"