Документация API
Изображения, видео и музыка.
Один API, один баланс в рублях.
https://r-ai.studio/public-api/v1Создайте ключ
В разделе API кабинета . Сохраните ключ на своём сервере.
Выберите модель
Получите каталог с параметрами и ценами вашего аккаунта.
Отправьте задачу
Сохраните job_id и проверьте результат, когда генерация завершится.
Авторизация#
Передавайте ключ в HTTP-заголовке. Ключ даёт доступ к балансу и генерациям своего аккаунта.
Authorization: Bearer rai_live_YOUR_API_KEYТакже поддерживается X-API-Key. Если переданы оба заголовка, Bearer имеет приоритет. Ключ в query-параметрах не принимается.
Authorizationheader · string- Обязателен для всех методов, кроме /health. Формат: Bearer и ваш API-ключ через пробел.
Content-Typeheader · string- Для POST /generations: application/json. Тело — JSON в UTF-8, до 12 МБ.
Полный ключ показывается один раз при создании. Если он потерян или раскрыт, отзовите его в кабинете и создайте новый. В приложении храните ключ на сервере, вне исходного кода.
Для проверки в этой документации вставьте ключ в консоль. Он хранится только в памяти вкладки: не попадает в адрес страницы, примеры кода или хранилище браузера. Очистите поле после работы.
Проверка сервиса#
/healthПроверяет доступность HTTP API. Не проверяет состояние отдельных моделей и не запускает генерацию.
Параметров query и тела запроса нет.
Поля ответа 200 OK
okboolean- true — запрос обработан.
versionstring- Версия API: v1.
Пример ответа
{
"ok": true,
"version": "v1"
}Баланс#
/balanceВозвращает баланс владельца ключа в рублях. Веб-кабинет, бот и API используют общий баланс аккаунта.
Параметров query и тела запроса нет.
Поля ответа 200 OK
okboolean- Успешный запрос.
balanceobject- Баланс владельца ключа.
balance.currencystring- Валюта: RUB.
balance.amountnumber- Доступная сумма в рублях; может быть дробной.
Пример ответа
{
"ok": true,
"balance": {
"currency": "RUB",
"amount": 1250.5
}
}Каталог моделей#
/modelsВозвращает доступные модели, параметры, значения по умолчанию и цены для вашего аккаунта. Запрашивайте каталог перед интеграцией новой модели.
Параметров query и тела запроса нет.
Моделей в справочнике: 18. Каталог API включает только сценарии, доступные через этот API; аватары, апскейл, загрузка файлов и управление ключами выполняются в кабинете.
Поля ответа 200 OK
okboolean- Успешный запрос.
modelsarray<object>- Активные модели. Порядок и состав могут меняться.
models[].typestring- image, video или music.
models[].model_keystring- Ключ для создания генерации.
models[].titlestring- Название для интерфейса.
models[].price_rubnumber | object- Стоимость в рублях. Число — фиксированная цена; объект — таблица вариантов. Изображения: resolution → цена; GPT Image 2.5: generation_mode → text/reference → resolution → цена. Видео: resolution → duration_sec → цена, либо duration_sec → цена. Музыка: цена за одну задачу. Видео в таблице рассчитано без звука; режим Fast и звук могут менять стоимость.
models[].defaultsobject- Параметры по умолчанию для модели; null означает отсутствие настройки. Ключи описаны в параметрах генерации.
models[].parametersobject- Словарь parameter_name → описание параметра. null означает, что параметр не поддерживается.
models[].parameters.*.typestring- string, integer, number, boolean или array<string>.
models[].parameters.*.requiredboolean- Обязательность. Условные требования указаны в note; отсутствие поля не означает обязательность.
models[].parameters.*.valuesarray- Разрешённые значения, если параметр является перечислением.
models[].parameters.*.min / maxnumber- Числовые границы, число символов строки или максимум элементов массива. Поля могут отсутствовать.
models[].parameters.*.defaultany- Значение при отсутствии параметра; может отсутствовать.
models[].parameters.*.notestring- Дополнительные условия использования; может отсутствовать.
Пример ответа
{
"ok": true,
"models": [
{
"type": "image",
"model_key": "gpt-image-2.5",
"title": "GPT-Image 2.5",
"price_rub": {
"fast": {
"text": {
"1K": 3,
"2K": 5,
"4K": 8
},
"reference": {
"1K": 3,
"2K": 5,
"4K": 8
}
},
"quality": {
"text": {
"1K": 3,
"2K": 5,
"4K": 8
},
"reference": {
"1K": 3,
"2K": 5,
"4K": 8
}
}
},
"defaults": {
"aspect_ratio": "9:16",
"resolution": "1K",
"count": 1,
"generation_mode": "fast"
},
"parameters": {
"prompt": {
"type": "string",
"required": true,
"max": 20000,
"min": 1
},
"aspect_ratio": {
"type": "string",
"values": [
"auto",
"1:1",
"3:2",
"2:3",
"4:3",
"3:4",
"16:9",
"9:16",
"21:9",
"27:16",
"16:27",
"9:8",
"8:9"
],
"default": "9:16"
},
"generation_mode": {
"type": "string",
"values": [
"fast",
"quality"
],
"default": "fast",
"note": "fast — Быстро, quality — Качественно. Цена зависит также от разрешения и наличия референсов."
},
"resolution": {
"type": "string",
"values": [
"1K",
"2K",
"4K"
],
"default": "1K"
},
"count": {
"type": "integer",
"min": 1,
"max": 4,
"default": 1
},
"reference_urls": {
"type": "array<string>",
"required": false,
"max": 16,
"note": "Только публичные HTTPS URL изображений."
}
}
}
]
}Показана одна модель. Реальный ответ содержит весь доступный каталог.
Создать генерацию#
/generationsПринимает параметры, списывает стоимость и ставит задачу в очередь. Ответ приходит сразу; готовый файл нужно получить отдельным запросом по job_id.
Параметры запроса
Body · JSONtypestring- image · video · music. По умолчанию image. Указывайте явно, чтобы запрос не зависел от значения по умолчанию.
model_keystring- Идентификатор модели из GET /models. Передавайте явно: модель по умолчанию может измениться. У музыки ключ имеет префикс music:.
Параметры и примеры ниже относятся к выбранной модели.
promptstringОбязательно- Описание того, что нужно получить.Символов
1–20000 aspect_ratiostring- Соотношение сторон результата.По умолчанию
"9:16""auto""1:1""3:2""2:3""4:3""3:4""16:9""9:16""21:9""27:16""16:27""9:8""8:9" generation_modestring- Режим качества и скорости генерации. fast — Быстро, quality — Качественно. Цена зависит также от разрешения и наличия референсов.По умолчанию
"fast""fast""quality" resolutionstring- Качество результата для моделей, где есть выбор.По умолчанию
"1K""1K""2K""4K" countinteger- Сколько изображений создать одним запросом.Диапазон
1–4По умолчанию1 reference_urlsarray<string>- HTTPS-ссылки на изображения, которые модель использует как референсы. Только публичные HTTPS URL изображений.Элементов
0–16
Как передавать референсы
Используйте доступные по HTTPS ссылки на изображения. Не передавайте локальные пути, Telegram file_id, base64 или multipart. Сервер модели должен иметь возможность скачать файл без cookies и дополнительных заголовков.
Для временной ссылки оставьте запас срока действия на очередь и обработку. Замените все адреса example.com в примере на свои. Лимит количества референсов зависит от модели; лишние элементы сервер обрезает.
Каждый POST создаёт новую платную задачу. Idempotency-Key и автоматическая защита от повторного POST пока не поддерживаются. Сохраняйте ответ и не повторяйте запрос автоматически при обрыве соединения.
Поля ответа 200 OK
okboolean- true — задача принята.
job_idinteger | string- Номер задачи. У музыки строка music_123; у фото и видео — число. При count > 1 это первая задача.
job_idsarray<integer>- Все созданные задачи. Только для изображений, в том числе при count=1.
statusstring- queued — задача поставлена в очередь.
cost_rubnumber- Общая списанная стоимость запроса в рублях.
unit_cost_rubnumber- Цена одного изображения. Только для type=image.
Пример ответа
{
"ok": true,
"job_id": 123,
"job_ids": [
123
],
"status": "queued",
"cost_rub": 8,
"unit_cost_rub": 8
}Номера задач, стоимость и ссылки в этом примере условные.
Статус и результат#
/generations/{id}Возвращает состояние задачи и ссылки на готовые файлы. Изображения и видео доступны только для задач, созданных через API вашего аккаунта; музыка — для музыкальных задач вашего аккаунта.
Параметр пути: id · обязательный · положительное число или music_123. Параметров query и тела запроса нет.
Поля ответа 200 OK
okboolean- Успешный запрос статуса. При job.status=error значение ok всё равно true.
jobobject- Состояние одной задачи.
job.job_idinteger | string- Номер задачи; строка music_123 для музыки.
job.typestring- image, video или music.
job.statusstring- queued — в очереди; generating — создаётся; done — готово; error — ошибка. При другом промежуточном статусе продолжайте проверку с паузой.
job.modelstring | null- Внутренний код модели. Может отличаться от входного model_key; для новых запросов используйте ключ из каталога.
job.model_titlestring | null- Название модели; для музыки может совпадать с её кодом.
job.aspect_ratiostring | null- Формат кадра. Отсутствует у музыки.
job.duration_secnumber | null- Запрошенная длительность видео. Отсутствует у музыки; у изображения обычно null.
job.cost_rubnumber- Стоимость этой задачи в рублях.
job.resultobject | null- Результат или null, пока файл не доступен. Проверяйте status, а затем наличие URL.
job.result.urlstring | null- HTTPS-ссылка на файл; у музыки — первый трек. Подписанные ссылки хранилища действуют 1 час с момента выдачи; новый GET выдаёт свежую ссылку.
job.result.mimestring | null- MIME-тип, например image/webp, video/mp4, audio/mpeg.
job.result.tracksarray<object>- Только музыка. Все доступные треки одной задачи.
job.result.tracks[].indexnumber- Порядковый номер трека, начиная с 1.
job.result.tracks[].titlestring- Название трека.
job.result.tracks[].durationnumber | null- Длительность трека в секундах, если известна.
job.result.tracks[].urlstring | null- Временная ссылка на аудио.
job.result.tracks[].mimestring- audio/mpeg.
job.result.tracks[].image_urlstring | null- Обложка, если получена от модели.
job.errorstring | null- Описание ошибки задачи; null при отсутствии ошибки.
job.created_atstring | null- Дата и время создания задачи.
Пример ответа
{
"ok": true,
"job": {
"job_id": 123,
"type": "image",
"status": "done",
"model": "example-model-code",
"model_title": "GPT-Image 2.5",
"aspect_ratio": "1:1",
"duration_sec": null,
"cost_rub": 8,
"result": {
"url": "https://example.com/result.webp",
"mime": "image/webp"
},
"error": null,
"created_at": "2026-09-10T12:00:00.000Z"
}
}Номера задач, стоимость и ссылки в этом примере условные.
От задачи к готовому файлу#
queued→generating→done / errorПроверяйте GET /generations/{id} с паузой, например раз в 5 секунд. Это рекомендуемый интервал, не заявленный лимит API. При долгой генерации увеличивайте паузу. Webhook-уведомлений в этой версии нет.
doneГотово- Скачайте job.result.url. Для музыки обработайте все элементы job.result.tracks. Если URL временно null, запросите статус позже.
errorОшибка- Остановите опрос и покажите job.error. Успешный HTTP-ответ на получение статуса не означает успешную генерацию.
Ссылки на результат1 час- Подписанный URL даёт доступ к файлу любому, у кого он есть, до истечения срока. Не публикуйте ссылки на чужие или приватные работы. Сохраните файл в своём хранилище либо получите свежую ссылку новым запросом статуса.
Пример опроса · JavaScript
const jobId = 123; // Из ответа POST /generations
const deadline = Date.now() + 10 * 60_000;
while (Date.now() < deadline) {
const response = await fetch(
`https://r-ai.studio/public-api/v1/generations/${jobId}`,
{ headers: { Authorization: `Bearer ${process.env.RAI_API_KEY}` } },
);
const data = await response.json();
if (!response.ok) throw new Error(JSON.stringify(data));
if (data.job.status === 'error') throw new Error(data.job.error);
if (data.job.status === 'done' && data.job.result?.url) {
console.log(data.job.result);
break;
}
await new Promise(resolve => setTimeout(resolve, 5000));
}
// Истечение ожидания в клиенте не отменяет задачу.Отдельные методы списка, отмены и удаления задач в Public API v1 не предусмотрены. Сохраняйте job_id у себя. Для изображений с count > 1 проверяйте каждый номер из job_ids.
Ошибки и повторные запросы#
Сначала проверяйте HTTP-статус, затем поле error. Текст ошибки генерации находится отдельно: job.error.
{
"ok": false,
"error": "insufficient_funds",
"balance": 2,
"cost_rub": 8
}Дополнительные поля: allowed — разрешённые значения; supported — типы генерации; balance и cost_rub — при недостатке средств.
invalid_jsonТело запроса не является корректным JSON.
unsupported_typeНеизвестный type. Допустимые типы в supported.
prompt_requiredПередайте непустой prompt для изображения или видео.
prompt_too_longСократите prompt до лимита модели.
bad_model / bad_video_model / bad_music_modelПроверьте model_key в актуальном GET /models.
model_disabledМодель отключена. Выберите доступную в каталоге.
model_not_supported_via_apiДля этой модели нужен отдельный сценарий в кабинете, например аватар с аудио.
bad_aspect_ratio / bad_duration_secНедопустимый формат или длительность. Разрешённые значения приходят в allowed.
bad_generation_modeУкажите поддерживаемый режим генерации изображения.
reference_requiredНужен стартовый кадр или набор референсов — по выбранной модели и режиму.
bad_reference_urlНекорректная ссылка на референс.
reference_url_must_be_httpsДля референсов поддерживаются только HTTPS-ссылки.
reference_url_not_allowedЛокальные адреса и адреса внутренней сети запрещены.
bad_music_description / bad_music_lyricsОписание — от 8 символов; текст песни — от 20 символов.
bad_music_styleНе удалось определить стиль. Передайте custom_style или style_preset_id.
bad_job_idНужен положительный номер задачи или music_123.
api_key_requiredДобавьте Authorization: Bearer YOUR_API_KEY.
invalid_api_keyКлюч не существует, отозван или введён с ошибкой.
insufficient_fundsНедостаточно средств. В ответе balance и cost_rub; пополните баланс в кабинете.
job_not_foundЗадача не найдена или не принадлежит владельцу ключа.
payload_too_largeJSON превышает 12 МБ. Передавайте URL файлов, а не файлы или base64.
internal_errorВнутренняя ошибка. При неопределённом результате POST не повторяйте запрос автоматически.
Прокси или сеть могут вернуть ответ без JSON. Обрабатывайте HTTP-ошибки и таймауты отдельно. Числовые квоты и заголовки rate limit сейчас не входят в контракт API; при 429 или временной ошибке GET увеличьте паузу. Для POST автоматический повтор может создать вторую платную задачу.
Совместимость и нормализация#
В новых интеграциях используйте имена из справочника. Эти варианты оставлены для совместимости:
prompt_text → promptimage / video- Используется, если prompt пуст или отсутствует.
ratio → aspect_ratioimage / video- Совместимый вариант имени формата кадра.
speed_mode → video_speed_modevideo- Вариант имени режима скорости.
input_mode → video_input_modevideo- Вариант имени типа входных данных.
start_image_url / image_url → start_frame_urlvideo- Альтернативные имена стартового кадра. Если кадр не передан, берётся reference_urls[0].
end_image_url → end_frame_urlvideo- Альтернатива финального кадра. Если кадр не передан, используется reference_urls[1], когда модель поддерживает финальный кадр.
model → model_keymusic- Ключ музыки также принимается без префикса music:.
stylePresetId / customStylemusic- Алиасы style_preset_id / custom_style.
makeInstrumental / durationSecmusic- Алиасы make_instrumental / duration_sec.
styleWeight / weirdnessConstraint / audioWeightmusic- Алиасы style_weight / weirdness_constraint / audio_weight. Основное имя имеет приоритет.
Как сервер нормализует параметры
countimage- Округляется вниз и ограничивается диапазоном 1–4. По умолчанию 1.
resolutionimage / video- Неподдерживаемое значение заменяется на разрешение по умолчанию. Передавайте значение из каталога.
aspect_ratiovideo- Если значение не поддерживается, используется допустимый формат по умолчанию. У изображений неверный формат возвращает 400.
duration_secmusic- Для Chirp v5.5 целое число 10–360; неверное значение заменяется на 20. В других музыкальных моделях параметр не используется.
title / description / lyrics / custom_stylemusic- Пробелы по краям удаляются; текст обрезается до 120 / 1500 / 4000 / 700 символов соответственно. Режим по умолчанию — description. В custom_style свой стиль имеет приоритет над пресетом.
style_weight / weirdness_constraint / audio_weightmusic- Ограничиваются диапазоном 0–1 и округляются до двух знаков; по умолчанию 0.65.
booleanvideo / music- Рекомендуются JSON true/false. Для совместимости принимаются строки true/false, 1/0, yes/no, on/off.
Примеры используют явные значения и типы JSON. Консоль проверяет параметры до отправки, чтобы случайная опечатка не запустила платную задачу с другими настройками.