Отправьте эталонный запрос
Минимальная команда без кода приложения. Если она проходит, проблема в приложении.
Сервер не узнал, кто вы. Либо ключа нет в запросе, либо он передан не в том месте. Разбираем по строчкам.
Коротко: Код 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: Bearer, как у OpenAI. Готовые примеры с нашим адресом — в кабинете, в разделе «Документация».
https://api.kosareva.cloud/v1, ключ из кабинета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, в коде ключ передан не в тот параметр.
Или лишние кавычки внутри значения заголовка Authorization.
x-api-key вместо Authorization или наоборот.
Переменная окружения не задана, и SDK отправил пустую строку.
Прокси или корпоративный шлюз удаляет заголовок Authorization.
Ключ верный, но сервер другого сервиса вашего ключа не знает.
Минимальная команда без кода приложения. Если она проходит, проблема в приложении.
В Python: print(len(os.environ.get("OPENAI_API_KEY", ""))). Ноль означает, что .env не прочитан.
OpenAI-совместимые API: Authorization: Bearer ключ. Anthropic напрямую: x-api-key: ключ плюс anthropic-version.
Если запрос идёт через корпоративный прокси, попросите пропускать заголовок Authorization для адреса API.
OpenAI(api_key=…, base_url=…). Ключ в параметре, не в заголовке вручную: SDK сам добавит Bearer.
new OpenAI({ apiKey, baseURL }). Обратите внимание на регистр: baseURL, не base_url.
В credentials типа OpenAI ключ подставляется автоматически. В ноде HTTP Request заголовок Authorization нужно добавить руками, со словом Bearer.
Вкладка Auth, тип Bearer Token. Не вставляйте ключ в Headers вторым экземпляром.
Переменная ANTHROPIC_AUTH_TOKEN, а не ANTHROPIC_API_KEY, если вы работаете через совместимый шлюз.
При 401 сервер не понял, кто вы. При 403 понял, но запретил: не та страна, не тот план, нет доступа к модели.
Приложение отправляет что-то другое: пустую переменную, ключ с пробелом или не тот заголовок. Залогируйте длину ключа и заголовки запроса.
Для большинства сервисов нет. Если он задан со старым значением, OpenAI может ответить 401.
Скорее всего, ключ отозван: его удалили в консоли, удалили проект, к которому он привязан, или поставщик отключил его, обнаружив в публичном репозитории. Проверьте, есть ли ключ в списке активных, и при необходимости выпустите новый. Если ключ на месте, посмотрите, не перезаписал ли деплой переменную окружения старым значением.
Запрос ушёл без заголовка с ключом. Для языковой модели 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 ₽.