NezhaGateNezhaGate

Единый формат для всех ошибок, что означает каждый код и что делать, если вы его получили.

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

При ошибке эндпоинт /v1 возвращает статус 4xx / 5xx и JSON, как в примере ниже: message — текст для человека, type — общий класс ошибки, code — стабильный машиночитаемый идентификатор, а param называет поле, в котором ошибка (null, если такого поля нет). Ориентируйтесь на HTTP-статус и code, а не на текст message: он может быть на английском, на китайском или на обоих языках сразу, и его формулировки меняются.

HTTP 402 · /v1
{
  "error": {
    "message": "Insufficient balance — please top up",
    "type": "insufficient_quota",
    "code": "insufficient_quota",
    "param": null
  }
}

Эндпоинты /anthropic используют собственный формат Anthropic, без code и param; ориентируйтесь на HTTP-статус и error.type:

HTTP 404 · /anthropic
{
  "type": "error",
  "error": {
    "type": "not_found_error",
    "message": "model: gpt-5.5"
  }
}
  • Некоторые ошибки содержат дополнительные поля верхнего уровня, например attempts, когда заняты все линии, или retry_after, когда свободной линии временно нет. Незнакомые поля просто игнорируйте.
  • Если поставщик модели отклоняет запрос (например, из-за слишком длинного контекста), в message — формулировка самого поставщика, а в code — его значение или invalid_request, если он его не передал.

HTTP-статусы: краткая сводка

HTTPКогда возникает
400Неверный параметр или неизвестная модель (например, model_not_found); error.param указывает на поле.
401Нет ключа, или он недействителен либо отключён (missing_api_key, invalid_api_key).
402Недостаточно средств или ключ исчерпал свой бюджет (insufficient_quota).
403Модели нет в списке разрешённых моделей ключа, или запрос пришёл не с разрешённого для ключа IP (permission_denied).
404Пути не существует, либо id задачи неизвестен, старше 3 дней хранения записи или задачу отправил другой аккаунт (job_not_found).
429Превышен лимит запросов в минуту для этого ключа или дневная квота бесплатной модели, либо заняты все линии модели (rate_limit_exceeded). Подождите столько секунд, сколько указано в Retry-After, а если его нет — несколько секунд, и повторите.
502Ошибка или таймаут на стороне поставщика, и переключение линий не помогло; причина в code, например upstream_timeout или upstream_unavailable. Запрос не оплачивается, его можно повторить.
503Модель на обслуживании (model_maintenance) или на нашей стороне произошёл кратковременный сбой (service_unavailable). Запрос не оплачивается; повторите позже.

Все коды ошибок

Ошибки, которые возвращает шлюз, по категориям. Одному HTTP-статусу может соответствовать несколько кодов, поэтому ориентируйтесь на code.

Авторизация и аккаунт

HTTPcodeПричинаЧто делать
401missing_api_keyНет заголовка Authorization: Bearer. Эндпоинты /v1 не читают x-api-key.Добавьте Authorization: Bearer YOUR_API_KEY.
401invalid_api_keyКлюч не существует, удалён или отключён, либо отключён аккаунт.Проверьте ключ на странице API Keys в консоли.
402insufficient_quotaБаланс аккаунта исчерпан (опустился ниже порога овердрафта).Пополните баланс и повторите.
403permission_deniedЗапрос пришёл с IP, которого нет в списке разрешённых IP ключа.Отправляйте запросы с разрешённого IP или измените список в консоли.

Лимиты, заданные для ключа

HTTPcodeПричинаЧто делать
429rate_limit_exceededПревышен лимит запросов в минуту, заданный для этого ключа (считается за последние 60 секунд). Заголовка Retry-After нет.Подождите несколько секунд и повторите или увеличьте лимит ключа в консоли.
429rate_limit_exceededИсчерпана дневная квота бесплатной модели (на аккаунт, за сутки по UTC). В message может быть предложена платная модель на замену.Продолжите после 00:00 UTC или перейдите на платную модель.
402insufficient_quotaИсчерпан дневной бюджет ключа (за сутки по UTC) или его общий лимит.Продолжите на следующий день или увеличьте лимит в консоли.
403permission_deniedМодели нет в списке разрешённых моделей ключа.Используйте модель из списка разрешённых или измените список в консоли.

Сам запрос

