Invalid API key OpenAI: как исправить ошибку 401
6 мин. чтения · 1 176 словБогдан КоломиецБогдан Коломиец

Invalid API key OpenAI: как исправить ошибку 401

Коротко о главном

Ошибка invalid_api_key в OpenAI: что означает код 401, чем он отличается от 403 и 429, пять причин отказа и починка каждой. С формулировками из справки.

Коротко: сервер не спорит с вашим кодом и не жалуется на модель. Он сообщает, что не узнал предъявленный секрет — и почти всегда прав. Разберу по порядку, как исправить ошибку invalid API key в OpenAI: сначала что означает сам код, потом чем он отличается от соседних 403 и 429, затем пять причин отказа и починка каждой.

«Первым делом смотрю не на код приложения, а на саму строку: её длину, хвост и то, из какого проекта она выпущена. Переписывать запрос до этой проверки — потерянный час», — Богдан, автор блога AI SEO Writer.

Что означает invalid_api_key

Код 401 относится к аутентификации: сервер проверяет, кто пришёл, ещё до того как посмотреть, что вы просите. Справка OpenAI Error Code 401 — Incorrect API key provided формулирует смысл прямо: «you're not using the expected API key in your request».

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

Как выглядит отказ в теле ответа

HTTP-код сам по себе говорит мало, потому что под 401 у OpenAI лежат три разные ситуации. Точная причина приходит в теле:

{
  "error": {
    "message": "Incorrect API key provided: sk-pr***9aF. You can find your API key at https://platform.openai.com/account/api-keys.",
    "code": "invalid_api_key"
  }
}

Разбирать нужно error message, а не номер: именно это поле отличает «строка не та» от «вы не состоите в организации». Клиентские библиотеки и ноды интеграций часто показывают пользователю только код. В логах SDK та же причина приходит полем error, и доставать её приходится руками.

401, 403 и 429 — три разных отказа

Три кода путают чаще всего, а лечатся они по-разному. Формулировки в колонке «Что в ответе» — дословные из документации OpenAI по кодам ошибок.

КодЧто в ответеЧто означаетЧто делать
401Invalid Authenticationсекрет или организация в запросе не тесверить обе величины: чей секрет и от чьего имени идёт запрос
401неверный ключ APIпредъявленная строка не совпадает с ожидаемойсверить значение, очистить кэш браузера, выпустить новое
401You must be a member of an organization to use the APIаккаунт вне организациипопросить владельца добавить вас в организацию
403Country, region, or territory not supportedзапрос пришёл из неподдерживаемого регионанастройками приложения не лечится
429Rate limit reached for requestsзапросы идут слишком частосбавить темп, добавить паузы между обращениями
429You exceeded your current quotaкончились кредиты либо достигнут потолок расходовпополнить баланс, поднять лимит
500The server had an error while processing your requestсбой на стороне OpenAIповторить запрос после паузы

Оба варианта 401 — это authentication, то есть проверка подлинности, а не проверка прав и не проверка денег. Запомнить проще так: 401 — «не узнали вас», 403 — «узнали, но вам сюда нельзя», 429 — «узнали и пустили бы, но не сейчас». Перевыпуск секрета помогает только в первом случае.

Пять причин, по которым ключ не проходит

Справка OpenAI называет четыре причины: опечатка или лишний пробел, ключ принадлежит другой организации, ключ удалён либо деактивирован, ключ закэширован. Русская версия той же статьи добавляет пятую — в запросе фигурирует старый ключ, которым вы больше не пользуетесь. На практике к ним добавляется ещё одна, чисто интеграционная.

Опечатка, пробел и перенос строки

Самое частое. Строка обрезается при копировании из мессенджера, тянет за собой невидимый пробел в конце или перенос из середины. Глазами это не видно — сравнивайте длину значения с эталоном, а не символы. Печатать секрет в лог для проверки нельзя: логи живут дольше и читаются шире, чем кажется.

Ключ отозван, удалён или пересоздан

