kosareva.cloud

Ошибка 401 в API: что значит и как правильно передать ключ

Сервер не узнал, кто вы. Либо ключа нет в запросе, либо он передан не в том месте. Разбираем по строчкам.

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

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

Код 401 Unauthorized означает, что запрос дошёл до сервера, но сервер не смог вас опознать: заголовок с ключом отсутствует, стоит не в том поле или содержит неверное значение. Отличие от 403 важное: при 403 сервер вас узнал, но запретил действие, при 401 он вас не узнал вовсе.

Текст ошибки подсказывает причину. Missing authentication header значит, что заголовка Authorization в запросе нет: он потерялся при копировании команды, не поддержан клиентом или отброшен прокси. Invalid token или incorrect API key значит, что заголовок есть, а ключ в нём неверный.

В OpenAI-совместимых API ключ передаётся строго так: заголовок Authorization со значением Bearer, пробел, ключ. Anthropic ждёт заголовок x-api-key без слова Bearer. Перепутанный формат даёт 401 при полностью верном ключе. Первым делом отправьте минимальный запрос через curl: он покажет, в ключе проблема или в коде приложения.

/ Почему

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

  • Заголовок Authorization не отправлен: в curl забыт флаг -H, в коде ключ передан не в тот параметр.
  • Нет слова Bearer или лишние кавычки внутри значения заголовка.
  • Формат другого провайдера: x-api-key вместо Authorization или наоборот.
  • Ключ пустой: переменная окружения не задана, и SDK отправил пустую строку.
  • Прокси или корпоративный шлюз вырезает заголовок Authorization.
  • Ключ верный, но адрес не тот: сервер другого сервиса не знает вашего ключа.
/ Что делать

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

01

Отправьте эталонный запрос

Минимальная команда без кода приложения. Если она проходит, проблема в приложении.

curl https://api.kosareva.cloud/v1/chat/completions \
  -H "Authorization: Bearer ВАШ_КЛЮЧ" \
  -H "Content-Type: application/json" \
  -d '{"model":"claude-sonnet-5","messages":[{"role":"user","content":"Привет"}]}'
02

Проверьте, что ключ не пустой

В Python: print(len(os.environ.get("OPENAI_API_KEY", ""))). Ноль означает, что .env не прочитан.

03

Сверьте формат заголовка

OpenAI-совместимые API: Authorization: Bearer ключ. Anthropic напрямую: x-api-key: ключ плюс anthropic-version.

04

Посмотрите на прокси

Если запрос идёт через корпоративный прокси, попросите пропускать заголовок Authorization для адреса API.

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

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

  • Python SDK. OpenAI(api_key=…, base_url=…). Ключ в параметре, не в заголовке вручную: SDK сам добавит Bearer.
  • Node.js SDK. new OpenAI({ apiKey, baseURL }). Обратите внимание на регистр: baseURL, не base_url.
  • n8n. В credentials типа OpenAI ключ подставляется автоматически. В ноде HTTP Request заголовок Authorization нужно добавить руками, со словом Bearer.
  • Postman и Insomnia. Вкладка Auth, тип Bearer Token. Не вставляйте ключ в Headers вторым экземпляром.
  • Claude Code. Переменная ANTHROPIC_AUTH_TOKEN, а не ANTHROPIC_API_KEY, если вы работаете через совместимый шлюз.
/ FAQ

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

Чем 401 отличается от 403?

При 401 сервер не понял, кто вы. При 403 понял, но запретил: не та страна, не тот план, нет доступа к модели.

Ключ правильный, curl работает, приложение даёт 401

Приложение отправляет что-то другое: пустую переменную, ключ с пробелом или не тот заголовок. Залогируйте длину ключа и заголовки запроса.

Нужен ли заголовок OpenAI-Organization?

Для большинства сервисов нет. Если он задан со старым значением, OpenAI может ответить 401.

/ На kosareva.cloud

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

Наш API принимает ключ в стандартном заголовке Authorization: Bearer, как и SDK OpenAI. Готовые примеры для curl, Python и Node.js с уже подставленным адресом лежат в кабинете в разделе «Документация», их можно копировать целиком.

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

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

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