HTTPcodeПричинаЧто делать
400invalid_json / invalid_encodingТело запроса — невалидный JSON; если оно не в UTF-8 — invalid_encoding.Проверьте синтаксис JSON и кодировку.
400invalid_requestНедопустимый параметр: тело запроса — не JSON-объект, n — не целое число, не удаётся прочитать референсное изображение или видео (в message указано, какое и почему), в /v1/images/edits нет референсного изображения, длительность / разрешение / пропорция / число референсов видео выходят за пределы, допустимые для модели, и т. п.Исправьте то, что указано в message, и отправьте снова.
400invalid_messages / invalid_role / invalid_max_tokensВ запросе к чату поле messages отсутствует, пустое или имеет неверный формат, у role недопустимое значение либо max_tokens — не положительное целое число. Поле указано в param.Исправьте поле, указанное в param.
400missing_promptВ запросе к /v1/images/generations нет prompt.Добавьте prompt.
400unsupported_resolutionМодель не поддерживает выбранный уровень разрешения (например, у генерации изображений Grok нет 4K).Выберите другой уровень; доступные уровни указаны в документации каждой модели.
400invalid_callback_urlcallback_url — не публичный адрес http(s) или длиннее 2000 символов.Укажите адрес, доступный из интернета.
400max_tokens_too_smallМодель с размышлениями потратила весь max_tokens на размышления и не написала ответ (непотоковый чат).Увеличьте max_tokens и повторите.
404not_foundТакого пути эндпоинта не существует.Проверьте путь; все эндпоинты перечислены в справочнике API.
404job_not_foundID задачи неизвестен, срок хранения записи (3 дня) истёк или задачу отправил другой аккаунт; та же ошибка возникает, если опрашивать задачу изображения через эндпоинт видео (или наоборот).Проверьте id задачи и эндпоинт. Ссылка на результат хранится 60 дней, и истечение срока хранения записи о задаче на неё не влияет.

Статус модели

HTTPcodeПричинаЧто делать
400model_not_foundID модели написан с ошибкой, model не передан или модель нельзя использовать на этом эндпоинте (например, чат-модель на эндпоинте изображений).Берите ID модели из GET /v1/models или из справочника API.
400model_disabledМодель снята с продажи.Перейдите на другую модель; если у модели есть замена, её страницы перенаправляют на замену.
400model_coming_soonМодель анонсирована, но вызывать её пока нельзя.Дождитесь объявления о запуске.
503model_maintenanceМодель на обслуживании и не принимает запросы; пока идёт обслуживание, другая модель вместо неё не ответит.Повторите, когда обслуживание закончится; ход работ — на странице статуса.

Загрузка и резерв

HTTPcodeПричинаЧто делать
402insufficient_quotaБаланса не хватает, чтобы зарезервировать стоимость этого запроса. Шлюз сначала резервирует максимально возможную стоимость запроса, поэтому ошибка может возникнуть и при всплеске одновременных вызовов.Если был всплеск запросов, подождите несколько секунд и повторите; в остальных случаях пополните баланс.
429rate_limit_exceededВсе линии этой модели заняты, и запрос не был отправлен. Бывает только на эндпоинтах чата: задачи изображений и видео не отклоняются, а встают в очередь. OpenAI-совместимые эндпоинты добавляют Retry-After.Подождите столько секунд, сколько указано в Retry-After, и повторите.
503service_unavailableВременный сбой на нашей стороне, например при сохранении референсного файла; /v1/responses также отвечает 503 с Retry-After, когда свободной линии временно нет.Повторите чуть позже.

Ошибки поставщика (эндпоинты чата)

Если эндпоинт чата (/v1/chat/completions, /v1/responses, /anthropic/v1/messages) получает ошибку, шлюз сначала повторяет запрос на других линиях и возвращает одну из этих ошибок, только когда ошибкой завершились все линии. Ни одна из них не оплачивается.

HTTPcodeПричинаЧто делать
502upstream_timeoutЛиния не уложилась в таймаут, в том числе слишком долго не отправляла первый токен.Повторите; для длинных ответов используйте stream: true.
502upstream_unavailableЛиния дала сбой или временно недоступна.Повторите чуть позже.
502upstream_busyПоставщик модели ограничивает частоту запросов. Его 429 никогда не передаётся вам как 429 — вместо этого вы получаете этот 502.Повторите чуть позже.
502upstream_connection_errorСоединение с поставщиком модели оборвалось.Повторите.
502empty_completionПоставщик модели вернул пустой ответ. Это не оценка вашего контента.Повторите.
502upstream_errorВместо ответа линия вернула фразу об ошибке.Повторите.
400content_filterМодель обработала запрос, но ничего не вернула — обычно потому, что контент попал под политику безопасности поставщика.Измените промпт и повторите; тот же промпт обычно отклоняется снова.
502upstream_prompt_filterПромпт остановила предварительная проверка поставщика. Это не оценка контента самой моделью.Повторите чуть позже или немного измените формулировку.
4xx—Поставщик модели отклонил запрос (например, из-за слишком длинного контекста или неподдерживаемого параметра); статус и message передаются в том виде, в каком их прислал поставщик, а в code — его значение.Измените запрос согласно message.

