Ошибки и статусы
Справочник ошибок 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: платформа уже перебрала доступные маршруты. | Да |
| 502 | upstream_empty_response | Провайдер вернул пустой ответ, хотя токены были израсходованы. Повторите попытку позже. | Повторите с 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 | Не удалось подтвердить результат запроса. Проверьте его состояние перед повторной отправкой. | Работа могла начаться. Если есть ID задачи, проверяйте её состояние; иначе обратитесь в поддержку. Резерв может сохраняться до подтверждения результата. | Не автоматически |
| 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)
Делает ровно одну физическую попытку на экономичном «Пилоте». При безопасной для повтора (retryable) ошибке сразу запускает полную цепочку «Оптимального». Списание всегда идёт по группе успешной физической попытки, фиксированного коэффициента нет. Подходит большинству нагрузок: дешевле, когда всё стабильно, и живучее при перегрузках.
Тариф «Оптимальный» (группа plus)
Коммерческие официальные API-каналы — максимальная стабильность для продуктивных нагрузок, где важнее предсказуемость, чем экономия.
Переключение — в настройках API-ключа (группа токена). Ни один тариф не обещает ноль ошибок: резервный маршрут снижает число сбоев, но обрабатывать временные ошибки в коде всё равно нужно.
Когда повторять
Повторяйте временные ошибки только когда операция безопасна для повтора. Одного статуса 429/502/503/504 недостаточно: он не доказывает, что генерация не началась или что списание отменено. Для безопасных повторов используйте экспоненциальную задержку, jitter и ограничение числа попыток.
Запросы с hosted tools, сохранённым состоянием или генерацией изображений могут продолжать выполняться после потери соединения. Если платформа не повторила такой запрос из-за неизвестного результата, повтор со стороны клиента также может создать вторую платную работу. При provider_result_unknown или сетевом таймауте после отправки не повторяйте создающий POST автоматически. Если получили ID задачи, проверяйте её через GET; если ID нет, сохраните request id и обратитесь в поддержку.
Когда не повторять
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]);
// Только чтение состояния: эта функция не отправляет повторные POST.
async function getWithBackoff(url: string, headers: HeadersInit) {
for (let attempt = 0; attempt < 3; attempt += 1) {
const response = await fetch(url, { method: "GET", headers });
if (response.ok || !retryable.has(response.status)) return response;
if (attempt === 2) return response;
const rawRetryAfter = response.headers.get("retry-after");
const retryAfter = rawRetryAfter?.trim()
? (/^\d+$/.test(rawRetryAfter.trim())
? Number(rawRetryAfter)
: (Date.parse(rawRetryAfter) - Date.now()) / 1000)
: NaN;
const delay = Number.isFinite(retryAfter) && retryAfter >= 0
? retryAfter * 1000 + Math.random() * 300
: 1000 * 2 ** attempt + Math.random() * 300;
if (delay > 30_000) return response;
await response.body?.cancel();
await new Promise((resolve) => setTimeout(resolve, delay));
}
throw new Error("unreachable");
}Важно: для асинхронного видео действуют более строгие правила: если получен task ID или HTTP 202, повторять POST нельзя. Повторяйте только GET статуса или скачивания.
Медиа по внешней ссылке
Ссылка может быть недоступна, слишком медленна либо затронута сетевой фильтрацией и ТСПУ Роскомнадзора. Проверьте, что URL публичный и открывается без cookie/авторизации. Для небольших файлов надёжнее скачать их в приложении и передать Base64.
Информация: ошибка доставки ответа не всегда означает, что генерация не выполнялась. При неизвестном результате резерв может сохраняться до сверки. При спорном списании сохраните время, модель и request id и обратитесь в поддержку.