kosareva.cloud

Ошибка 400 API: что значит bad request и как найти сломанное поле

Сервер прочитал ваш запрос и отказался его выполнять: что-то не так с самим содержимым. Ключ и деньги здесь обычно ни при чём, ищите поле.

/ Короткий ответ

Что это значит

Ошибка API с кодом 400 (bad request) значит, что запрос дошёл до сервера, но собран неверно: сломанный JSON, неизвестное поле, неправильный тип значения, слишком длинный контекст или недопустимое сочетание параметров. Сервер не стал его выполнять и вернул описание, что именно не так. Повторять такой запрос без изменений бессмысленно: он упадёт снова.

У OpenAI это type invalid_request_error, а в поле param часто стоит имя сломанного поля: messages, max_tokens, temperature. У Anthropic тот же смысл несёт invalid_request_error, и под 400 попадают ещё два случая, которые легко перепутать с другими кодами: превышение длины контекста и текст Your credit balance is too low, то есть пустой баланс. У Gemini под 400 идут API key not valid и User location is not supported, поэтому там 400 может означать и ключ, и регион.

Первым делом читайте поле message в теле ответа: в 9 случаях из 10 оно называет проблему прямо. Дальше проверьте формат messages, имя модели, лимит max_tokens и параметры, которые вы добавили последними.

/ Почему

Откуда берётся ошибка

  • Сломанный JSON: лишняя запятая, незакрытая кавычка, кириллица в неверной кодировке, тело отправлено строкой вместо объекта.
  • Неверный формат messages: нет поля role или content, роль написана с большой буквы, контент передан не строкой и не массивом блоков.
  • max_tokens больше, чем осталось: сумма входа и запрошенного выхода превышает контекст модели. У Anthropic это отдельный текст про context length, у OpenAI code context_length_exceeded.
  • Параметр не поддерживается моделью: temperature у рассуждающих моделей, старое поле functions вместо tools, неизвестное поле, которое сервер не игнорирует.
  • Особые случаи Anthropic: пустой баланс тоже приходит как 400 с текстом credit balance is too low, а не как 402.
  • Особые случаи Gemini: API key not valid и User location is not supported приходят как 400, хотя по смыслу это 401 и 403.
/ Тексты ошибок

Что пишет сервер и что это значит

Текст в ответеПричинаЧто делать
invalid_request_error, param: messagesСломан формат массива сообщенийПроверьте role и content у каждого элемента
context_length_exceededВход плюс max_tokens больше контекста моделиСократите историю или уменьшите max_tokens
Unrecognized request argumentПоле, которого нет у этой модели или версии APIУберите поле или сверьтесь с документацией поставщика
Your credit balance is too low (Anthropic)Баланс исчерпан, запрос при этом корректныйПополните счёт: это не ошибка запроса
API key not valid (Gemini)Ключ не принят, хотя код 400Проверьте ключ и проект, к которому он привязан
User location is not supported (Gemini)Запрос из региона без поддержкиЧитайте разбор про регион по ссылке ниже

Тексты приведены по ответам OpenAI, Anthropic и Gemini на момент написания; точная формулировка может отличаться от версии к версии.

/ Что делать

Порядок действий

01

Прочитайте message и param

Тело ответа обычно называет поле напрямую. Если в логах инструмента видно только «400», включите вывод тела ответа или повторите запрос через curl.

02

Повторите запрос минимальным curl

Уберите всё лишнее: одна модель, одно сообщение, без температур и инструментов. Если минимальный запрос проходит, добавляйте поля по одному, пока не сломается.

curl https://api.kosareva.cloud/v1/chat/completions \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"model":"gpt-5-6","messages":[{"role":"user","content":"Привет"}]}'
03

Проверьте формат messages

Каждый элемент содержит role и content. Роли пишутся строчными: system, user, assistant. Контент либо строка, либо массив блоков, но не число и не null.

04

Сверьте max_tokens с контекстом

Посчитайте длину входа и уменьшите max_tokens так, чтобы сумма влезала в контекст модели. Для длинных диалогов обрезайте историю с начала.

05

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

У Anthropic пустой баланс и у Gemini неверный ключ тоже приходят как 400. Если message говорит про balance или key, чинить надо не запрос.

/ По инструментам

Где это чинится в разных инструментах

  • Python и Node.js SDK. Исключение BadRequestError, в нём поле body с полным ответом сервера. Печатайте body целиком, а не только строку исключения.
  • Cline, Continue. В чате видно «API request failed» и тело ответа. Чаще всего это лишний параметр из настроек провайдера или модель, которой нет.
  • n8n и Make. Ошибка приходит в ноду как текст. Проверьте, что поле messages собирается как массив, а не как строка с JSON внутри.
  • Claude Code и Codex CLI. 400 обычно приходит, когда base URL указывает на API другого формата: Anthropic-формат отправлен на OpenAI-совместимый адрес или наоборот.
/ FAQ

Частые вопросы

Стоит ли повторять запрос при 400?

Нет. В отличие от 429 и 5xx это ошибка содержимого: пока вы не измените запрос, ответ будет тот же.

Почему 400 приходит только на некоторых моделях?

Набор параметров у моделей разный: рассуждающие не принимают temperature, старые не знают tools. Один и тот же запрос может проходить на одной модели и падать на другой.

400 или 401, если ключ неверный?

У OpenAI и Anthropic неверный ключ даёт 401. У Gemini текст API key not valid приходит с кодом 400, поэтому там смотрите message, а не код.

/ На kosareva.cloud

Как это выглядит у нас

Наш шлюз принимает запросы в OpenAI-формате по адресу https://api.kosareva.cloud/v1 и в Anthropic-формате по https://api.kosareva.cloud, тело ошибки от поставщика пробрасывается без изменений, поэтому message и param читаются так же. Имена моделей у нас без точек: gpt-5-6, claude-sonnet-5, gemini-3-8-flash. Если 400 приходит из-за пустого баланса, в кабинете есть уведомление о низком балансе, чтобы не доводить до этого.

Ключ, который работает из России

OpenAI-совместимый адрес, оплата в рублях, ключ сразу после регистрации. Пополнение картой от 50 ₽.

Получить ключ