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: он покажет, в ключе проблема или в коде приложения.

/ На kosareva.cloud

Ключ сразу после регистрации

Ключ передаётся в обычном заголовке Authorization: Bearer, как у OpenAI. Готовые примеры с нашим адресом — в кабинете, в разделе «Документация».

Адрес
https://api.kosareva.cloud/v1, ключ из кабинета
Оплата
Карта РФ или СБП от 50 ₽, компаниям — по счёту
Доступ
Без VPN, запросы идут с российских IP
from openai import OpenAI

client = OpenAI(
    api_key="ВАШ_API_КЛЮЧ",
    base_url="https://api.kosareva.cloud/v1",
)

response = client.chat.completions.create(
    model="gpt-5-6",
    messages=[{"role": "user", "content": "Привет!"}],
    stream=True,
)
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: "ВАШ_API_КЛЮЧ",
  baseURL: "https://api.kosareva.cloud/v1",
});

const response = await client.chat.completions.create({
  model: "gpt-5-6",
  messages: [{ role: "user", content: "Привет!" }],
  stream: true,
});
curl https://api.kosareva.cloud/v1/chat/completions \
  -H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-5-6","messages":[{"role":"user","content":"Привет!"}],"stream":true}'
/ Почему

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

Заголовок не отправлен

В curl забыт флаг -H, в коде ключ передан не в тот параметр.

Нет слова Bearer

Или лишние кавычки внутри значения заголовка Authorization.

Формат другого провайдера

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.

Ключ работал вчера, а сегодня 401 — почему?

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

Mantella пишет 401 missing authentication header

Запрос ушёл без заголовка с ключом. Для языковой модели Mantella берёт ключ из файла GPT_SECRET_KEY.txt в папке мода или из secret_keys.json, где ключ записан под адресом сервиса. А распознавание речи на свой адрес, если в нём нет слова openai, Mantella отправляет без ключа: это ограничение самого мода. Как подключить Mantella к нашему API — на странице Нейросеть для Скайрима.

Как проверить ключ, не тратя деньги?

Запросите список моделей: GET на /v1/models с тем же заголовком Authorization токены не расходует. Ответ 200 со списком значит, что ключ и адрес рабочие, 401 — что сервер ключ не узнал. У Anthropic в этом запросе ключ передаётся в заголовке x-api-key вместе с anthropic-version.

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

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

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