docs/providers/CHATGPT_WEB.md
chatgpt-web (alias cgpt-web, display name ChatGPT Web (Plus/Pro)) sends OpenAI-format chat requests through an authenticated chatgpt.com browser session. It authenticates with the __Secure-next-auth.session-token cookie — no API key required.
New to Web Cookie providers?
Read
docs/getting-started/WEB-COOKIE-GUIDE.mdfor the general setup process, limitations, and troubleshooting before following this provider-specific guide.
Defined in src/shared/constants/providers/web-cookie.ts + src/shared/providers/webSessionCredentials.ts:
| Field | Value |
|---|---|
| Provider id | chatgpt-web |
| Credential name | __Secure-next-auth.session-token |
| Accepts full Cookie header | ✅ yes |
| Accepted storage keys | cookie, sessionToken, session-token, __Secure-next-auth.session-token |
Two paste formats both work:
eyJhbGciOi...__Secure-next-auth.session-token=eyJhbGciOi...; cf_clearance=... (preferred — carries rotation/anti-bot cookies the executor needs)Cookie Editor can copy the cookies for the active chatgpt.com tab as an HTTP header string.
Always compare the exported value with a live authenticated request as described in section 3.
__Secure-next-auth.session-token. If it's split into chunks (__Secure-next-auth.session-token.0, .1, …), select all of them — OmniRoute's nextAuthCookie.ts merges rotated chunk families.name=value; name=value text.If the token is missing: confirm that you are signed in, send a message to refresh the session, and inspect the live request in section 3.
The repo's WEB-COOKIE-GUIDE.md mandates a live-request check. Do it once per session:
/backend-api/conversation or the SSE stream) → Headers → Request Headers → Cookie.__Secure-next-auth.session-token=... — not just cf_clearance or __cf_bm.The value you copied in step 2.3 must match what the live request sends. If they differ, re-copy from Cookie Editor.
chatgpt-web).If requests later return 401 or 403, re-copy the header from a fresh live session. The executor merges Set-Cookie rotations while the connection is active, but it cannot recover a credential that is no longer accepted upstream.
For multiple ChatGPT sessions, use the bulk web-session import or session-pool endpoints:
POST /api/providers/bulk-web-session — import many cookie credentials at onceGET /api/session-pools + /api/session-pools/[provider] — pool rotation across accountsEach credential blob must carry the __Secure-next-auth.session-token value under one of the accepted storage keys (cookie, sessionToken, session-token, or the cookie's exact name).
Web sessions can stop working after sign-out or server-side rotation. Re-run steps 2.2 through 4 whenever requests start failing with 401/403.
If you changed the credential contract (new storage key, new cookie name, changed hint) or are filling the docs gap, contribute it:
src/shared/providers/webSessionCredentials.ts (credential name / placeholder / storage keys) or src/shared/constants/providers/web-cookie.ts (authHint).docs/providers/CHATGPT_WEB.md) and the provider table in docs/getting-started/WEB-COOKIE-GUIDE.md..env.example + docs/reference/ENVIRONMENT.md if you touched env vars, then run:
node scripts/check/check-env-doc-sync.mjs # must pass
npm run test:unit
# targeted: tests/unit/chatgpt-web.test.ts (stealth path)
CONTRIBUTING.md, branch from the current active release tip, use a Conventional Commit message, and open the PR against that active release branch.⚠️ Never commit a real cookie value. All examples above are placeholders. If a test fixture needs a token, use a fake
eyJhbGciOi...string.
| Symptom | Likely cause | Fix |
|---|---|---|
| Cookie not in Cookie Editor | Signed out / not HttpOnly-visible | Sign in; enable HttpOnly display in options |
| Token missing from live request | Request is not authenticated | Sign in and send a chat message first |
| 401 after Test Connection passed | Expired or rotated session | Re-copy from a fresh live request |
| Chunked token fails | Only one chunk pasted | Select all __Secure-next-auth.session-token.* chunks |
ChatGPT Web (Codex) is an additional provider. The existing
ChatGPT Web (Plus/Pro) provider described above stays unchanged for regular
chats, images, and its existing tool emulation.
web profile, the internal Chromium service from docker-compose.yml;The tunnel is only needed for tool turns. pro is read-only and does not need a
local tool connector.
pro is available for the account.The raw cookie is not retained after a successful save. When the session expires, open the connection, paste a fresh full cookie, and re-run the check. The doctor status in the edit dialog reports browser, storage state, sign-in, Temporary Chat, tunnel, connector, and tool round-trip separately.
The fixed models are:
chatgpt-web-codex/instantchatgpt-web-codex/mediumchatgpt-web-codex/highchatgpt-web-codex/extra-highchatgpt-web-codex/proAdd one of them to a combo like any other model. The Codex app sends only the
combo name as model to the regular Responses endpoint /v1/responses. There is
no special endpoint and no Codex-mode switch.
pro does not run local tools. A forced tool makes that combo target
incompatible; with optional tools the turn runs read-only and reports that
limitation as commentary.
For npm, systemd, and PM2 installs, OmniRoute detects common Chrome and Chromium
paths. Alternatively, set CHATGPT_WEB_CODEX_CHROME_PATH.
The Docker web profile starts chatgpt-web-codex-browser on the internal
Compose network. Its CDP port is not published on the host. The protected profile
volume stays separate from the OmniRoute data volume, and the browser gets enough
shared memory. The internal CDP proxy listens only on the Compose network on port
9223; Chrome itself stays bound to loopback inside the sidecar.
A supervisor lease under DATA_DIR prevents multiple OmniRoute processes from
owning the same tunnel and broker state. A conflict shows up in the doctor.
The normal path is fully headless. When ChatGPT demands an interactive sign-in or challenge, the existing VNC browser infrastructure can be used as a recovery path. Browser UI and CDP must then only be reachable over loopback, an authenticated management connection, or an SSH tunnel; noVNC stays disabled in normal operation.
When a combo contains ChatGPT Web (Codex), the Responses WebSocket bridge
requests the HTTP/SSE fallback before connecting upstream. The actual transfer
then goes through /v1/responses.