Деактивированная строка перестаёт работать мгновенно, а приложение об этом не узнает. Раздел API keys в кабинете разработчика показывает дату последнего использования каждой строки — по ней видно, ту ли вы правите. Отдельная ловушка — кэш: сервис держит старое значение в памяти процесса, и после ротации отказ живёт до перезапуска. Восстановить удалённый секрет нельзя, только выпустить новый взамен.

Ключ из другого проекта или организации

Аккаунт в нескольких организациях — и ключ, выпущенный в одной, не работает в контексте другой. Документация OpenAI разрешает указать в запросе, какая организация и какой проект используются; русская справка отдельно упоминает, что иногда требуется передать Organization ID. Если организаций больше одной, Organization ID стоит задать явно.

Приложение читает не ту переменную окружения

OPENAI_API_KEY объявлена, но контейнер поднялся со старым окружением. Или файл .env не подхватился, или переменная перекрыта на уровне системы. SDK берёт значение молча, и в отказ уходит пустая либо чужая строка.

Ключ уходит не тому провайдеру

Интеграционная причина, которую русскоязычные гайды пропускают. Секрет от прокси-провайдера подставлен в клиент с адресом api.openai.com — или наоборот. Проверьте, что base_url и источник строки совпадают.

Проверка ключа одним запросом

Две минуты, чтобы отделить проблему секрета от проблемы приложения:

curl https://api.openai.com/v1/models \
  -H "Authorization: Bearer $OPENAI_API_KEY"

Ответ 200 — секрет живой, копайте в приложение. Тот же 401 — дело в строке или аккаунте. В Python-SDK этот случай прилетает исключением AuthenticationError, и ловить его стоит отдельно от прочих: AuthenticationError не лечится ретраями, в отличие от 429 и 500.

Ветка форума разработчиков с этим вопросом так и называется — «Why is my OpenAI API key invalid?». Разбор в ней почти всегда сводится к одному: строка оказалась не той, за которую её принимали. Если секрет проверен, а генерация всё равно не идёт, смотреть надо уже в сторону приложения — типовые сбои у нас разобраны в базе знаний по решению проблем.

маршрут запроса Приложение → переменная окружения → заголовок Authorization → организация и проект → OpenAI, с отметками, где именно возникает 401

Когда дело не в ключе: регион и баланс

Два случая, когда строка верная, а запрос всё равно не проходит.

Первый — регион. Официальная причина 403 сформулирована так: «You are accessing the API from an unsupported country, region, or territory». Россия в список поддерживаемых стран не входит, и настройками приложения это не чинится.

Второй — деньги. Пустой баланс даёт 429 с формулировкой про исчерпанную квоту, а не 401. Рядом лежит частая путаница: подписка на чат покрывает веб-интерфейс, программный доступ оплачивается отдельным счётом.

Когда ключами проще не заниматься вовсе

Если задача — не свой продукт на модели, а регулярные статьи на сайт, вся эта отладка доступа лишняя. В AI SEO Writer генератор SEO-статей работает на системных ключах сервиса: тогда ни регистрация у OpenAI, ни зарубежная оплата не нужны. Либо подставьте свои — свои ключи в кабинете поддерживаются для OpenAI, Gemini, OpenRouter, SerpAPI и YouTube.

Сервис работает из России без VPN, а тарифы с оплатой в рублях снимают вопрос зарубежных карт. Есть бесплатный план — проверить на своём сайте можно без карты.

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

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

Ключ протухает сам по себе? Срока жизни у него нет. Он работает, пока его не отозвали — поэтому забытые старые секреты и опасны.

Подписка на чат даёт доступ к API? Нет. Это два разных счёта в одном аккаунте.

Один секрет на все приложения — нормально? Технически да, практически нет: при отзыве встанут сразу все интеграции, а расход не разложить по проектам.

Помогает ли смена модели? Нет. Ошибка приходит до выбора модели, на этапе проверки подлинности.

Автоматизируйте SEO-публикации с SEO Writer

ИИ пишет статьи, публикует в CMS, заполняет мета-теги — без вашего участия

Начать бесплатно →

Интеграции SEO Writer