R-AI DEVELOPERS API v1

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

Изображения, видео и музыка.
Один API, один баланс в рублях.

BASE URLhttps://r-ai.studio/public-api/v1
01

Создайте ключ

В разделе API кабинета . Сохраните ключ на своём сервере.

02

Выберите модель

Получите каталог с параметрами и ценами вашего аккаунта.

03

Отправьте задачу

Сохраните job_id и проверьте результат, когда генерация завершится.

Первый запрос без ключа
Начало работы

Авторизация#

Передавайте ключ в HTTP-заголовке. Ключ даёт доступ к балансу и генерациям своего аккаунта.

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 МБ.

Полный ключ показывается один раз при создании. Если он потерян или раскрыт, отзовите его в кабинете и создайте новый. В приложении храните ключ на сервере, вне исходного кода.

Для проверки в этой документации вставьте ключ в консоль. Он хранится только в памяти вкладки: не попадает в адрес страницы, примеры кода или хранилище браузера. Очистите поле после работы.

Метод API

Проверка сервиса#

GET/health

Проверяет доступность HTTP API. Не проверяет состояние отдельных моделей и не запускает генерацию.

Без ключаБез списанияapplication/json

Параметров query и тела запроса нет.

Поля ответа 200 OK
okboolean
true — запрос обработан.
versionstring
Версия API: v1.
Пример ответа
JSON
{
  "ok": true,
  "version": "v1"
}
Метод API

Баланс#

GET/balance

Возвращает баланс владельца ключа в рублях. Веб-кабинет, бот и API используют общий баланс аккаунта.

API-ключБез списанияapplication/json

Параметров query и тела запроса нет.

Поля ответа 200 OK
okboolean
Успешный запрос.
balanceobject
Баланс владельца ключа.
balance.currencystring
Валюта: RUB.
balance.amountnumber
Доступная сумма в рублях; может быть дробной.
Пример ответа
JSON
{
  "ok": true,
  "balance": {
    "currency": "RUB",
    "amount": 1250.5
  }
}
Метод API

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

GET/models

Возвращает доступные модели, параметры, значения по умолчанию и цены для вашего аккаунта. Запрашивайте каталог перед интеграцией новой модели.

API-ключБез списанияapplication/json

Параметров 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
Дополнительные условия использования; может отсутствовать.
Пример ответа
JSON
{
  "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 изображений."
        }
      }
    }
  ]
}

Показана одна модель. Реальный ответ содержит весь доступный каталог.

Метод API

Создать генерацию#

POST/generations

Принимает параметры, списывает стоимость и ставит задачу в очередь. Ответ приходит сразу; готовый файл нужно получить отдельным запросом по job_id.

API-ключПлатный запросapplication/json

Параметры запроса

Body · JSON
typestring
image · video · music. По умолчанию image. Указывайте явно, чтобы запрос не зависел от значения по умолчанию.
model_keystring
Идентификатор модели из GET /models. Передавайте явно: модель по умолчанию может измениться. У музыки ключ имеет префикс music:.

Параметры и примеры ниже относятся к выбранной модели.

promptstringОбязательно
Описание того, что нужно получить.
Символов 120000
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
Сколько изображений создать одним запросом.
Диапазон 14
По умолчанию 1
reference_urlsarray<string>
HTTPS-ссылки на изображения, которые модель использует как референсы. Только публичные HTTPS URL изображений.
Элементов 016
Как передавать референсы

Используйте доступные по 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.
Пример ответа
JSON
{
  "ok": true,
  "job_id": 123,
  "job_ids": [
    123
  ],
  "status": "queued",
  "cost_rub": 8,
  "unit_cost_rub": 8
}

Номера задач, стоимость и ссылки в этом примере условные.

Метод API

Статус и результат#

GET/generations/{id}

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

API-ключБез списанияapplication/json

Параметр пути: 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
Дата и время создания задачи.
Пример ответа
JSON
{
  "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"
  }
}

Номера задач, стоимость и ссылки в этом примере условные.

Работа с результатом

От задачи к готовому файлу#

queuedgeneratingdone / error

Проверяйте GET /generations/{id} с паузой, например раз в 5 секунд. Это рекомендуемый интервал, не заявленный лимит API. При долгой генерации увеличивайте паузу. Webhook-уведомлений в этой версии нет.

doneГотово
Скачайте job.result.url. Для музыки обработайте все элементы job.result.tracks. Если URL временно null, запросите статус позже.
errorОшибка
Остановите опрос и покажите job.error. Успешный HTTP-ответ на получение статуса не означает успешную генерацию.
Ссылки на результат1 час
Подписанный URL даёт доступ к файлу любому, у кого он есть, до истечения срока. Не публикуйте ссылки на чужие или приватные работы. Сохраните файл в своём хранилище либо получите свежую ссылку новым запросом статуса.
Пример опроса · JavaScript
JavaScript · Node.js
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.

JSON
{
  "ok": false,
  "error": "insufficient_funds",
  "balance": 2,
  "cost_rub": 8
}

Дополнительные поля: allowed — разрешённые значения; supported — типы генерации; balance и cost_rub — при недостатке средств.

400
invalid_json

Тело запроса не является корректным JSON.

400
unsupported_type

Неизвестный type. Допустимые типы в supported.

400
prompt_required

Передайте непустой prompt для изображения или видео.

400
prompt_too_long

Сократите prompt до лимита модели.

400
bad_model / bad_video_model / bad_music_model

Проверьте model_key в актуальном GET /models.

400
model_disabled

Модель отключена. Выберите доступную в каталоге.

400
model_not_supported_via_api

Для этой модели нужен отдельный сценарий в кабинете, например аватар с аудио.

400
bad_aspect_ratio / bad_duration_sec

Недопустимый формат или длительность. Разрешённые значения приходят в allowed.

400
bad_generation_mode

Укажите поддерживаемый режим генерации изображения.

400
reference_required

Нужен стартовый кадр или набор референсов — по выбранной модели и режиму.

400
bad_reference_url

Некорректная ссылка на референс.

400
reference_url_must_be_https

Для референсов поддерживаются только HTTPS-ссылки.

400
reference_url_not_allowed

Локальные адреса и адреса внутренней сети запрещены.

400
bad_music_description / bad_music_lyrics

Описание — от 8 символов; текст песни — от 20 символов.

400
bad_music_style

Не удалось определить стиль. Передайте custom_style или style_preset_id.

400
bad_job_id

Нужен положительный номер задачи или music_123.

401
api_key_required

Добавьте Authorization: Bearer YOUR_API_KEY.

401
invalid_api_key

Ключ не существует, отозван или введён с ошибкой.

402
insufficient_funds

Недостаточно средств. В ответе balance и cost_rub; пополните баланс в кабинете.

404
job_not_found

Задача не найдена или не принадлежит владельцу ключа.

413
payload_too_large

JSON превышает 12 МБ. Передавайте URL файлов, а не файлы или base64.

500
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. Консоль проверяет параметры до отправки, чтобы случайная опечатка не запустила платную задачу с другими настройками.