API для разработчиков
Один ключ — текстовые модели, изображения, видео и звук. Чат-эндпоинт совместим с OpenAI SDK, медиа-генерации идут через единый эндпоинт со схемой параметров в каталоге. Оплата в рублях с баланса NetRoom, по факту использования.
Быстрый старт
Создайте API-ключ
В личном кабинете NetRoom, вкладка API. Ключ вида nr-... показывается один раз при создании — сохраните его сразу.
Пополните баланс
Запросы оплачиваются с баланса NetRoom по факту использования — подписка не нужна.
Сделайте первый запрос
Скопируйте пример ниже, подставьте свой ключ и id модели из каталога.
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": "Привет! Что ты умеешь?"}]
}'
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)
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, должен содержать заголовок:
Authorization: Bearer nr-ВАШ_КЛЮЧ
- Ключи создаются и отзываются в личном кабинете NetRoom. Отозванный ключ перестаёт работать в течение минуты.
- Сырой ключ хранится только у вас: в базе NetRoom лежит его sha256-хэш. Потеряли ключ — создайте новый и отзовите старый.
- Не публикуйте ключ в клиентском коде, репозиториях и логах. Для браузерных приложений проксируйте запросы через свой бэкенд.
- Неверный или отозванный ключ — ответ 401 с кодом invalid_api_key.
Каталог моделей и цены
/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": {"...": "..."}}
}
]
}
| Поле | Описание |
|---|---|
type | text | 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 — обязательные поля, допустимые значения, лимиты. Запрос валидируется ровно по этой схеме, стройте формы и клиенты по ней. |
Описания моделей и актуальные цены есть и на сайте — в каталоге моделей.
Текстовые модели
/api/v1/chat/completions
OpenAI-совместимый эндпоинт для всех текстовых моделей каталога. Работают официальные SDK OpenAI — достаточно поменять base_url и ключ.
| Поле | Тип | Описание |
|---|---|---|
model | string | Обязательно. Id текстовой модели из каталога. |
messages | array | Обязательно. Непустой массив сообщений вида {role, content}. |
stream | boolean | true — стриминг ответа (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].
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 ещё до вызова модели.
Медиа-генерации
/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"
}
}'
{
"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 секунд"}}
Статус генерации
/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"
}
}
| HTTP | code | Когда |
|---|---|---|
| 400 | invalid_request | Невалидное тело, неподдерживаемый метод, ошибка валидации input, отклонённый моделью запрос. |
| 401 | invalid_api_key | Нет заголовка Authorization, ключ неверен или отозван. |
| 402 | insufficient_balance | Недостаточно средств на балансе NetRoom. |
| 404 | model_not_found | Модель с таким id не найдена (проверьте GET /api/v1/models). |
| 404 | not_found | Генерация с таким id не найдена или принадлежит другому аккаунту. |
| 429 | rate_limit_exceeded | Превышен лимит запросов в минуту или лимит одновременных запросов; в ответе есть заголовок Retry-After (секунды). |
| 502 | upstream_error | Временная ошибка на стороне генерации — повторите запрос позже. |
| 500 | server_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 личного кабинета и сделайте первый запрос за пять минут. Ошибки валидации бесплатны, неудавшиеся генерации не оплачиваются.