Документация API
REST‑API для генерации изображений, видео и озвучки. Один общий контракт, асинхронная генерация, оплата по факту с API‑кошелька. Все суммы — в рублях.
| Базовый URL | https://api.gptrf.ru/api/public/v1 |
| Версия | v1 (в пути) |
| Формат | JSON (загрузка файлов — multipart/form-data) |
| Аутентификация | API‑ключ: Authorization: Bearer gptrf_live_… |
| Модель работы | асинхронная: запрос → id → опрос /creations/{id} или вебхук |
API media‑only: доступны только медиа‑модели (изображения, видео, аудио). Полный список — в каталоге. Текстовые/LLM‑модели через этот API не вызываются.
Быстрый старт
Три шага: создай ключ в консоли разработчика, отправь генерацию, опроси результат.
# 1. Отправляем генерацию изображения
curl -X POST https://api.gptrf.ru/api/public/v1/images/generate \
-H "Authorization: Bearer gptrf_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"model":"nano-banana","prompt":"неоновый город под дождём"}'
# 202 Accepted
{
"id": "4f9c8b2e-1a7d-4e3b-9c10-2f5a6b7c8d90",
"status": "queued",
"task_id": "task_abc123",
"cost_rub": 8.00
}
# 2. Опрашиваем статус по id
curl https://api.gptrf.ru/api/public/v1/creations/4f9c8b2e-1a7d-4e3b-9c10-2f5a6b7c8d90 \
-H "Authorization: Bearer gptrf_live_xxxxxxxxxxxxxxxx"
# 200 OK — когда готово
{
"id": "4f9c8b2e-1a7d-4e3b-9c10-2f5a6b7c8d90",
"status": "completed",
"result_urls": ["https://cdn.gptrf.ru/o/4f9c8b2e.png"]
}cost_rub в ответе — это сумма, списанная с API‑кошелька за этот вызов. При сбое генерации средства возвращаются автоматически.Аутентификация
Передавай API‑ключ в заголовке Authorization: Bearer gptrf_live_… (или X-API-Key: gptrf_live_…). Ключ создаётся в консоли и показывается один раз — сохрани его сразу. Ключи бывают двух окружений: gptrf_live_… и gptrf_test_….
# Любой из двух заголовков: Authorization: Bearer gptrf_live_xxxxxxxxxxxxxxxx X-API-Key: gptrf_live_xxxxxxxxxxxxxxxx
Запросы с ключа списываются с отдельного API‑кошелька (метрическая оплата по факту); тарифы и подписки сайта на этот канал не действуют. Без валидного ключа — 401 ERR_API_KEY_INVALID.
Каталог моделей
Возвращает список доступных медиа‑моделей с категорией, названием и справочной ценой. Необязательный фильтр ?category= принимает image, video или audio (иное значение — 400).
curl "https://api.gptrf.ru/api/public/v1/models?category=image" \
-H "Authorization: Bearer gptrf_live_…"
# 200 OK
{
"models": [
{ "id": "nano-banana", "category": "image", "display_name": "Nano Banana", "price_rub": "8.00", "unit": "per_image" },
{ "id": "veo-3-1-text-to-video", "category": "video", "display_name": "Veo 3.1", "price_rub": "60.00", "unit": "per_8_sec" },
{ "id": "seedance-2-text-to-video", "category": "video", "display_name": "Seedance 2", "price_rub": "20.00", "unit": "per_second" },
{ "id": "x-ai/grok-video", "category": "video", "display_name": "Grok Video", "price_rub": "30.00", "unit": "per_generation" },
{ "id": "eleven_multilingual_v2", "category": "audio", "display_name": "Eleven Multilingual v2", "price_rub": "12.00", "unit": "per_1000_chars" }
]
}| Поле | Тип | Описание |
|---|---|---|
id | string | идентификатор модели для поля model в запросах |
category | string | image / video / audio |
display_name | string | человекочитаемое название |
price_rub | string | цена за вызов для вашего канала — по ключу это реальная сумма списания с API‑кошелька. Точная сумма конкретного вызова также приходит в поле cost_rub ответа |
unit | string | единица, в которой указана price_rub: per_image / per_second / per_8_sec / per_5_sec / per_10_sec / per_generation / per_1000_chars / per_minute. Блочные единицы (per_8_sec/per_5_sec/per_10_sec) считаются ceil(длительность / блок), поэтому длиннее клип — кратно дороже; только per_generation фиксирован |
Async и статусы
Любая генерация асинхронная. POST возвращает 202 Accepted с id; результат узнают опросом GET /creations/{id} или через вебхук.
Тело ответа на любую генерацию (202):
{
"id": "4f9c8b2e-…", // id создания — для опроса статуса
"status": "queued", // queued | processing | completed | failed
"task_id": "task_abc123",// id задачи у провайдера (может быть null вначале)
"cost_rub": 8.00 // списано с API-кошелька (₽)
}Возможные значения статуса:
| status | Значение |
|---|---|
queued | принято, ожидает запуска |
processing | выполняется у провайдера |
completed | готово — см. result_urls (или result_text) |
failed | ошибка — см. error; средства возвращены |
Идемпотентность
Передавай X-Idempotency-Key на любой POST‑генерации — повтор с тем же ключом вернёт тот же результат и не спишет дважды. Используй уникальный ключ (UUID) на каждую логическую операцию — безопасно для ретраев при сетевых сбоях.
curl -X POST https://api.gptrf.ru/api/public/v1/images/generate \
-H "Authorization: Bearer gptrf_live_…" \
-H "X-Idempotency-Key: 7f3a1c2e-9b8d-4a5f-6c7e-1d2e3f4a5b6c" \
-H "Content-Type: application/json" \
-d '{"model":"nano-banana","prompt":"кот в скафандре"}'Ошибки
Все ошибки — единый JSON‑конверт со стабильными кодами:
{
"error": {
"code": "ERR_INSUFFICIENT_BALANCE",
"message": "insufficient api wallet balance",
"details": { "required_rub": 8.00, "top_up_url": "/dashboard/developer/wallet" }
}
}| HTTP | code | Когда |
|---|---|---|
| 400 | ERR_INVALID_REQUEST | ошибка в теле запроса, нерешаемый вход |
| 401 | ERR_API_KEY_INVALID | ключ отсутствует, неверный, отозван или истёк |
| 402 | ERR_INSUFFICIENT_BALANCE | мало средств на API‑кошельке |
| 402 | ERR_QUOTA_EXCEEDED | превышен месячный лимит расходов ключа или лимит параллельных генераций |
| 404 | ERR_MODEL_NOT_FOUND | модель не существует или не доступна в API |
| 404 | ERR_NOT_FOUND | создание с таким id не найдено |
| 429 | ERR_RATE_LIMIT | превышен лимит запросов в минуту или слишком частый опрос статуса |
| 502 | ERR_GENERATION_FAILED | сбой провайдера — средства возвращены, можно повторить |
| 500 | ERR_INTERNAL | внутренняя ошибка (редко; логируется) |
Лимиты
Лимиты задаются на каждый API‑ключ:
| Лимит | Описание |
|---|---|
| Запросов в минуту | скользящее окно на ключ; превышение — 429 ERR_RATE_LIMIT с limit и window в details |
| Параллельность | одновременные генерации на ключ, отдельно по медиа (изображения / видео / аудио); превышение — 402 ERR_QUOTA_EXCEEDED |
| Месячный лимит расходов | необязательный потолок (₽) на ключ; превышение — 402 ERR_QUOTA_EXCEEDED |
| Опрос статуса | не чаще раза в 5 секунд на одно создание; чаще — 429 с min_interval_seconds |
Лимиты ключа настраиваются в консоли. При 429 повтори запрос после указанного интервала.
Оплата
Канал Developer API оплачивается с отдельного API‑кошелька по факту использования (pay‑as‑you‑go), независимо от тарифов и подписок сайта. За каждый успешный вызов списывается cost_rub (он возвращается в ответе). При сбое генерации сумма возвращается автоматически.
Пополнить кошелёк и смотреть расходы — в консоли → Кошелёк. При нулевом балансе генерация вернёт 402 ERR_INSUFFICIENT_BALANCE ещё до запуска (списания не происходит).
images.generate
Генерирует изображение по промпту. Если передать входное изображение (image_file_id) — модель выполнит редактирование (это та же операция, не отдельная). Тарификация — за изображение.
Параметры тела
| Поле | Тип | Описание |
|---|---|---|
model required | string | id из каталога, напр. nano-banana, nano-banana-pro, seedream-4.5-text-to-image, z-image |
prompt | string | описание (до 4000 симв.) |
negative_prompt | string | что исключить (до 4000 симв.) |
n | integer | число вариантов, 1–4 (по умолч. 1) |
aspect_ratio | string | 1:1, 16:9, 9:16, 4:3… (переопределяет width/height) |
width, height | integer | 256–2048 (по умолч. 1024×1024) |
image_file_id | string | id из /uploads — включает режим редактирования (img2img) |
image_file_ids | string[] | до 16 референс‑изображений |
mask_file_id | string | маска (inpainting), id из /uploads |
resolution, output_format | string | для моделей с поддержкой (напр. 1K/2K/4K, png/jpg) |
Пример
curl -X POST https://api.gptrf.ru/api/public/v1/images/generate \
-H "Authorization: Bearer gptrf_live_…" \
-H "Content-Type: application/json" \
-d '{
"model": "nano-banana-pro",
"prompt": "горное озеро на рассвете, фотореализм",
"aspect_ratio": "16:9",
"n": 1
}'
# 202 Accepted
{ "id": "4f9c…", "status": "queued", "task_id": "task_…", "cost_rub": 30.00 }images.upscale
Увеличивает разрешение изображения (Topaz / Recraft). Промпт не нужен.
| Поле | Тип | Описание |
|---|---|---|
model required | string | topaz-image-upscale или recraft-crisp-upscale |
image_file_id required | string | входное изображение из /uploads |
upscale_factor | integer | 1 / 2 / 4 / 8 (для Topaz) |
curl -X POST https://api.gptrf.ru/api/public/v1/images/upscale \
-H "Authorization: Bearer gptrf_live_…" \
-H "Content-Type: application/json" \
-d '{"model":"topaz-image-upscale","image_file_id":"file_abc123","upscale_factor":4}'images.remove-background
Удаляет фон с изображения (Recraft). Промпт не нужен.
| Поле | Тип | Описание |
|---|---|---|
model required | string | recraft-remove-background |
image_file_id required | string | входное изображение из /uploads |
curl -X POST https://api.gptrf.ru/api/public/v1/images/remove-background \
-H "Authorization: Bearer gptrf_live_…" \
-H "Content-Type: application/json" \
-d '{"model":"recraft-remove-background","image_file_id":"file_abc123"}'video.generate
Генерирует видеоклип из текста или из изображения (image‑to‑video, если передать image_file_id).
Тарификация зависит от модели и считается тремя способами:
- за блок фиксированной длины: veo — за каждые 8 сек, kling — за 5 сек, sora — за 10 сек (короткий клип = 1 блок, длиннее — кратно: цена ×
ceil(длительность / блок)); - за секунду: seedance (цена × длительность);
- фиксированно за всю генерацию: grok / sora‑pro (единица
video).
Точная сумма приходит в cost_rub; единица тарификации каждой модели — в поле unit каталога /models.
| Поле | Тип | Описание |
|---|---|---|
model required | string | напр. veo-3-1-text-to-video, kling-2-6-text-to-video, seedance-2-text-to-video |
prompt | string | описание сцены (до 20000 симв.) |
duration | integer | длительность в секундах, 2–120 (лимит модели) |
aspect_ratio | string | 16:9, 9:16, 1:1 |
resolution | string | 720p, 1080p (зависит от модели) |
image_file_id | string | исходный кадр для image‑to‑video |
negative_prompt, seed | string / integer | что исключить; сид для воспроизводимости |
curl -X POST https://api.gptrf.ru/api/public/v1/video/generate \
-H "Authorization: Bearer gptrf_live_…" \
-H "Content-Type: application/json" \
-d '{"model":"veo-3-1-text-to-video","prompt":"кот идёт по полю на закате","duration":8}'/creations/{id} с интервалом в несколько секунд или используй вебхук.audio.generate (TTS)
Синтез речи (ElevenLabs). Возвращает аудиофайл. Оплата — за каждые 1000 символов текста.
| Поле | Тип | Описание |
|---|---|---|
text required | string | текст для озвучки (1–5000 симв.) |
model | string | eleven_multilingual_v2 (по умолч.) или eleven_turbo_v2_5 |
voice | string | имя голоса (по умолч. Rachel): Rachel, Aria, Roger, Sarah, Laura, Charlie, George, Callum, River, Liam, Charlotte, Alice, Matilda, Will, Jessica, Eric, Chris, Brian, Daniel, Lily, Bill |
stability | float | 0.0–1.0 (по умолч. 0.5) |
similarity_boost | float | 0.0–1.0 (по умолч. 0.75) |
style | float | 0.0–1.0 (по умолч. 0.0) |
speed | float | 0.7–1.2 (по умолч. 1.0) |
timestamps | boolean | вернуть тайминги слов (по умолч. false) |
curl -X POST https://api.gptrf.ru/api/public/v1/audio/generate \
-H "Authorization: Bearer gptrf_live_…" \
-H "Content-Type: application/json" \
-d '{"model":"eleven_multilingual_v2","text":"Привет! Это синтез речи.","voice":"Rachel"}'audio.dialogue
Многоголосый диалог (ElevenLabs text‑to‑dialogue‑v3): 2–20 реплик, у каждой свой голос. Оплата — за каждые 1000 символов суммарно по всем репликам.
| Поле | Тип | Описание |
|---|---|---|
dialogue required | array | 2–20 реплик вида {"text","voice"} (text до 2000 симв.) |
model | string | по умолч. elevenlabs/text-to-dialogue-v3 |
stability | float | 0.0–1.0 (по умолч. 0.5) |
curl -X POST https://api.gptrf.ru/api/public/v1/audio/dialogue \
-H "Authorization: Bearer gptrf_live_…" \
-H "Content-Type: application/json" \
-d '{
"dialogue": [
{ "text": "Привет, как дела?", "voice": "Sarah" },
{ "text": "Отлично, спасибо!", "voice": "Roger" }
]
}'uploads
Загружает входной файл (изображение, аудио или видео) и возвращает file_id для использования в полях image_file_id / audio_file_id / video_file_id. Формат — multipart/form-data.
| Поле формы | Тип | Описание |
|---|---|---|
file required | binary | содержимое файла |
kind required | string | image (до 25 МиБ), audio (до 100 МиБ), video (до 500 МиБ) |
curl -X POST https://api.gptrf.ru/api/public/v1/uploads \
-H "Authorization: Bearer gptrf_live_…" \
-F "file=@/path/to/image.jpg" \
-F "kind=image"
# 200 OK
{
"file_id": "file_abc123",
"url": "https://storage.gptrf.ru/…",
"expires_at": "2026-07-16T12:00:00Z"
}file_id вскоре после загрузки.creations
Возвращает статус создания по id из ответа генерации. Опрашивай не чаще раза в 5 секунд на одно создание.
# выполняется
{ "id": "4f9c…", "status": "processing" }
# готово (медиа)
{ "id": "4f9c…", "status": "completed", "result_urls": ["https://cdn.gptrf.ru/o/4f9c.png"] }
# ошибка (средства возвращены)
{ "id": "4f9c…", "status": "failed", "error": "генерация не удалась" }| Поле | Когда | Описание |
|---|---|---|
status | всегда | queued / processing / completed / failed |
result_urls | completed | массив ссылок на результат (картинка/видео/аудио) |
result_text | completed | текстовый результат (для текстовых операций) |
error | failed | краткое описание ошибки (без внутренних деталей) |
Доступ привязан к аккаунту: ты видишь только свои создания — чужой или несуществующий id вернёт 404.
Вебхуки
Чтобы не опрашивать статус, зарегистрируй URL вебхука в консоли → Вебхуки. На готовности (или сбое) создания мы пришлём POST на твой URL с подписью.
| Заголовок | Описание |
|---|---|
X-Webhook-Signature-256 | подпись вида sha256=<hex>: HMAC‑SHA256 строки {X-Timestamp}.{тело} вашим секретом вебхука — сверь её, прежде чем доверять событию |
X-Timestamp | время отправки — отклоняй слишком старые события (защита от повтора) |
Доставка с ретраями и экспоненциальной задержкой — отвечай 2xx как можно быстрее и обрабатывай событие асинхронно.
CLI, MCP и Skills
Кроме ключей, к тем же операциям можно подключиться из терминала и AI‑редакторов через вход по аккаунту (OAuth) — тогда генерации списываются с баланса аккаунта, а не с API‑кошелька:
- CLI
@gptrf/cli— командыgptrf image,gptrf video,gptrf audio,gptrf model. - MCP — сервер инструментов для Claude Code, Cursor и других MCP‑клиентов.
- Skills — плагин для Claude Code.
Как подключить — на странице обзора для разработчиков.