Ошибка 403 в Codex: причины и как продолжить работу

403 в Codex бывает трёх видов: отказ по региону, проблема с аккаунтом и ограничения ключа на шлюзе. Показываем, как отличить их по тексту ошибки и что поправить.

5 мин · · ошибки · IDE

Когда в Codex появляется ошибка 403, неприятнее всего то, что у неё нет одной причины. Один и тот же код ответа приходит и от OpenAI, когда он отказывает по стране или аккаунту, и от шлюза, когда ключу запрещена модель. Лечатся они по-разному, поэтому первое действие не «перенастроить всё», а определить, кто именно ответил отказом. Ниже порядок диагностики, таблица причин и конкретные правки конфига Codex.

Codex ошибка 403: откуда она берётся

HTTP 403 означает «запрос понят, но выполнять его не будут». В связке Codex и API отказать могут разные звенья:

Кто отказалКак выглядитЧто делать
OpenAI напрямую: регионв тексте ошибки сказано про страну, регион или территорию, где сервис не поддерживаетсяэто не лечится настройкой Codex; Codex нужно направить на другой провайдер (см. ниже)
OpenAI напрямую: аккаунтотказ при входе, запрос подтверждения, например номера телефонаэто правила самого аккаунта OpenAI; повлиять на них из Codex нельзя
Шлюз Zukko: model_not_allowed_for_keyJSON с этим кодом; модели нет в списке разрешённых для ключадобавить модель в ключ или сменить модель в Codex
Шлюз Zukko: email_unverifiedJSON с этим кодом; email в кабинете не подтверждёнподтвердить email в кабинете

Различать удобно по тексту: ошибки Zukko в конце содержат строку «Поддержка — https://t.me/zukkopro?direct, напишите, пожалуйста», код лежит в поле error.code. Если такой строки нет, ответ пришёл от другого звена.

Шаг 1. Выясните, куда на самом деле идёт Codex

Если Codex настроен по умолчанию, он обращается к OpenAI, и тогда 403 по региону вполне ожидаем: региональные ограничения устанавливает OpenAI, не вы и не мы. Мы не предлагаем схем обхода, подмены региона и чужих аккаунтов: они нарушают правила сервиса и могут привести к блокировке. Законный путь из России — другой провайдер в конфиге: доступ через шлюз, оплата СБП, картой MasterCard или криптой.

Откройте ~/.codex/config.toml (в Windows %USERPROFILE%\.codex\config.toml) и сравните со стандартным:

bash
model = "gpt-6.1-sol"
model_provider = "zukko"
model_reasoning_effort = "high"

[model_providers.zukko]
name = "zukko"
base_url = "https://api.zukko.pro/v1"
wire_api = "responses"
requires_openai_auth = true

Проверьте три вещи. Первая: строка model_provider = "zukko" на месте и название совпадает с заголовком [model_providers.zukko]. Без неё Codex пойдёт к OpenAI. Вторая: base_url заканчивается на /v1. Третья: рядом лежит ~/.codex/auth.json с ключом:

bash
{ "OPENAI_API_KEY": "fetch_..." }

Если раньше вы входили в Codex через аккаунт, в этом файле могут лежать данные прежнего входа. Сделайте резервную копию файла и впишите ключ. По инструкции Zukko отдельный вход в аккаунт OpenAI не нужен: ключ берётся из auth.json. Автонастройку с резервными копиями описывает руководство по Codex.

Шаг 2. Про запрос номера телефона

«Codex запрашивает номер телефона» чаще всего связано с регистрацией и подтверждением аккаунта на стороне OpenAI, а не с самим Codex. Это условие аккаунта, и в обход него действовать не нужно. Если вы работаете через ключ шлюза, аккаунт OpenAI для запросов не используется, и такого шага быть не должно. Если он всё же появляется, скорее всего, Codex не прочитал ваш конфиг (шаг 1) или запущен в другой учётной записи с другим домашним каталогом.

Шаг 3. Проверьте ключ отдельным запросом

Чтобы отделить проблему Codex от проблемы ключа, отправьте запрос в обход Codex:

bash
curl -i https://api.zukko.pro/v1/chat/completions \
  -H "Authorization: Bearer $ZUKKO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-6.1-sol","messages":[{"role":"user","content":"ping"}],"max_tokens":16}'

Читайте код ответа и тело:

  • 200. Ключ, модель и баланс в порядке. Значит, 403 приходит не от шлюза: вернитесь к шагу 1 и проверьте, куда ходит Codex.
  • 403 model_not_allowed_for_key. У ключа есть список разрешённых моделей, и вашей там нет. Откройте ключ в кабинете и добавьте модель в список либо смените model в config.toml. Модель можно сменить и при запуске: codex -m gpt-6.1-sol.
  • 403 email_unverified. Подтвердите email в кабинете. При входе через Telegram подтверждение не требуется.
  • 401. Ключ с опечаткой или отозван. 402. На балансе меньше $0.01. Это другие ошибки, но их часто путают с 403 на первый взгляд.

Если в config.toml указана модель, которой нет в каталоге, ответ будет 404 model_not_found. Актуальный список моделей публичный: GET https://api.zukko.pro/v1/models.

Частая ловушка: модель, которую Codex не умеет

По документации Zukko, Codex ходит через Responses API, поэтому подходят модели GPT и Claude. Модели GLM в Codex не работают. Если вы ограничили ключ моделью GLM ради экономии, а в Codex стоит GPT, получите как раз 403. Решение простое: для ключа Codex разрешите модель, которую вы ставите в model.

Про ограничение ключей полезно знать шире: как разрешить ключу только нужные модели и ошибка 403 model_not_allowed_for_key.

Как продолжить работу, пока разбираетесь

  1. Заведите отдельный ключ для Codex с дневным лимитом и списком моделей, которые вы реально используете. Тогда ошибка model_not_allowed_for_key появляется там, где вы её ожидаете.
  2. Держите в config.toml одну проверенную модель и меняйте её через codex -m, а не правкой файла.
  3. После любой правки конфига запускайте короткую задачу, например «выведи версию Node в проекте», и убеждайтесь, что ответ пришёл.

Чтобы проверить расход, посмотрите «Использование» в кабинете: запрос, дошедший до модели, там виден, а отклонённый 403 ничего не списывает.

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

Почему Codex выдаёт 403, хотя баланс есть?

Баланс влияет на 402. Для 403 причина в другом: регион или аккаунт при обращении к OpenAI напрямую, список разрешённых моделей у ключа или неподтверждённый email. Определите по тексту ответа и полю error.code.

Нужен ли для Codex обход региона?

Мы не советуем и не описываем такие схемы. Для работы из России используйте другой провайдер в конфиге: доступ через шлюз, оплата СБП, картой MasterCard или криптой.

Можно ли использовать Codex без подписки ChatGPT?

Да, Codex читает провайдера из конфига, поэтому ему можно указать совместимый API и оплачивать токены. Пошаговая настройка есть в статье Codex без подписки ChatGPT.

403 появился после смены модели. Что проверить?

Список разрешённых моделей у ключа. Новую модель нужно добавить в него, иначе шлюз вернёт model_not_allowed_for_key.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.