API Reference

Актуальная документация по API-прокси OpenRouter. Базовый URL: https://api.ru-openrouter.ru/v1/.

Для OpenAI-совместимых эндпоинтов (/v1/chat/completions, /v1/responses, /v1/embeddings и др.) базовый URL включает /v1/ — клиент дописывает только остаток пути. Для протокола Anthropic Messages (POST /v1/messages) базой служит https://api.ru-openrouter.ru без /v1. API-ключ принимается и в Authorization: Bearer sk_..., и в x-api-key.

Быстрая справка

Эндпоинт Метод Описание
/v1/healthGETПроверка статуса API
/v1/modelsGETСписок моделей (с фильтром по типу)
/v1/embeddings/modelsGETСписок embedding моделей
/v1/images/modelsGETСписок image-моделей
/v1/audio/modelsGETСписок multimodal audio-моделей
/v1/tts/modelsGETСписок TTS-моделей
/v1/transcriptions/modelsGETСписок transcription-моделей
/v1/rerank/modelsGETСписок rerank-моделей
/v1/videos/modelsGETСписок видео-моделей
/v1/chat/completionsPOSTЧат-запросы (OpenAI-совместимый)
/v1/responsesPOSTOpenAI Responses API
/v1/messagesPOSTAnthropic Messages API
/v1/decisionsPOSTТипизированный ответ по набору вопросов (Decisions API)
/v1/alpha/decisionsPOSTФолбек-алиас того же (старый путь)
/v1/systemonePOSTТо же самое: каноническая поверхность System One
/v1/completionsPOSTLegacy Completions
/v1/embeddingsPOSTГенерация эмбеддингов
/v1/images/generationsPOSTГенерация изображений (OpenAI-совместимый)
/v1/imagesPOSTГенерация изображений (OpenRouter native API)
/v1/audio/speechPOSTСинтез речи (TTS)
/v1/audio/transcriptionsPOSTТранскрипция аудио
/v1/audio/translationsPOSTПеревод аудио
/v1/rerankPOSTРанжирование документов (Rerank)
/v1/videosPOSTГенерация видео (асинхронная)
/v1/videos/historyGETИстория генераций видео
/v1/videos/contentGETСкачивание видео
/v1/user/balanceGETБаланс пользователя
/v1/generationGETИстория использования

Requests

Completions Request Format

Запросы к /v1/chat/completions совместимы с форматом OpenAI Chat API.

Тело запроса (TypeScript):

type Request = {
  // Обязательно: messages или prompt
  messages?: Message[];
  prompt?: string;

  // Если model не указан, используется дефолтный пользователя
  model?: string;

  // Формат ответа (JSON / JSON Schema)
  response_format?: ResponseFormat;

  stop?: string | string[];
  stream?: boolean;

  // Параметры генерации
  max_tokens?: number;    // [1, context_length)
  temperature?: number;   // [0, 2]
  top_p?: number;         // (0, 1]
  top_k?: number;         // [1, Infinity)
  frequency_penalty?: number;  // [-2, 2]
  presence_penalty?: number;   // [-2, 2]
  repetition_penalty?: number; // (0, 2]
  min_p?: number;         // [0, 1]
  top_a?: number;         // [0, 1]
  seed?: number;
  logit_bias?: { [key: number]: number };

  // Tool calling
  tools?: Tool[];
  tool_choice?: ToolChoice;

  // Суффиксы маршрутизации (добавляются к имени модели)
  // :nitro → provider.sort = "throughput"
  // :floor → provider.sort = "price"
  // :online → plugins: [{ id: "web" }] (веб-поиск)

  // OpenRouter-специфичные параметры
  provider?: ProviderPreferences;
  user?: string;
};

type Message = {
  role: 'system' | 'user' | 'assistant' | 'tool';
  content: string | ContentPart[];
  name?: string;
  tool_call_id?: string; // для role: 'tool'
};

type ContentPart =
  | { type: 'text'; text: string }
  | { type: 'image_url'; image_url: { url: string; detail?: string } };

type Tool = {
  type: 'function';
  function: {
    description?: string;
    name: string;
    parameters: object;
  };
};

type ToolChoice = 'none' | 'auto' | { type: 'function'; function: { name: string } };

type ResponseFormat =
  | { type: 'json_object' }
  | { type: 'json_schema'; json_schema: { name: string; strict?: boolean; schema: object } };

type ProviderPreferences = {
  order?: string[];     // Приоритет провайдеров
  ignore?: string[];    // Игнорируемые провайдеры
  sort?: 'throughput' | 'price';  // Стратегия сортировки
};

Headers

Header Описание
Authorization: Bearer sk_...API-ключ (обязателен)
HTTP-RefererURL приложения для статистики OpenRouter
X-Title / X-OpenRouter-TitleНазвание приложения для статистики
X-Request-IdID запроса (для отслеживания прерванных запросов)

