Codex 401 Unauthorized: причины и исправление
По состоянию на 2026-10-07, если Codex CLI или расширение для IDE возвращает 401 Unauthorized, по официальной документации стоит проверить три места: текущий способ входа (codex login status), где хранятся учётные данные (~/.codex/auth.json или хранилище учётных данных ОС) и, для собственного провайдера, сочетание model_provider, env_key и requires_openai_auth в config.toml. Исправление — заново выполнить codex login, перейти на API-ключ через printenv OPENAI_API_KEY | codex login --with-api-key или положить ключ туда, откуда провайдер его действительно читает. Страница составлена по формулировкам официальной документации и changelog OpenAI Codex и показывает настройку для QCode.
Обновлено 2026-10-08
Четыре вещи, которые нужно выяснить сначала
Официальные способы входа
Вход через ChatGPT использует подписку, вход по API-ключу оплачивается по факту использования; в документации сказано, что при входе по API-ключу действуют стандартные цены API, а не кредиты плана ChatGPT. CLI, расширение для IDE и десктопное приложение поддерживают оба способа.
Кэш учётных данных
Данные входа кэшируются в ~/.codex/auth.json или в хранилище учётных данных ОС и общие для CLI и расширения IDE: если выйти в одном, при следующем запуске другого придётся войти снова.
Откуда собственный провайдер берёт ключ
env_key задаёт имя переменной окружения, из которой Codex читает ключ; по документации при requires_openai_auth = true Codex игнорирует env_key и использует аутентификацию OpenAI.
Как их трактует документация QCode
В документации QCode 401 означает проблему с ключом, 404 — неверный префикс пути; base_url для Codex с лишним или недостающим сегментом даёт 404.
Что значит 401 и что проверить первым
По состоянию на 2026-10-07 ответ 401 Unauthorized в Codex значит, что сервер не принял учётные данные запроса или запрос пришёл без них. Официальная документация описывает два способа входа: Sign in with ChatGPT (доступ по подписке) и Sign in with an API key (оплата по использованию); десктопное приложение, Codex CLI и расширение для IDE поддерживают оба, а Codex cloud требует входа через ChatGPT. Если действующей сессии нет, путь по умолчанию — codex login со входом в браузере, а codex login status показывает текущий способ. С собственным провайдером важен и config.toml: model_provider по умолчанию равен openai; провайдер с requires_openai_auth = true использует аутентификацию OpenAI и игнорирует env_key; провайдер только с env_key читает ключ из этой переменной; если не задано ни то, ни другое, по документации Codex считает, что провайдеру аутентификация не нужна.
Последние изменения и сообщения пользователей
В официальном changelog есть несколько записей, связанных со входом (см. хронологию ниже); в 0.160.0 от 2026-10-01 документацию уточнили: как учётные данные провайдера используют настроенное хранилище и как env_key указывает переменную окружения с API-ключом. Отдельно: 2026-09-25 в GitHub openai/codex открыт issue с заголовком «unexpected status 401 Unauthorized issue», где пользователи сообщают об ошибке Incorrect API key provided даже при входе через ChatGPT (сообщения пользователей; причину OpenAI не документировала). Здесь такие issue служат только признаком того, что ошибка встречается часто; шаги основаны на официальной документации.
Три записи о входе в официальном changelog
Codex CLI 0.156.0: вход может восстановиться через системные прокси; в той же записи — обновление учётных данных MCP, когда OAuth discovery возвращает ошибку 503.
Codex CLI 0.159.0: локальный вход через ChatGPT надёжно открывает браузер, а в онбординге появилась кнопка для копирования ссылки входа.
Codex CLI 0.160.0: в документации уточнено, как учётные данные провайдера используют настроенное хранилище и как env_key указывает переменную окружения с API-ключом.
Подтверждено vs не подтверждено
Подтверждено (дословно в официальной документации)
Всё перечисленное можно дословно проверить в официальной документации: два способа входа и где каждый работает; что делают codex login, printenv OPENAI_API_KEY | codex login --with-api-key, codex login --device-auth, codex login status и codex logout; данные входа кэшируются в ~/.codex/auth.json или в хранилище ОС (в официальном примере конфигурации значение cli_auth_credentials_store по умолчанию — file, то есть auth.json) и общие для CLI и расширения IDE, у которых и слои конфигурации общие; сессии ChatGPT обновляют токены автоматически до истечения срока; model_provider по умолчанию — openai; при requires_openai_auth = true env_key игнорируется; model_provider, model_providers и openai_base_url в проектном .codex/config.toml игнорируются с предупреждением при запуске; начиная с 0.134.0 --profile не читает таблицы [profiles.имя] из config.toml; wire_api поддерживает только responses; [model_providers.openai] создать нельзя, вместо этого используется openai_base_url.
Не подтверждено или не описано
Две вещи на этой странице не подтверждены, не делайте на их основе выводов: ① почему у части пользователей 401 бывает и при входе через ChatGPT — в issue на GitHub есть только догадки пользователей, в документации объяснения нет; ② официальной таблицы всех текстов ошибок 401 в Codex мы не нашли, поэтому, кроме строк, прямо отнесённых к документации, приведённые тексты ошибок взяты из сообщений пользователей.
Две пары настроек, которые часто путают
Вход через ChatGPT vs API-ключ
Вход через ChatGPT использует подписку и вход в браузере (codex login); на удалённой машине или без браузера — codex login --device-auth. Вход по API-ключу оплачивается по стандартным ценам API: в CLI — printenv OPENAI_API_KEY | codex login --with-api-key, в расширении IDE — пункт Use API Key на экране входа. Для автоматизации документация рекомендует API-ключи, а неинтерактивному процессу Codex ключ можно передать через CODEX_API_KEY. Перед сменой способа выполните codex logout, чтобы очистить текущие учётные данные.
env_key vs requires_openai_auth
Это два варианта аутентификации собственного провайдера. env_key = "ИМЯ" заставляет Codex читать ключ из этой переменной окружения; имя выбираете вы, и оно должно совпадать с переменной, которую вы действительно экспортировали. requires_openai_auth = true переводит провайдера на аутентификацию OpenAI (ChatGPT или API-ключ), и по документации Codex тогда игнорирует env_key. Без обоих параметров Codex считает, что аутентификация не нужна. Есть ещё experimental_bearer_token для прямой записи токена, но документация его не рекомендует и советует env_key.
Проверяйте в таком порядке
① Выполните codex login status и посмотрите, вход через ChatGPT или по API-ключу (при активном входе команда завершается с кодом 0). ② Для сервиса самой OpenAI: выполните codex logout, затем codex login (ChatGPT в браузере), printenv OPENAI_API_KEY | codex login --with-api-key (переход на API-ключ) или codex login --device-auth (удалённая машина или без браузера); расширение IDE использует тот же кэш входа, что и CLI, поэтому исправление подхватится и там. ③ Для собственного провайдера: пишите model_provider и таблицу [model_providers.имя] в ~/.codex/config.toml — в проектном .codex/config.toml эти ключи игнорируются; с --profile кладите настройки в ~/.codex/имя.config.toml. ④ Для QCode документация даёт такой config.toml: model_provider = "crs", model = "gpt-6-sol", model_reasoning_effort = "high", preferred_auth_method = "apikey" и таблица [model_providers.crs] с name = "crs", base_url = "https://api.qcode.cc/openai", wire_api = "responses", requires_openai_auth = true, env_key = "CRS_OAI_KEY" (имена провайдера и переменной можно выбрать свои, в примере документации — crs и CRS_OAI_KEY; поскольку задано requires_openai_auth = true, по официальной документации Codex игнорирует env_key, и значение имеет ключ в auth.json ниже). В ~/.codex/auth.json запишите {"OPENAI_API_KEY": "cr_xxxxxxxxxx"} со своим ключом cr_ и выставьте файлу права 600. ⑤ Самопроверка: запросите https://api.qcode.cc/openai/v1/models с заголовком Authorization: Bearer и своим ключом; если вернулся список в JSON, адрес и ключ в порядке.
На QCode
На QCode Codex работает только с моделями GPT; Claude и семейства DeepSeek, GLM, Kimi и Qwen не обслуживаются по протоколу OpenAI Responses, который использует Codex. В config.toml укажите base_url https://api.qcode.cc/openai и wire_api = "responses"; ключ — ваш ключ QCode из консоли, начинающийся с cr_, — по документации записывается в OPENAI_API_KEY в ~/.codex/auth.json. В документации есть и запасной вариант: задать только переменную окружения из env_key, а OPENAI_API_KEY в auth.json выставить в null; но в этой конфигурации есть requires_openai_auth = true, а по официальной документации Codex тогда игнорирует env_key, поэтому полагаться только на переменную окружения не рекомендуем. Модель по умолчанию в документации — gpt-6-sol, её можно сменить на gpt-6.1-sol или gpt-5.6-terra. При 401 проверьте пункты из документации: ключ начинается с cr_, ключ в auth.json полный, без лишних пробелов и переносов строк, а статус ключа и остаток квоты в консоли в порядке; на неверный ключ QCode отвечает Invalid API key. base_url с лишним или недостающим сегментом даёт 404, а не 401. Оплата по токенам, цены моделей — на /models.
Частые вопросы
Codex выдаёт 401 Unauthorized — что проверить первым?
Сначала выполните codex login status. По официальной документации команда показывает текущий способ аутентификации и при активном входе завершается с кодом 0. Узнав, ChatGPT это или API-ключ, проверьте, куда обращается Codex — к OpenAI или к собственному провайдеру: в первом случае войдите заново или смените ключ, во втором проверьте, какую аутентификацию использует провайдер из model_provider (env_key или requires_openai_auth) и лежит ли ключ там, откуда провайдер его читает.
Как переключиться между входом через ChatGPT и API-ключом?
Выполните codex logout, чтобы очистить текущие учётные данные, и войдите другим способом. По документации: для ChatGPT — codex login и завершение входа в браузере; для API-ключа — printenv OPENAI_API_KEY | codex login --with-api-key, ключ читается из stdin; в расширении IDE — Sign in with ChatGPT или Use API Key на экране входа. CLI и расширение используют общий кэш входа. Если администратор задал forced_login_method, при несоответствии учётных данных Codex выполнит выход и завершит работу.
Всё работало, а теперь 401 — истёк токен?
Если вы входите через ChatGPT, сначала считайте, что сессия устарела: выполните codex logout, затем codex login. В документации сказано, что сессии ChatGPT автоматически обновляют токены до истечения срока, поэтому для активной сессии повторный вход в браузере обычно не нужен. На GitHub пользователи сообщают, что при устаревшей сессии видят Provided authentication token is expired. Please try signing in again. или Your access token could not be refreshed because your refresh token was revoked. Please log out and sign in again. (оба — сообщения пользователей). На удалённой машине или без браузера используйте codex login --device-auth.
В собственном провайдере задан env_key и ключ экспортирован, но всё равно 401 — почему?
Сначала проверьте, нет ли у того же провайдера requires_openai_auth = true: по документации Codex тогда игнорирует env_key и использует аутентификацию OpenAI (ChatGPT или API-ключ). Если нет — убедитесь, что значение env_key точно совпадает с именем экспортированной переменной; в документации сказано, что Codex читает переменную, названную в конфигурации, так что само имя не фиксировано. На GitHub пользователи сообщают об ошибке 401 Unauthorized: Missing bearer or basic authentication in header, когда учётные данные не настроены (сообщение пользователя).
Я изменил config.toml, а Codex, похоже, всё ещё ходит в OpenAI?
Проверьте, лежат ли настройки провайдера там, где Codex их читает. Документация называет три ловушки: model_provider, model_providers и openai_base_url в проектном .codex/config.toml игнорируются с предупреждением при запуске; начиная с Codex 0.134.0 --profile не читает [profiles.имя] из config.toml, поэтому используйте ~/.codex/имя.config.toml; встроенные ID openai, ollama и lmstudio нельзя занять собственным провайдером, и чтобы сменить только адрес OpenAI, используйте openai_base_url. Если model_provider не задан, по умолчанию это openai.
Как найти причину 401 при работе через QCode?
Идите по документации QCode: ключ начинается с cr_, ключ в ~/.codex/auth.json полный, без лишних пробелов и переносов, а статус ключа и остаток квоты в консоли в порядке; истёкшая подписка в документации тоже названа причиной 401. Если вы выбрали запасной вариант из документации (только переменная окружения, в auth.json — null), сначала верните ключ в auth.json: при requires_openai_auth = true в конфигурации, по официальной документации, Codex игнорирует env_key. Оставшиеся в окружении старые переменные могут перекрывать текущие настройки, поэтому выполните env | grep -i openai и уберите ненужные. Затем проверьте запросом к https://api.qcode.cc/openai/v1/models с Authorization: Bearer и своим ключом: список в JSON значит, что адрес и ключ в порядке. В документации 401 — проблема с ключом, 404 — неверный префикс пути; base_url для Codex — https://api.qcode.cc/openai.
Источники
Сторона OpenAI: страницы официальной документации Codex — Authentication, Config basics, Advanced Configuration, Configuration Reference, Environment variables, параметры командной строки и настройки расширения IDE (одна и та же документация на developers.openai.com/codex и learn.chatgpt.com), а также Codex changelog и заметки к релизам 0.156.0, 0.159.0 и 0.160.0 в GitHub openai/codex; всё получено 2026-10-07. Сторона QCode: страницы документации QCode — полное руководство по Codex (обновлено 2026-09-30), точки подключения и форматы API, коды ошибок, устранение неполадок и подключение Cursor, получены в тот же день. Контекст: issue 48237 в GitHub openai/codex и несколько других issue про 401 приводятся только как сообщения пользователей.
Один ключ cr_ для Codex и Claude Code
Codex работает с gpt-6-sol, gpt-6.1-sol и другими моделями GPT через https://api.qcode.cc/openai, оплата по токенам; цены моделей — на /models.
Читайте также
Codex CLI со сторонним API: config.toml, base_url и ошибки
Полная настройка config.toml и base_url и разбор частых ошибок.
Баны аккаунтов Codex и ChatGPT: причины
Почему аккаунты Codex и ChatGPT Pro блокируют и что делать.
Codex «Selected model is at capacity»: не квота и не 429
Как отличить ошибку нехватки мощностей и что делать.
Шаги и цитаты на этой странице сверены 2026-10-07 с официальной документацией и changelog OpenAI Codex и документацией QCode; при расхождениях ориентируйтесь на официальные страницы, изменения на стороне вендоров возможны без предупреждения. Тексты ошибок и описания из issue на GitHub — сообщения пользователей, а не официальные выводы. Доступность моделей — по /models.