Ошибки — Errors API

Справочник ошибок API. Все ошибки возвращаются в едином формате.

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

{
  "error": {
    "code": "error_code",
    "message": "Human-readable description"
  }
}

HTTP-статус ответа совпадает с типом ошибки.

HTTP Status Codes

Код Название Описание
400Bad RequestНекорректный запрос (неверные или отсутствующие параметры, CORS)
401UnauthorizedНеверные учётные данные (невалидный API-ключ, истекший ключ)
402Payment RequiredНедостаточно средств на балансе
403ForbiddenНедостаточно прав, CSRF-блокировка или деактивированный аккаунт
404Not FoundЭндпоинт или модель не найдены
405Method Not AllowedHTTP-метод не поддерживается для данного эндпоинта
408Request TimeoutЗапрос превысил время ожидания
413Payload Too LargeТело запроса превышает максимальный размер (10 MB)
415Unsupported Media TypeТолько application/json
429Too Many RequestsПревышен лимит запросов (rate limit) или лимит API-ключа
499Client Closed RequestКлиент прервал соединение (streaming)
500Internal Server ErrorВнутренняя ошибка сервера
502Bad GatewayМодель недоступна или получен некорректный ответ от провайдера
503Service UnavailableСервер на техническом обслуживании или API-ключ не настроен

Коды ошибок

Ошибки валидации запроса (400)

Код Описание
missing_modelНе указан обязательный параметр model
missing_messagesОтсутствует параметр messages или input (для chat/completions)
missing_promptОтсутствует параметр prompt (для completions)
missing_inputОтсутствует параметр input (для embeddings, audio/speech)
missing_message_contentУ сообщения отсутствует поле content
invalid_message_formatНекорректный формат сообщения (ожидается объект)
invalid_message_roleНедопустимая роль у сообщения. Допустимые: system, user, assistant, tool, function
invalid_jsonНекорректный JSON в теле запроса
invalid_filterНедопустимое значение параметра filter. Допустимые: text, image, video, tts, audio, embedding, transcribe, rerank
invalid_response_formatНедопустимый формат ответа (для audio/speech)
invalid_inputНекорректный input для embeddings
invalid_imageИзображение повреждено или не может быть прочитано
invalid_json_bodyНекорректное JSON-тело (для audio/transcriptions)
invalid_base64Некорректная base64 строка в input_audio.data
file_upload_errorОшибка загрузки файла (для audio/transcriptions)

Ошибки модели (400)

Код Описание
model_not_foundМодель не найдена или неактивна
model_not_supportedМодель не поддерживает данный тип запроса (например, image generation для текстовой модели)
model_not_rerankМодель не поддерживает реранкинг
input_tokens_exceededВходные токены превышают контекстное окно модели
token_limit_exceededСумма входных и выходных токенов превышает глобальный лимит
streaming_not_supportedStreaming не поддерживается для данного эндпоинта
input_too_longВходной текст превышает максимальную длину (для audio/speech)
prompt_too_longПромпт превышает максимальную длину (для видео)

Ошибки аутентификации (401)

Код Описание
missing_authОтсутствует заголовок Authorization
unauthorizedТребуется авторизация
invalid_api_keyНеверный API-ключ
key_expiredСрок действия API-ключа истёк
session_expiredСессия истекла
not_authenticatedПользователь не аутентифицирован

Ошибки баланса и доступа (402, 403)

Код HTTP Status Описание
insufficient_balance402Недостаточно средств на балансе
key_deactivated403API-ключ деактивирован
account_deactivated403Аккаунт деактивирован

Rate Limiting и лимиты (429)

Код Описание
rate_limit_exceededПревышен лимит запросов. Содержит заголовок Retry-After с количеством секунд до следующего разрешённого запроса
limit_exceededПревышен лимит API-ключа (дневной или месячный лимит расходов)

Ошибки эндпоинтов

Код HTTP Status Описание
endpoint_not_found404Эндпоинт не найден
method_not_allowed405HTTP-метод не поддерживается
unsupported_media_type415Только application/jsonmultipart/form-data для audio)
request_too_large413Тело запроса превышает 10 MB

Ошибки видео

Код HTTP Status Описание
missing_job_id400Не указан job_id
job_not_found404Задача генерации видео не найдена
video_not_ready400Видео ещё не готово (текущий статус)
video_url_not_found404URL видео не найден

Retry-After Header