Structured Outputs

Через response_format:

  • { type: 'json_object' } — базовый JSON-режим
  • { type: 'json_schema', json_schema: { name, strict, schema } } — строгая схема

Assistant Prefill

Поддерживается нативно через последнее сообщение с role: "assistant":

{
  "messages": [
    { "role": "user", "content": "Что такое ИИ?" },
    { "role": "assistant", "content": "ИИ — это" }
  ]
}

Поддержка Responses API (OpenAI)

Эндпоинт /v1/responses принимает поле input вместо messages:

{
  "model": "openai/gpt-4o",
  "input": "Расскажи о себе"
}

input может быть строкой или массивом structured input. Конвертируется в messages автоматически.

Responses

Формат ответа

OpenRouter возвращает ответы в формате, совместимом с OpenAI Chat API:

type Response = {
  id: string;
  choices: (NonStreamingChoice | StreamingChoice)[];
  created: number;
  model: string;
  object: 'chat.completion' | 'chat.completion.chunk';
  usage?: ResponseUsage;
};

type NonStreamingChoice = {
  finish_reason: string | null;
  native_finish_reason: string | null;
  message: {
    content: string | null;
    role: string;
    tool_calls?: ToolCall[];
  };
};

type StreamingChoice = {
  finish_reason: string | null;
  native_finish_reason: string | null;
  delta: {
    content?: string | null;
    role?: string;
    tool_calls?: ToolCall[];
  };
};

type ResponseUsage = {
  prompt_tokens: number;
  completion_tokens: number;
  total_tokens: number;
  prompt_tokens_details?: {
    cached_tokens: number;
    cache_write_tokens?: number;
  };
  completion_tokens_details?: {
    reasoning_tokens?: number;
  };
  cost?: number;
  currency?: string;
};

Finish Reason

Нормализованные значения: tool_calls, stop, length, content_filter, error.

Оригинальное значение провайдера доступно в native_finish_reason.

Пример ответа

{
  "id": "gen-xxxxxxxxxxxxxx",
  "choices": [
    {
      "finish_reason": "stop",
      "native_finish_reason": "stop",
      "message": {
        "role": "assistant",
        "content": "Привет!"
      }
    }
  ],
  "usage": {
    "prompt_tokens": 10,
    "completion_tokens": 4,
    "total_tokens": 14,
    "prompt_tokens_details": {
      "cached_tokens": 0
    },
    "completion_tokens_details": {
      "reasoning_tokens": 0
    },
    "total_cost": 0.00014,
    "currency": "RUB"
  }
}

Эндпоинты

GET /v1/health

Проверка работоспособности. Не требует аутентификации.

{
  "status": "ok",
  "version": "1.0",
  "endpoints": [
    "models", "embeddings/models", "rerank/models",
    "images/models", "audio/models", "tts/models",
    "transcriptions/models", "chat/completions",
    "completions", "embeddings", "responses",
    "rerank", "images/generations", "images",
    "audio/speech", "audio/transcriptions", "audio/translations",
    "user/balance", "generation"
  ]
}

POST /v1/embeddings

Параметры:

Поле Тип Обязательное Описание
model string ID модели
input string | array Текст для векторизации

Пример:

curl https://api.ru-openrouter.ru/v1/embeddings \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/text-embedding-3-small",
    "input": "Текст для векторизации"
  }'

POST /v1/images/generations

Генерация изображений. Поддерживает image-to-image (через image или input_references).

Параметры:

Поле Тип Обязательное Описание
model string ID модели
prompt string Описание изображения
n integer Количество изображений (1-10, по умолчанию 1)
size string Legacy: 1024x1024, 1024x768, 768x1024, 1280x720, 720x1280, 1536x1024, 1024x1536
image string Data URL или URL изображения (image-to-image)
response_format string url (по умолчанию) или b64_json
image_config object { aspect_ratio, image_size }
image_config.aspect_ratio string 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9
image_config.image_size string 1K, 2K, 4K

Пример:

curl https://api.ru-openrouter.ru/v1/images/generations \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/dall-e-3",
    "prompt": "Кот в космосе, цифровой арт",
    "n": 1,
    "image_config": {
      "aspect_ratio": "16:9",
      "image_size": "2K"
    }
  }'

POST /v1/images

Алиас для /v1/images/generations.

POST /v1/audio/speech

Синтез речи из текста. Возвращает аудиофайл.

Параметры:

Поле Тип Обязательное Описание
model string ID модели
input string Текст (макс. 5000 символов)
voice string alloy, echo, fable, onyx, nova, shimmer
response_format string mp3, opus, aac, flac, wav, pcm
speed float 0.25–4.0

Пример:

