Ошибки — Errors API
Справочник ошибок API. Все ошибки возвращаются в едином формате.
Формат ошибки
{
"error": {
"code": "error_code",
"message": "Human-readable description"
}
}
HTTP-статус ответа совпадает с типом ошибки.
HTTP Status Codes
| Код | Название | Описание |
|---|---|---|
| 400 | Bad Request | Некорректный запрос (неверные или отсутствующие параметры, CORS) |
| 401 | Unauthorized | Неверные учётные данные (невалидный API-ключ, истекший ключ) |
| 402 | Payment Required | Недостаточно средств на балансе |
| 403 | Forbidden | Недостаточно прав, CSRF-блокировка или деактивированный аккаунт |
| 404 | Not Found | Эндпоинт или модель не найдены |
| 405 | Method Not Allowed | HTTP-метод не поддерживается для данного эндпоинта |
| 408 | Request Timeout | Запрос превысил время ожидания |
| 413 | Payload Too Large | Тело запроса превышает максимальный размер (10 MB) |
| 415 | Unsupported Media Type | Только application/json |
| 429 | Too Many Requests | Превышен лимит запросов (rate limit) или лимит API-ключа |
| 499 | Client Closed Request | Клиент прервал соединение (streaming) |
| 500 | Internal Server Error | Внутренняя ошибка сервера |
| 502 | Bad Gateway | Модель недоступна или получен некорректный ответ от провайдера |
| 503 | Service 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_supported | Streaming не поддерживается для данного эндпоинта |
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_balance | 402 | Недостаточно средств на балансе |
key_deactivated | 403 | API-ключ деактивирован |
account_deactivated | 403 | Аккаунт деактивирован |
Rate Limiting и лимиты (429)
| Код | Описание |
|---|---|
rate_limit_exceeded | Превышен лимит запросов. Содержит заголовок Retry-After с количеством секунд до следующего разрешённого запроса |
limit_exceeded | Превышен лимит API-ключа (дневной или месячный лимит расходов) |
Ошибки эндпоинтов
| Код | HTTP Status | Описание |
|---|---|---|
endpoint_not_found | 404 | Эндпоинт не найден |
method_not_allowed | 405 | HTTP-метод не поддерживается |
unsupported_media_type | 415 | Только application/json (и multipart/form-data для audio) |
request_too_large | 413 | Тело запроса превышает 10 MB |
Ошибки видео
| Код | HTTP Status | Описание |
|---|---|---|
missing_job_id | 400 | Не указан job_id |
job_not_found | 404 | Задача генерации видео не найдена |
video_not_ready | 400 | Видео ещё не готово (текущий статус) |
video_url_not_found | 404 | URL видео не найден |
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 |
|---|---|
| Все эндпоинты, кроме audio | application/json, application/json; charset=utf-8 |
/audio/transcriptions, /audio/translations | application/json, multipart/form-data |