NetRoom API для разработчиков: текст, изображения, видео и звук по одному ключу
NETROOM API

API для разработчиков

Один ключ — текстовые модели, изображения, видео и звук. Чат-эндпоинт совместим с OpenAI SDK, медиа-генерации идут через единый эндпоинт со схемой параметров в каталоге. Оплата в рублях с баланса NetRoom, по факту использования.

Базовый URL https://netroom.ai/api/v1
Формат JSON, UTF-8
Авторизация Authorization: Bearer nr-...
Совместимость OpenAI SDK — меняется только base_url

Быстрый старт

01

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

В личном кабинете NetRoom, вкладка API. Ключ вида nr-... показывается один раз при создании — сохраните его сразу.

02

Пополните баланс

Запросы оплачиваются с баланса NetRoom по факту использования — подписка не нужна.

03

Сделайте первый запрос

Скопируйте пример ниже, подставьте свой ключ и id модели из каталога.

curl
curl https://netroom.ai/api/v1/chat/completions \
  -H "Authorization: Bearer nr-ВАШ_КЛЮЧ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "messages": [{"role": "user", "content": "Привет! Что ты умеешь?"}]
  }'
Python (openai SDK)
from openai import OpenAI

client = OpenAI(
    base_url="https://netroom.ai/api/v1",
    api_key="nr-ВАШ_КЛЮЧ",
)

response = client.chat.completions.create(
    model="openai/gpt-4o-mini",
    messages=[{"role": "user", "content": "Привет! Что ты умеешь?"}],
)
print(response.choices[0].message.content)
JavaScript / Node.js (openai SDK)
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://netroom.ai/api/v1",
  apiKey: "nr-ВАШ_КЛЮЧ",
});

const response = await client.chat.completions.create({
  model: "openai/gpt-4o-mini",
  messages: [{ role: "user", content: "Привет! Что ты умеешь?" }],
});
console.log(response.choices[0].message.content);

Идентификатор модели в примерах условный — актуальные id берите из каталога GET /api/v1/models.

Аутентификация

Каждый запрос, кроме GET /api/v1/models, должен содержать заголовок:

HTTP-заголовок
Authorization: Bearer nr-ВАШ_КЛЮЧ
  • Ключи создаются и отзываются в личном кабинете NetRoom. Отозванный ключ перестаёт работать в течение минуты.
  • Сырой ключ хранится только у вас: в базе NetRoom лежит его sha256-хэш. Потеряли ключ — создайте новый и отзовите старый.
  • Не публикуйте ключ в клиентском коде, репозиториях и логах. Для браузерных приложений проксируйте запросы через свой бэкенд.
  • Неверный или отозванный ключ — ответ 401 с кодом invalid_api_key.

Каталог моделей и цены

GET /api/v1/models

Без авторизации. Возвращает единый список всех доступных моделей с конечными ценами NetRoom в рублях — это единственный источник цен, всегда актуальный. Каталог кэшируется на стороне сервера примерно на 5 минут.

Запрос
curl https://netroom.ai/api/v1/models
Ответ (фрагмент, значения условные)
{
  "object": "list",
  "data": [
    {
      "id": "openai/gpt-4o-mini",
      "object": "model",
      "type": "text",
      "name": "GPT-4o mini",
      "pricing": {"currency": "RUB", "input_per_1k_tokens": 0.5, "output_per_1k_tokens": 1.5}
    },
    {
      "id": "id-image-модели",
      "object": "model",
      "type": "image",
      "name": "...",
      "pricing": {"currency": "RUB", "per_image": 12.0},
      "input_schema": {"type": "object", "required": ["prompt"], "properties": {"...": "..."}}
    }
  ]
}
ПолеОписание
typetext | image | video | sound. Текстовые модели вызываются через /api/v1/chat/completions, остальные — через /api/v1/generations.
pricingКонечные цены NetRoom в рублях: у текстовых — за 1K входных и выходных токенов; у изображений — per_image; у видео — per_second; у звука — per_1000_chars, per_minute, per_generation или per_second в зависимости от модели. У бесплатных текстовых моделей цены нулевые.
input_schemaТолько у медиа-моделей: JSON Schema поля input для /api/v1/generations — обязательные поля, допустимые значения, лимиты. Запрос валидируется ровно по этой схеме, стройте формы и клиенты по ней.

Описания моделей и актуальные цены есть и на сайте — в каталоге моделей.

Текстовые модели

POST /api/v1/chat/completions

OpenAI-совместимый эндпоинт для всех текстовых моделей каталога. Работают официальные SDK OpenAI — достаточно поменять base_url и ключ.

ПолеТипОписание
modelstringОбязательно. Id текстовой модели из каталога.
messagesarrayОбязательно. Непустой массив сообщений вида {role, content}.
streambooleantrue — стриминг ответа (SSE). По умолчанию false.

