Ошибки и статусы
Справочник ошибок API NeuroAPI: HTTP-статусы, машинные коды, повторные попытки с backoff и стабильность.
Обрабатывайте HTTP-статус и машинный error.code, а не сравнивайте полный текст сообщения. Текст предназначен человеку и может уточняться.
{
"error": {
"message": "Безопасное описание ошибки",
"type": "neuroapi_error",
"code": "upstream_unavailable"
}
}Ошибки запроса — нужно действие с вашей стороны
| HTTP | Код | Текст, который возвращает API | Причина и что делать | Повтор |
|---|---|---|---|---|
| 400 | insufficient_user_quota | Недостаточно средств на балансе. Пополните баланс и повторите запрос. | Пополните баланс в личном кабинете. | Нет |
| 400 | insufficient_company_quota | Недостаточно средств на балансе компании. Пополните баланс и повторите запрос. | Пополните баланс компании. | Нет |
| 400 | pre_consume_token_quota_failed | Недостаточно квоты API-ключа. Проверьте лимиты ключа или создайте новый. | Проверьте лимит ключа или создайте новый ключ. | Нет |
| 400 | moderation_blocked | Запрос отклонён правилами безопасности. Переформулируйте его, уберите чувствительные данные или небезопасные инструкции и повторите попытку. | Переформулируйте запрос. Внутренние коды content_filter, sensitive_words_detected и им подобные приводятся к этому же коду и тексту. | Нет |
| 400 | max_tokens | Невозможно сгенерировать ответ. Увеличьте max_tokens и повторите запрос. | Увеличьте max_tokens. | Нет |
| 400 | invalid_max_tokens | Параметр ограничения ответа должен быть целым числом от 1 до N. Исправьте параметр и повторите запрос. | Передайте целое число в допустимых пределах; N — актуальный лимит платформы, он подставляется в текст ответа. | Нет |
| 400 | invalid_tool_choice | Параметр tool_choice несовместим с переданными tools. Для auto/none без инструментов удалите tool_choice; для required или выбора функции добавьте соответствующий инструмент. | Согласуйте tool_choice со списком tools. | Нет |
| 400 | no_candidates | Модель не смогла сформировать ответ для такого запроса. Смягчите или уточните формулировку и повторите попытку. | Смягчите или уточните формулировку запроса. | Нет |
| 400 | invalid_image_input | Не удалось прочитать изображение. Проверьте формат файла и повторите запрос. | Проверьте формат и целостность изображения. | Нет |
| 400 | invalid_text_request / invalid_embedding_request / invalid_responses_request | Не удалось обработать параметры запроса. Проверьте формат и повторите попытку. | Сверьте тело запроса с документацией выбранного метода. | Нет |
| 400 | invalid_video_request | Не удалось обработать параметры видеозапроса. Проверьте длительность, разрешение и формат, затем повторите попытку. | Проверьте длительность, разрешение и формат входных данных. | Нет |
| 400 | invalid_audio_request / count_audio_token_failed | Не удалось прочитать аудиофайл: он повреждён или имеет неподдерживаемый формат. Проверьте файл или конвертируйте его в MP3/WAV и повторите запрос. | Проверьте целостность аудиофайла (обрезанный файл даёт ошибку декодирования) или конвертируйте в MP3/WAV. | Нет |
| 400 | invalid_external_media / count_token_failed_file_url_fetch | Не удалось получить файл по ссылке. Проверьте доступность ссылки или передайте файл как data URL в Base64. | Убедитесь, что ссылка публичная и открывается без авторизации, либо передайте файл как Base64. | Нет |
| 400 | convert_request_failed | Не удалось подготовить запрос для выбранной модели. Проверьте параметры и повторите попытку. | Проверьте совместимость параметров с выбранной моделью. | Нет |
| 400 | unsupported_service_tier | Выбранный режим обслуживания (service_tier) не поддерживается. Уберите параметр или выберите другой. | Уберите параметр service_tier или выберите другой. | Нет |
| 400 | effective_request_unsupported | Запрос в текущем виде не поддерживается. Упростите параметры и повторите попытку. | Упростите набор параметров запроса. | Нет |
| 400 | context_length_exceeded | Запрос превышает допустимую длину контекста. Сократите сообщения или выберите модель с большим контекстом. | Сократите контекст или выберите модель с большим контекстом. | Нет |
| 400 / 404 | invalid_api_type / api_not_implemented | Этот метод API не поддерживается для выбранной модели. | Используйте поддерживаемый метод API для выбранной модели. | Нет |
| 400 | count_token_failed | Не удалось обработать содержимое запроса. Проверьте вложения и параметры, затем повторите попытку. | Проверьте вложения и параметры запроса. | Нет |
| 400 | upstream_invalid_request | Не удалось обработать параметры запроса. Проверьте формат запроса и повторите попытку. | Проверьте формат запроса; это также общий ответ на неизвестные ошибки 400/422. | Нет |
Временная недоступность — повторяйте с backoff
| HTTP | Код | Текст, который возвращает API | Причина и что делать | Повтор |
|---|---|---|---|---|
| 503 | upstream_unavailable | Выбранная модель временно недоступна. Повторите попытку позже. | Повторите с backoff: платформа уже перебрала доступные маршруты. | Да |
| 503 | upstream_unavailable | Сейчас слишком большая нагрузка, попробуйте позже. | Внутренние коды rate_limit_exceeded, too_many_requests, upstream_quota_exhausted и temporarily_unavailable приводятся к этому же коду и тексту. | Да |
| 503 | upstream_model_unavailable / upstream_auth_rejected / upstream_api_format_incompatible | Выбранная модель временно недоступна. Повторите попытку позже. | Временный сбой на стороне генерации; повторите позже. | Да |
| 503 | upstream_header_timeout | Сервис временно недоступен. Повторите попытку позже. | Маршрут не отдал первый ответ за адаптивный бюджет (p95 по модели). Платформа сама перебирает другие маршруты; получили этот финал — повторите с backoff. Не рвите соединение раньше времени: у моделей со скрытым рассуждением первый токен честно идёт минуты. | Да |
| 503 | do_request_failed | Сервис временно недоступен. Повторите попытку позже. | Повторите с backoff. | Да |
| 502 | provider_result_unknown | Не удалось доставить полный ответ. Списание за эту попытку отменено; повторите запрос. | Списание за попытку отменено — безопасно повторить запрос. | Да |
| 503 | empty_stream_response / incomplete_upstream_stream / responses_stream_timeout | Ответ был прерван. Повторите запрос ещё раз. | Поток ответа прерван; повторите запрос. | Да |
| 503 | invalid_upstream_response / invalid_response / bad_response_body / read_response_body_failed / unmarshal_response_body_failed | Сервис получил некорректный ответ. Повторите запрос позже. | Повторите с backoff. | Да |
| 503 | channel_stream_queue_timeout и другие *_queue_timeout / *_capacity_exceeded | Сервис перегружен. Повторите попытку позже. | Очередь запросов переполнена; повторите с backoff и снизьте параллелизм. | Да |
| 503 | get_channel_failed | Сейчас слишком большая нагрузка, попробуйте позже. | Повторите с backoff. | Да |
| 500 | internal_error / local_token_count_failed | Что-то пошло не так, попробуйте позже. | Временная ошибка платформы; повторите с backoff. | Да |
| 503 | external_media_busy / external_media_unavailable | Сервис загрузки файлов временно перегружен. Повторите попытку через несколько секунд. | Повторите через несколько секунд или передайте файл как Base64. | Да |
| 503 | local_tokenizer_busy | Сервис обработки запросов временно перегружен. Повторите попытку позже. | Повторите с backoff. | Да |
| 503 | model_price_error | Выбранная модель временно недоступна. Повторите попытку позже. | Повторите позже. | Да |
| 503 | context_limit_format_unsupported / count_tokens_channel_unsupported | Эта возможность временно недоступна для выбранной модели. | Повторите позже или используйте другую модель. | Да |
| 500 | billing_settlement_pending | Ответ обработан, но учёт списания завершится автоматически. Списание за попытку не изменится. | Учёт завершится автоматически; повтор запроса безопасен. | Да |
| 503 | video_create_result_unknown / video_task_persistence_failed | Сервис видеогенерации временно недоступен. Повторите попытку позже. | Повторяйте POST, только если не получен ID задачи или HTTP 202. | Да |
Коды, которых нет в таблице, приводятся к ближайшему безопасному варианту по HTTP-статусу: 400/422 → upstream_invalid_request, 401/403/429 и 5xx → upstream_unavailable, всё остальное → internal_error.
Стабильность и перегрузки
Если вы часто видите 429/503 или ошибки перегрузки, проверьте тариф API-ключа: резервный маршрут и официальные каналы заметно снижают число сбоев.
Тариф «Смарт» (группа auto)
Сначала использует экономичный «Пилот», а при сбое делает ровно одну безопасную резервную попытку через «Оптимальный». Списание всегда идёт по группе успешной попытки, фиксированного коэффициента нет. Подходит большинству нагрузок: дешевле, когда всё стабильно, и живучее при перегрузках.
Тариф «Оптимальный» (группа plus)
Коммерческие официальные API-каналы — максимальная стабильность для продуктивных нагрузок, где важнее предсказуемость, чем экономия.
Переключение — в настройках API-ключа (группа токена). Ни один тариф не обещает ноль ошибок: резервный маршрут снижает число сбоев, но обрабатывать временные ошибки в коде всё равно нужно.
Когда повторять
Повторяйте только явно полученные временные 429/502/503/504. Ответ 429/503 означает, что платформа уже перебрала доступные маршруты, — делайте повтор с экспоненциальной задержкой, jitter и ограничением числа попыток, как в примере ниже. Запросы с hosted tools или генерацией изображений платформа может сознательно не повторять между маршрутами (защита от двойного списания) — в этом случае безопасно повторить тот же запрос со стороны клиента. Сетевой таймаут после отправки тела запроса может означать, что генерация уже началась: не повторяйте создающий POST вслепую.
Когда не повторять
400/422, цензура, неверные медиа и недостаток баланса требуют действия пользователя. Автоматический повтор только создаст лишнюю нагрузку.
Таймауты клиента
Не разрывайте соединение раньше времени — пока идёт ожидание, платформа сама перебирает маршруты, а у моделей со скрытым рассуждением (GPT-5.6, Claude) первый токен честно занимает минуты. Рекомендуемые таймауты на первый ответ: 120 секунд для лёгких моделей, 300 секунд для моделей с рассуждением, до 600 секунд для тяжёлых (Claude Opus, GPT-5.6 Sol), 360 секунд для генерации изображений. Клиент, отключающийся на 30–60 секундах, будет регулярно терять ответы, которые уже почти дошли.
const retryable = new Set([429, 502, 503, 504]);
async function requestWithBackoff(run: () => Promise<Response>) {
for (let attempt = 0; attempt < 3; attempt += 1) {
const response = await run();
if (response.ok || !retryable.has(response.status)) return response;
if (attempt === 2) return response;
const retryAfter = Number(response.headers.get("retry-after"));
const delay = Number.isFinite(retryAfter)
? retryAfter * 1000
: 1000 * 2 ** attempt + Math.random() * 300;
await new Promise((resolve) => setTimeout(resolve, delay));
}
throw new Error("unreachable");
}Важно: для асинхронного видео действуют более строгие правила: если получен task ID или HTTP 202, повторять POST нельзя. Повторяйте только GET статуса или скачивания.
Медиа по внешней ссылке
Ссылка может быть недоступна, слишком медленна либо затронута сетевой фильтрацией и ТСПУ Роскомнадзора. Проверьте, что URL публичный и открывается без cookie/авторизации. Для небольших файлов надёжнее скачать их в приложении и передать Base64.
Информация: если запрос завершился ошибкой NeuroAPI или провайдера, стоимость успешной генерации не списывается. При спорном списании сохраните время, модель и request id и обратитесь в поддержку.