На ответах с кодом 429 Too Many Requests сервер может возвращать заголовок Retry-After с указанием количества секунд, через которое можно повторить запрос:

HTTP/1.1 429 Too Many Requests
Retry-After: 30
Content-Type: application/json

{
  "error": {
    "message": "The service is receiving too many requests from you. Too many requests. Please try again in 30 seconds.",
    "code": "rate_limit_exceeded",
    "retry_after": 30
  }
}

Рекомендуется обрабатывать этот заголовок в клиентском коде:

import time
import requests

response = requests.post(
    "https://api.ru-openrouter.ru/v1/chat/completions",
    headers={"Authorization": "Bearer sk_..."},
    json={"model": "openai/gpt-4o", "messages": [{"role": "user", "content": "Hello"}]}
)

if response.status_code == 429:
    retry_after = int(response.headers.get("Retry-After", "5"))
    time.sleep(retry_after)
    # повторный запрос

Примеры ошибок

Ошибка валидации

{
  "error": {
    "code": "missing_model",
    "message": "Missing required parameter: model"
  }
}

Ошибка недопустимой роли

{
  "error": {
    "code": "invalid_message_role",
    "message": "Invalid 'role' value 'admin' at message index 0. Allowed: system, user, assistant, tool, function"
  }
}

Ошибка превышения контекста

{
  "error": {
    "code": "input_tokens_exceeded",
    "message": "Input tokens exceed model context limit. Model: 'openai/gpt-4o', Context length: 128000 tokens, Input tokens: 130000 (max allowed: 121600). Reduce message length."
  }
}

Ошибка провайдера

{
  "error": {
    "code": "openrouter_error",
    "message": "OpenRouter: Model 'openai/gpt-4o' is currently rate limited. Please try again later."
  }
}

Ошибка недостаточного баланса

{
  "error": {
    "code": "insufficient_balance",
    "message": "Недостаточно средств на балансе. Требуется: 10.50 ₽, Доступно: 5.00 ₽. Пожалуйста, пополните баланс или уменьшите параметр max_tokens / объём контекстного окна в запросе."
  }
}

Ошибка недоступного эндпоинта

{
  "error": {
    "code": "endpoint_not_found",
    "message": "Такого эндпоинта не существует, обратитесь к документации."
  }
}

Ошибка неподдерживаемого Media Type

{
  "error": {
    "code": "unsupported_media_type",
    "message": "Unsupported Media Type. Only application/json is allowed.",
    "received": "text/plain"
  }
}

Ошибка видео (модель требует изображение)

{
  "error": {
    "code": "video_generation_error",
    "message": "Эта модель работает только с изображением первого кадра. Загрузите изображение («Первый кадр») в настройках видео и попробуйте снова."
  }
}

Ошибки в streaming-режиме

При использовании stream: true ошибки обрабатываются по-разному в зависимости от момента возникновения.

Pre-Stream ошибки

Ошибки до отправки первого токена возвращаются как обычный HTTP-ответ с соответствующим статусом (4xx/5xx).

Debug mode (echo_upstream_body)

Прокси не фильтрует debug-чанки от OpenRouter. Если запрос содержит debug: { echo_upstream_body: true }, первый чанк SSE-потока будет содержать debug-данные с преобразованным телом запроса:

{
  "id": "gen-xxxxx",
  "provider": "Anthropic",
  "model": "anthropic/claude-haiku-4.5",
  "object": "chat.completion.chunk",
  "created": 1234567890,
  "choices": [],
  "debug": {
    "echo_upstream_body": {
      "system": [{ "type": "text", "text": "You are a helpful assistant." }],
      "messages": [{ "role": "user", "content": "Hello!" }],
      "model": "claude-haiku-4-5-20251001",
      "stream": true,
      "max_tokens": 64000
    }
  }
}

Важно: Debug mode работает только с stream: true.

Moderation и Guardrail

Если провайдер возвращает moderation/guardrail-ошибку, прокси ретранслирует её клиенту. Формат соответствует ответу провайдера:

{
  "error": {
    "code": 403,
    "message": "Request blocked: prompt injection patterns detected",
    "metadata": {
      "patterns": ["ignore all previous instructions"]
    }
  }
}

Медиа-типы

Поддерживаемые Content-Type для запросов:

Эндпоинт Допустимые Content-Type
Все эндпоинты, кроме audioapplication/json, application/json; charset=utf-8
/audio/transcriptions, /audio/translationsapplication/json, multipart/form-data