Дополнительно поддерживаются стандартные параметры:

temperaturemax_tokenstop_ptop_kfrequency_penaltypresence_penaltyrepetition_penaltystopseedresponse_formatlogit_biaslogprobstop_logprobstoolstool_choiceparallel_tool_callsreasoning

Неподдерживаемые моделью параметры игнорируются на её стороне.

Обычный режим (без стрима)

Ответ
{
  "id": "gen-...",
  "object": "chat.completion",
  "model": "openai/gpt-4o-mini",
  "choices": [
    {
      "index": 0,
      "message": {"role": "assistant", "content": "Привет! Я умею..."},
      "finish_reason": "stop"
    }
  ],
  "usage": {"prompt_tokens": 12, "completion_tokens": 34, "total_tokens": 46}
}

usage содержит только счётчики токенов — по ним же считается списание с баланса.

Стриминг (stream: true)

Ответ приходит потоком Server-Sent Events (Content-Type: text/event-stream): строки data: {chunk} с дельтами в choices[].delta.content, финальный маркер data: [DONE].

Python
stream = client.chat.completions.create(
    model="openai/gpt-4o-mini",
    messages=[{"role": "user", "content": "Расскажи о себе"}],
    stream=True,
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

Если ошибка случилась уже после начала стрима, она приходит внутри потока событием data: {"error": {...}}, за которым следует data: [DONE]. Если клиент оборвал соединение — уже сгенерированная к этому моменту часть ответа оплачивается.

Изображения на входе (vision)

Моделям с поддержкой зрения изображения передаются в стандартном формате OpenAI — частями content типа image_url (обычный URL или data:-URL с base64). Лимит тела запроса — 25 МБ.

Тело запроса
{
  "model": "...",
  "messages": [{
    "role": "user",
    "content": [
      {"type": "text", "text": "Что на фото?"},
      {"type": "image_url", "image_url": {"url": "https://example.com/photo.jpg"}}
    ]
  }]
}

Оплата текстовых запросов

Списание — после ответа, по фактическому потреблению токенов и ценам модели из каталога. Для платных моделей на балансе должна быть положительная сумма — иначе 402 insufficient_balance ещё до вызова модели.

Медиа-генерации

POST /api/v1/generations

Единый эндпоинт для изображений, видео и звука. Набор полей input зависит от модели — он описан в её input_schema в каталоге.

Тело запроса
{
  "model": "id-модели-из-каталога",
  "input": { ... }
}
  • Все ссылки на медиа (кадры, референсы) — только публичные http(s) URL. Инлайн-base64 не принимается; лимит тела запроса — 2 МБ.
  • Запрос валидируется по input_schema; при нарушении — 400 invalid_request со списком конкретных ошибок.
  • Стоимость считается сервером по параметрам генерации и списывается с баланса; при нехватке средств — 402 insufficient_balance, генерация не запускается.

Изображения

Выполняются синхронно: ответ 200 приходит сразу с готовыми ссылками. Типовые поля input: prompt (обязательно), negative_prompt, aspect_ratio, resolution, width/height, number_results (1-4), output_format, reference_images — у моделей с поддержкой референсов.

Запрос
curl https://netroom.ai/api/v1/generations \
  -H "Authorization: Bearer nr-ВАШ_КЛЮЧ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "id-image-модели",
    "input": {"prompt": "уютное кафе на берегу моря, кинематографичный свет", "aspect_ratio": "16:9"}
  }'
Ответ (фрагмент, значения условные)
{
  "id": "img_12345",
  "object": "generation",
  "type": "image",
  "model": "id-image-модели",
  "status": "succeeded",
  "progress": 100,
  "outputs": ["https://.../result.jpg"],
  "cost": 12.0,
  "error": null,
  "created_at": "2026-08-15T12:00:00+03:00"
}

Видео

Выполняются асинхронно: ответ 202 со статусом queued или processing, результат забирается поллингом. Типовые поля input: prompt (обязательно), duration (секунды, допустимые значения — в схеме), aspect_ratio, resolution, negative_prompt, sound, cfg_scale, first_frame / last_frame (URL кадров для image-to-video), reference_images, reference_videos.

Запрос
curl https://netroom.ai/api/v1/generations \
  -H "Authorization: Bearer nr-ВАШ_КЛЮЧ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "id-video-модели",
    "input": {
      "prompt": "дрон пролетает над горным озером на рассвете",
      "duration": 5,
      "aspect_ratio": "16:9",
      "resolution": "1080p"
    }
  }'
