Документация API

REST‑API для генерации изображений, видео и озвучки. Один общий контракт, асинхронная генерация, оплата по факту с API‑кошелька. Все суммы — в рублях.

Базовый URLhttps://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.

🔒 Ключи — только для server‑to‑server. Никогда не клади ключ в браузерный код или в репозиторий. Для работы из редактора (Claude Code, Cursor) и терминала используй вход через аккаунт — см. CLI, MCP и Skills.

Каталог моделей

GET /models

Возвращает список доступных медиа‑моделей с категорией, названием и справочной ценой. Необязательный фильтр ?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" }
  ]
}
ПолеТипОписание
idstringидентификатор модели для поля model в запросах
categorystringimage / video / audio
display_namestringчеловекочитаемое название
price_rubstringцена за вызов для вашего канала — по ключу это реальная сумма списания с API‑кошелька. Точная сумма конкретного вызова также приходит в поле cost_rub ответа
unitstringединица, в которой указана 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" }
  }
}
HTTPcodeКогда
400ERR_INVALID_REQUESTошибка в теле запроса, нерешаемый вход
401ERR_API_KEY_INVALIDключ отсутствует, неверный, отозван или истёк
402ERR_INSUFFICIENT_BALANCEмало средств на API‑кошельке
402ERR_QUOTA_EXCEEDEDпревышен месячный лимит расходов ключа или лимит параллельных генераций
404ERR_MODEL_NOT_FOUNDмодель не существует или не доступна в API
404ERR_NOT_FOUNDсоздание с таким id не найдено
429ERR_RATE_LIMITпревышен лимит запросов в минуту или слишком частый опрос статуса
502ERR_GENERATION_FAILEDсбой провайдера — средства возвращены, можно повторить
500ERR_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

POST /images/generate

Генерирует изображение по промпту. Если передать входное изображение (image_file_id) — модель выполнит редактирование (это та же операция, не отдельная). Тарификация — за изображение.

Параметры тела

ПолеТипОписание
model requiredstringid из каталога, напр. nano-banana, nano-banana-pro, seedream-4.5-text-to-image, z-image
promptstringописание (до 4000 симв.)
negative_promptstringчто исключить (до 4000 симв.)
nintegerчисло вариантов, 1–4 (по умолч. 1)
aspect_ratiostring1:1, 16:9, 9:16, 4:3… (переопределяет width/height)
width, heightinteger256–2048 (по умолч. 1024×1024)
image_file_idstringid из /uploads — включает режим редактирования (img2img)
image_file_idsstring[]до 16 референс‑изображений
mask_file_idstringмаска (inpainting), id из /uploads
resolution, output_formatstringдля моделей с поддержкой (напр. 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

POST /images/upscale

Увеличивает разрешение изображения (Topaz / Recraft). Промпт не нужен.

ПолеТипОписание
model requiredstringtopaz-image-upscale или recraft-crisp-upscale
image_file_id requiredstringвходное изображение из /uploads
upscale_factorinteger1 / 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

POST /images/remove-background

Удаляет фон с изображения (Recraft). Промпт не нужен.

ПолеТипОписание
model requiredstringrecraft-remove-background
image_file_id requiredstringвходное изображение из /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

POST /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 requiredstringнапр. veo-3-1-text-to-video, kling-2-6-text-to-video, seedance-2-text-to-video
promptstringописание сцены (до 20000 симв.)
durationintegerдлительность в секундах, 2–120 (лимит модели)
aspect_ratiostring16:9, 9:16, 1:1
resolutionstring720p, 1080p (зависит от модели)
image_file_idstringисходный кадр для image‑to‑video
negative_prompt, seedstring / 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)

POST /audio/generate

Синтез речи (ElevenLabs). Возвращает аудиофайл. Оплата — за каждые 1000 символов текста.

ПолеТипОписание
text requiredstringтекст для озвучки (1–5000 симв.)
modelstringeleven_multilingual_v2 (по умолч.) или eleven_turbo_v2_5
voicestringимя голоса (по умолч. Rachel): Rachel, Aria, Roger, Sarah, Laura, Charlie, George, Callum, River, Liam, Charlotte, Alice, Matilda, Will, Jessica, Eric, Chris, Brian, Daniel, Lily, Bill
stabilityfloat0.0–1.0 (по умолч. 0.5)
similarity_boostfloat0.0–1.0 (по умолч. 0.75)
stylefloat0.0–1.0 (по умолч. 0.0)
speedfloat0.7–1.2 (по умолч. 1.0)
timestampsbooleanвернуть тайминги слов (по умолч. 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

POST /audio/dialogue

Многоголосый диалог (ElevenLabs text‑to‑dialogue‑v3): 2–20 реплик, у каждой свой голос. Оплата — за каждые 1000 символов суммарно по всем репликам.

ПолеТипОписание
dialogue requiredarray2–20 реплик вида {"text","voice"} (text до 2000 симв.)
modelstringпо умолч. elevenlabs/text-to-dialogue-v3
stabilityfloat0.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

POST /uploads

Загружает входной файл (изображение, аудио или видео) и возвращает file_id для использования в полях image_file_id / audio_file_id / video_file_id. Формат — multipart/form-data.

Поле формыТипОписание
file requiredbinaryсодержимое файла
kind requiredstringimage (до 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

GET /creations/{id}

Возвращает статус создания по 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_urlscompletedмассив ссылок на результат (картинка/видео/аудио)
result_textcompletedтекстовый результат (для текстовых операций)
errorfailedкраткое описание ошибки (без внутренних деталей)

Доступ привязан к аккаунту: ты видишь только свои создания — чужой или несуществующий 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.

Как подключить — на странице обзора для разработчиков.