Эндпоинты Anthropic

  • error.type принимает стандартные значения Anthropic в зависимости от статуса: 400 invalid_request_error, 401 authentication_error, 402 billing_error, 403 permission_error, 404 not_found_error, 429 rate_limit_error (overloaded_error, когда заняты все линии), 502 api_error, 503 overloaded_error (api_error, пока модель на обслуживании).
  • /anthropic принимает только модели Claude; на любую другую модель вернётся 404 not_found_error.
  • max_tokens обязателен и не может быть равен 0, иначе вернётся 400.

Неудачные задачи (изображения и видео)

Если задача изображения или видео завершилась ошибкой уже после того, как была принята, эндпоинт задачи всё равно отвечает HTTP 200, а status равен failed; причина — в error, а error.code принимает одно из значений ниже. Зарезервированные под задачу кредиты уже вернулись на баланс. С вебхуком вы получите image.failed / video.failed с тем же содержимым.

codeКогда возникаетЧто делать
content_policyВидео: промпт, референс или сгенерированный видеоряд либо звук не прошли проверку контента (если отклонён звук, param равен audio).Перепишите промпт или замените референс и только потом отправляйте снова: те же входные данные будут отклонены повторно.
moderation_blockedИзображение: система безопасности поставщика модели отклонила промпт или референсное изображение (код может быть и content_policy_violation).Перепишите промпт или замените референс; повторная отправка без изменений обычно снова отклоняется.
render_failedВидео: на этот раз ролик не получился; обычно это разовый сбой.Повторная отправка того же запроса обычно проходит успешно.
invalid_materialВидео: поставщик обнаружил проблему во входных данных. Это общая ошибка, и часто она разовая.Сначала отправьте задачу ещё раз без изменений; если ошибка повторяется, проверьте референсы и длину промпта.
render_timeoutВидео: очередь или рендер заняли слишком много времени, и поставщик отказался от задачи.Отправьте задачу заново.
wait_timeoutВидео: ролик не пришёл за максимальное время ожидания, которое допускает линия.Отправьте задачу заново.
upstream_unstableВидео: во время рендера оборвалось соединение.Отправьте задачу заново.
result_fetch_failedВидео создано, но на нашей стороне его так и не удалось скачать или сохранить, несмотря на повторные попытки.Отправьте задачу заново.
invalid_requestВидео: линия не принимает такое сочетание параметров (например, длительности, пропорции и разрешения).Измените параметры согласно message и отправьте снова.
upstream_errorЛюбая другая ошибка: перепробованы все линии, задача ждала 15 минут и так и не запустилась, поставщик отказал без объяснения причины и т. п.; что именно произошло, указано в message.Обычно повторная отправка проходит успешно.

Полное руководство по асинхронным задачам →

Ошибки посреди потока

  • Когда потоковый запрос уже ответил HTTP 200 и начал передачу, последующая ошибка не может изменить статус: она либо приходит как событие данных с error, либо поток просто заканчивается.
  • Проверяйте, что поток пришёл целиком: в формате OpenAI должны прийти finish_reason и data: [DONE], в формате Anthropic — message_stop. Если их нет, считайте поток оборванным.
  • Оборвавшийся поток оплачивается по объёму, сгенерированному до обрыва; подробнее — в разделе Оплата и возвраты.

Оплачиваются ли ошибки?

  • Запрос, вернувший ошибку, никогда не оплачивается: либо ошибка возникает до списания, либо резерв возвращается полностью.
  • За неудачные задачи изображений и видео деньги возвращаются полностью.
  • Единственное исключение — поток, который уже начался: если он оборвётся, вы платите за то, что успело сгенерироваться до обрыва.

Когда повторять запрос

При 4xx сначала исправьте запрос (при 402 пополните баланс, при 429 немного подождите); ошибки 5xx и таймауты можно повторять без изменений, с экспоненциальной задержкой, а если есть Retry-After — ждать столько, сколько в нём указано.

Стратегия повторов и пример кода →