Ответ 202 (значения условные)
{
  "id": "3f2a9c...",
  "object": "generation",
  "type": "video",
  "model": "id-video-модели",
  "status": "queued",
  "progress": 0,
  "outputs": [],
  "cost": 45.0,
  "error": null,
  "created_at": "2026-08-15T12:00:00+03:00",
  "estimated_time_seconds": 60
}

Звук

Тоже асинхронно (202 + поллинг). Звуковые модели бывают трёх видов, поля input различаются — точный набор всегда в input_schema:

Озвучка текста (TTS)

text (обязательно), voice, language, output_format

{"model": "id-tts-модели", "input": {"text": "Добрый день! Ваш заказ подтверждён.", "voice": "имя-голоса"}}

Музыка

mode (prompt | lyrics | instrumental), prompt и/или lyrics, negative_prompt, seed, output_format

{"model": "id-music-модели", "input": {"mode": "prompt", "prompt": "спокойный lo-fi бит с виниловым шумом"}}

Звуковые эффекты (SFX)

prompt (обязательно), output_format

{"model": "id-sfx-модели", "input": {"prompt": "шум дождя по жестяной крыше, 10 секунд"}}

Статус генерации

GET /api/v1/generations/{id}

Статус и результат любой генерации. id — из ответа на создание (строка; у изображений вида img_<n>), доступ только владельцу ключа. Статусы: queued -> processing -> succeeded | failed.

Запрос
curl https://netroom.ai/api/v1/generations/3f2a9c... \
  -H "Authorization: Bearer nr-ВАШ_КЛЮЧ"
  • succeeded — готовые файлы в outputs (список URL).
  • failed — причина в error; неудавшаяся генерация не оплачивается.
  • progress — 0-100; у видео дополнительно помогает estimated_time_seconds из ответа на создание.
  • cost — стоимость генерации в рублях; у асинхронных генераций списание фиксируется по факту успешного завершения.

Рекомендуемый интервал опроса — 3-5 секунд. Слишком частый поллинг нескольких генераций параллельно может упереться в лимит запросов в минуту.

Формат ошибок

Все ошибки — JSON одного вида:

{
  "error": {
    "message": "Человекочитаемое описание проблемы",
    "type": "invalid_request_error",
    "code": "invalid_request"
  }
}
HTTPcodeКогда
400invalid_requestНевалидное тело, неподдерживаемый метод, ошибка валидации input, отклонённый моделью запрос.
401invalid_api_keyНет заголовка Authorization, ключ неверен или отозван.
402insufficient_balanceНедостаточно средств на балансе NetRoom.
404model_not_foundМодель с таким id не найдена (проверьте GET /api/v1/models).
404not_foundГенерация с таким id не найдена или принадлежит другому аккаунту.
429rate_limit_exceededПревышен лимит запросов в минуту или лимит одновременных запросов; в ответе есть заголовок Retry-After (секунды).
502upstream_errorВременная ошибка на стороне генерации — повторите запрос позже.
500server_errorВнутренняя ошибка NetRoom.

Поле type — OpenAI-подобная категория (authentication_error, insufficient_quota, invalid_request_error, rate_limit_error, api_error) для совместимости с SDK; программную логику стройте по code и HTTP-статусу.

В стриминговом режиме ошибка после начала потока приходит событием data: {"error": {...}} внутри SSE.

Лимиты

ЛимитЗначение
ЧастотаПо умолчанию 60 запросов в минуту на ключ (fixed window); индивидуальный лимит ключа может отличаться. При превышении — 429 с заголовком Retry-After.
ПараллельностьНе более 4 одновременных запросов на аккаунт — суммарно по всем ключам аккаунта.
Размер тела25 МБ для /chat/completions (с учётом инлайн-изображений), 2 МБ для /generations (медиа — только ссылками).
КлючиДо 10 активных ключей на аккаунт.

Обрабатывайте 429 экспоненциальной паузой начиная со значения Retry-After; долгие текстовые ответы запрашивайте со stream: true.

Хранение запросов

Для предотвращения злоупотреблений, разбора инцидентов и спорных списаний NetRoom ведёт журнал запросов к API. В журнал попадают: модель, параметры запроса, сообщения (в усечённом виде), усечённый текст ответа, счётчики токенов, стоимость, статус, IP-адрес и время ответа. Инлайн-изображения (data:-URL) в журнале не сохраняются — вместо содержимого записывается техническая заглушка с размером и контрольной суммой.

Записи журнала хранятся ограниченный срок — по умолчанию 90 дней — и затем удаляются автоматически. История списаний с баланса ведётся отдельно в финансовой истории аккаунта и под этот срок не подпадает.

Один ключ — все модели

Создайте ключ во вкладке API личного кабинета и сделайте первый запрос за пять минут. Ошибки валидации бесплатны, неудавшиеся генерации не оплачиваются.