codex-gateway v0.1.0
checking…

// control_key

required to talk to /admin and /v1

Paste your CODEX_GATEWAY_API_KEY below. It's stored only in this browser's localStorage and used as the Authorization: Bearer header on every request the UI makes.

api_key [not set]

// auth_codex

channel #1 · oauth · codex quota

Set the control key above to enable this panel.

// auth_chatgpt_web

channel #2 · session cookies · separate quota

Set the control key above to enable this panel.

// endpoint

point clients here
base_url https://gpt.intag.xyz/v1
api_key use the control_key you set above
openai python sdk
from openai import OpenAI

client = OpenAI(
    base_url="https://gpt.intag.xyz/v1",
    api_key="<your-gateway-key>",
)

# Channel #1 — Codex OAuth
resp = client.chat.completions.create(
    model="gpt-5.2-codex-high",
    messages=[{"role": "user", "content": "refactor this..."}],
    stream=True,
)

# Channel #2 — ChatGPT.com web session (same client, different model prefix)
resp = client.chat.completions.create(
    model="web/gpt-5",
    messages=[{"role": "user", "content": "draft a release note..."}],
    stream=True,
)
for chunk in resp:
    print(chunk.choices[0].delta.content or "", end="")
openai node sdk
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://gpt.intag.xyz/v1",
  apiKey: "<your-gateway-key>",
});
const stream = await client.chat.completions.create({
  model: "gpt-5.2-codex-high",
  messages: [{ role: "user", content: "refactor this..." }],
  stream: true,
});
for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content || "");
}
curl
curl https://gpt.intag.xyz/v1/chat/completions \
  -H "Authorization: Bearer <your-gateway-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.2-codex-medium",
    "messages": [{"role":"user","content":"hi"}]
  }'

// usage

Set the control key above to load usage.

// models

24 codex · 8 web

Click a model name to copy. openai/ prefix is also accepted.

GPT-5.2 5
  • gpt-5.2 default
  • gpt-5.2-minimal minimal
  • gpt-5.2-low low
  • gpt-5.2-medium medium
  • gpt-5.2-high high
GPT-5.2 Codex 4
  • gpt-5.2-codex default
  • gpt-5.2-codex-low low
  • gpt-5.2-codex-medium medium
  • gpt-5.2-codex-high high
GPT-5.1 5
  • gpt-5.1 default
  • gpt-5.1-minimal minimal
  • gpt-5.1-low low
  • gpt-5.1-medium medium
  • gpt-5.1-high high
GPT-5.1 Codex 4
  • gpt-5.1-codex default
  • gpt-5.1-codex-low low
  • gpt-5.1-codex-medium medium
  • gpt-5.1-codex-high high
GPT-5.1 Codex Max 4
  • gpt-5.1-codex-max default
  • gpt-5.1-codex-max-low low
  • gpt-5.1-codex-max-medium medium
  • gpt-5.1-codex-max-high high
GPT-5.1 Codex Mini 2
  • gpt-5.1-codex-mini-medium medium
  • gpt-5.1-codex-mini-high high
  • web/auto Auto
  • web/gpt-5 GPT-5
  • web/gpt-5-thinking GPT-5 Thinking
  • web/gpt-5-instant GPT-5 Instant
  • web/gpt-5-pro GPT-5 Pro
  • web/gpt-4o GPT-4o
  • web/o3 o3
  • web/o4-mini o4-mini
  • The web model list refreshes from chatgpt.com once you authenticate channel #2. Hit to re-fetch.

    // settings

    read-only, configured via .env
    public_url https://gpt.intag.xyz
    originator codex_cli_rs
    default_reasoning medium
    client_id app_EMoamEEZ73f0CkXaXp7hrann
    web_impersonate chrome124
    web_delete_after True

    To change any of these, edit .env and restart the container: docker compose restart gateway