curl https://api.ru-openrouter.ru/v1/audio/speech \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/tts-1",
    "input": "Привет! Это пример синтеза речи.",
    "voice": "alloy",
    "response_format": "mp3"
  }' \
  --output speech.mp3

POST /v1/audio/transcriptions

Распознавание речи из аудиофайла. Поддерживает два формата:

  • multipart/form-data: model + file (OpenAI-стиль)
  • application/json: model + input_audio.data (base64) + input_audio.format (OpenRouter-стиль)

Параметры:

Поле Тип Обязательное Описание
model string ID модели
file file (multipart) Аудиофайл
input_audio.data string (JSON) Base64 аудиоданных
input_audio.format string (JSON) Формат аудио (mp3, wav, etc.)
language string Язык (например, ru)
response_format string json, text, srt, verbose_json, vtt
temperature float 0.0–1.0
prompt string Подсказка для модели
timestamp_granularities string Детализация временных меток

POST /v1/audio/translations

Перевод аудио на английский. Аналогичен транскрипции по формату.

POST /v1/rerank

Реранкинг документов по релевантности запросу.

Параметры:

Поле Тип Обязательное Описание
model string ID модели
query string Поисковый запрос
documents array Массив документов
top_n integer Количество результатов

Пример:

curl https://api.ru-openrouter.ru/v1/rerank \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "cohere/rerank",
    "query": "Что такое искусственный интеллект?",
    "documents": [
      "ИИ — это область компьютерных наук...",
      "Машинное обучение — подраздел ИИ..."
    ],
    "top_n": 2
  }'

POST /v1/videos

Асинхронная генерация видео. Создаёт задачу, возвращает job_id.

Параметры:

Поле Тип Обязательное Описание
model string ID модели
prompt string Описание видео
size string Разрешение
duration integer Длительность в секундах
stream boolean Streaming (не поддерживается, ошибка)

Пример:

curl -X POST https://api.ru-openrouter.ru/v1/videos \
  -H "Authorization: Bearer sk_ваш_api_ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/sora",
    "prompt": "A serene lake at sunset with mountains"
  }'

GET /v1/videos?id={job_id}

Получение статуса и результата видео-задачи.

GET /v1/videos/history

Список завершённых видео пользователя.

GET /v1/videos/content?id={job_id}

Скачивание готового видеофайла.

GET /v1/user/balance

Текущий баланс пользователя.

{
  "user": "user@example.com",
  "balance": 150.50,
  "currency": "RUB"
}

GET /v1/generation

Логи использования API.

Параметры:

Параметр Тип Описание
generation_idstringПоиск по ID генерации
limitintegerКоличество записей (макс. 300, по умолчанию 10)
offsetintegerСмещение

Ответ:

{
  "logs": [
    {
      "id": 12345,
      "model_name": "openai/gpt-4o-mini",
      "input_tokens": 100,
      "output_tokens": 50,
      "total_cost": 0.15,
      "timestamp": "2025-03-11T12:00:00Z"
    }
  ],
  "total": 1
}

Коды ошибок

HTTP Код Описание
400missing_modelНе указана модель
400missing_messagesНе указаны сообщения
400missing_promptНе указан prompt
400missing_inputНе указан input
400missing_queryНе указан query (rerank)
400missing_documentsНе указаны documents (rerank)
400missing_job_idНе указан job_id (videos)
400invalid_jsonНевалидный JSON
400invalid_filterНеверный ?filter=
400invalid_message_formatНеверный формат сообщения
400invalid_message_roleНедопустимая роль
400invalid_response_formatНеверный response_format
400invalid_inputНекорректный input
400invalid_base64Неверный base64
400model_not_foundМодель не найдена или неактивна
400model_not_supportedМодель не поддерживает эндпоинт
400model_not_decisionsМодель не поддерживает Decisions
400input_tokens_exceededПревышен контекст модели
400token_limit_exceededПревышен лимит токенов
400input_too_longТекст превышает макс. длину
400prompt_too_longPrompt превышает макс. длину
400streaming_not_supportedСтриминг не поддерживается
400file_upload_errorОшибка загрузки файла
401invalid_api_keyНеверный API-ключ
401missing_api_keyОтсутствует Authorization
401key_expiredСрок ключа истёк
402insufficient_balanceНедостаточно средств
403account_deactivatedАккаунт деактивирован
403key_deactivatedКлюч деактивирован
403api_lockedAPI заблокирован
403access_deniedНет доступа
404endpoint_not_foundЭндпоинт не найден
404stream_not_foundСтрим не найден
404job_not_foundЗадача не найдена
405method_not_allowedМетод не поддерживается
413request_too_largeТело > 10 MB
415unsupported_media_typeНеподдерживаемый Content-Type
429rate_limit_exceededПревышен лимит запросов
429limit_exceededПревышен лимит API-ключа
502empty_responseПустой ответ от провайдера
503maintenance_modeТехническое обслуживание