Sign in with ChatGPT for developers: the OAuth flow, plan usage, and what it means for your API bill

Sign in with ChatGPT for developers: what your app receives, how Plus and Pro plan usage and weekly caps work, and how to test the OAuth flow.

Emmanuel Mumba

Emmanuel Mumba

2 October 2026

Sign in with ChatGPT for developers: the OAuth flow, plan usage, and what it means for your API bill

Apidog for Enterprise

On-Premises Deploy

SSO & RBAC

SOC 2 Compliant

Explore Apidog Enterprise

Sign in with ChatGPT is OpenAI’s OAuth 2.0 and OpenID Connect login, available to ChatGPT users globally. Your app gets a stable account ID plus the person’s name, email address and profile picture. Since DevDay on September 29, 2026, Plus and Pro users can also let participating apps run AI requests on their ChatGPT plan instead of your API key, under a weekly cap they set per app. Your app never receives their conversations, memories or an API key.

The second part touches your bill. This guide covers the flow, how plan usage looks to the user, who can integrate today, when a user’s plan should replace your key, and how to test sign-in and its failure paths in Apidog. For the rest of the event, see the DevDay 2026 roundup; if identity versus authorization is fuzzy, read OAuth vs OpenID first.

Sign in with ChatGPT at a glance

Item What OpenAI documents
Identity scopes openid profile email
Plan usage scopes (open-source flow) offline_access resource.invoke chatgpt.tokens.use.direct, with resource=https://api.openai.com/v1
Your app receives An ID token; with plan usage, an access token and a refresh token
Plan usage eligibility Plus and Pro, in participating apps
Where usage counts The plan’s ChatGPT Work and Codex usage
Per-app control Weekly cap as a share of overall weekly usage; credits after the cap are off by default
Plan usage tokens Access token 1 hour; refresh token 30 days, replaced on each refresh
Developer access Commercial apps: limited trial via an interest form. Open-source apps: self-serve

Sources: the Sign in with ChatGPT docs, the token reference, and OpenAI’s help article on using your ChatGPT plan in other apps.

What your app receives, and what it doesn’t

Identity is the default. A client that requests openid profile email gets an ID token. Per the website guide, profile covers available claims such as name and profile picture, and email covers email and email-verification claims. Identity scopes don’t grant access to ChatGPT conversations or OpenAI API resources.

Key the account on the verified sub plus issuer and client ID, not the email. OpenAI warns that an email match alone isn’t proof of ownership, so ask existing users to confirm a link.

Plan usage is a separate grant. If the user approves the extra scopes, the token response adds an access token for eligible Responses API requests. Identity-only clients shouldn’t require an access_token at all: the id_token is the only required artifact.

How the OAuth flow works

The website flow is the standard Authorization Code grant with PKCE plus OIDC. Load endpoints from https://auth.openai.com/.well-known/openid-configuration. The docs list these production values:

Issuer:                 https://auth.openai.com
Authorization endpoint: https://auth.openai.com/api/accounts/authorize
Token endpoint:         https://auth.openai.com/api/accounts/oauth/token
JWKS URI:               https://auth.openai.com/.well-known/jwks.json
  1. Your backend generates a fresh state, a PKCE verifier with an S256 challenge, and a nonce.
  2. It redirects the browser to the authorization endpoint with your client ID, exact redirect URI and scopes.
  3. The user consents, and OpenAI returns a code to your callback.
  4. Your backend checks state, exchanges the code, and verifies the ID token’s signature, issuer, audience, expiration and nonce.
  5. It finds, creates or links the local account and issues its own session.

Public clients send no secret. A confidential client using client_secret_basic sends its secret only in the HTTP Basic header.

Open-source tools register differently. The open-source sign-in guide starts with client_id=dynamic_agent_client, an agent_name_hint set to your app’s name, and a persistent ext_agent_host_id per host. The callback returns an issued client ID (such as oaiapp_...) to save and reuse; the redirect is a 127.0.0.1 loopback URI, and no client secret is involved.

How plan usage works for the user

What your users see, and what your support docs should explain:

Users manage all of this under ChatGPT Settings, Usage (chatgpt.com/settings/usage), and OpenAI’s UI guidelines ask you to link there with Manage usage.

Who’s in at launch, and how you get a client ID

OpenAI’s DevDay recap names 16 plan-usage partners, including Cognition’s Devin, Notion, Vercel, T3, OpenClaw and Dactyl. The New Stack lists Amp, Warp, Kilo Code and OpenCode among the others, with Lovable marked as coming soon. If you run OpenClaw, it’s on both lists.

Sam Altman’s pitch on stage, as The New Stack reported it: “now you don’t have to cover their token costs to get them going.”

How you get in depends on what you ship:

What changes for your API bill

Today you pay per token and recover it through pricing. Plan usage moves the model cost onto the user’s subscription, so your margin stops depending on how heavily they use AI. The tradeoff is control.

Your API key The user’s ChatGPT plan
Who pays You, per token The user’s plan (credits only if they opt in)
Who can use it Every user Plus and Pro users who grant chatgpt.tokens.use.direct
Limits Your rate-limit tier Weekly plan usage, the per-app cap, Plus’s five-hour window
Request shape The full Responses API store: false and stream: true required; no temperature, max_output_tokens, file search or Code Interpreter
Typical failure 429 when you exceed your tier 429 subscription_sharing_usage_limit_exceeded, or that code in a mid-stream response.failed
Fallback Yours to design None automatic: OpenAI doesn’t switch billing
What to show Your own usage and pricing “Using ChatGPT plan”, a Manage usage link, which of your plans support it

The restrictions come from the preview limitations page: features that need stored conversation state or hosted tools won’t run on a user’s plan today.

A sensible default is hybrid: plan usage for interactive work by Plus and Pro users, your key for everyone else and for background jobs, CI and scheduled agents. When the cap hits, show Manage usage and offer your own credits as a secondary option. The API key vs OAuth comparison covers the general tradeoff, and OAuth for AI agents covers acting on a user’s behalf safely.

How to test the sign-in flow and failure paths in Apidog

Apidog doesn’t sign anyone in with ChatGPT. It exercises your OAuth setup, token calls and error handling. Download Apidog and create an environment.

1. Store the client as variables. Add SIWC_CLIENT_ID, SIWC_REDIRECT_URI, and for a confidential client SIWC_CLIENT_SECRET as a sensitive value, plus ACCESS_TOKEN for plan usage. Reference them as {{SIWC_CLIENT_ID}} so no secret lives in a saved request.

2. Run the Authorization Code flow. In the Auth tab, pick OAuth 2.0 with Authorization Code with PKCE, enter the endpoints above, set scope to openid profile email, and use a callback URL registered for your client. The Apidog OAuth 2.0 guide walks through each field.

3. Assert on the ID token you got. Save the token exchange as its own POST to the token endpoint (code, verifier, redirect URI, client ID) and add a post-processor to it. Signature and nonce checks still belong in your backend.

const body = pm.response.json();
pm.test("token exchange returned an ID token", () => {
  pm.expect(pm.response.code).to.eql(200);
  pm.expect(body.id_token).to.be.a("string");
});

const decode = require("atob");
const part = body.id_token.split(".")[1].replace(/-/g, "+").replace(/_/g, "/");
const claims = JSON.parse(decode(part + "=".repeat((4 - (part.length % 4)) % 4)));

pm.test("ID token claims match this client", () => {
  pm.expect(claims.iss).to.eql("https://auth.openai.com");
  pm.expect(claims.aud).to.include(pm.environment.get("SIWC_CLIENT_ID"));
  pm.expect(claims.sub).to.be.a("string").and.not.empty;
  pm.expect(claims.exp * 1000).to.be.above(Date.now());
});

Log name, email and picture rather than asserting them, since they’re returned when available. For plan usage, assert that body.scope contains chatgpt.tokens.use.direct.

4. Mock the failure paths. A real Plus account is a poor fixture, so return these from an Apidog mock server:

Chain the cases into a test scenario and run it in CI with the Apidog CLI. The errors and recovery page lists the full set.

5. Check the live call. With a real plan token, send the docs’ streaming request (in Apidog, as Bearer {{ACCESS_TOKEN}}) and confirm the stream ends in response.completed, the only success signal:

curl --no-buffer https://api.openai.com/v1/responses \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6.1-sol",
    "input": [{"role": "user", "content": "Say exactly: Hello, world!"}],
    "store": false,
    "stream": true
  }'

FAQ

Can Free users sign in with ChatGPT? Sign-in is available to ChatGPT users globally. Using the plan inside another app requires Plus or Pro.

Does my app get the user’s OpenAI API key? No. You get an ID token and, with plan usage, an OAuth access token for eligible Responses API requests.

What happens when a user hits their cap? Requests fail with subscription_sharing_usage_limit_exceeded: an HTTP 429, or a response.failed event after streaming starts. Pause and link to Manage usage.

Can a Plus user run GPT-6.1 Sol through a partner app? The docs’ example uses gpt-6.1-sol with a plan token, but list the account’s models with that token before offering one. More in is GPT-6.1 Sol free.

Next step

If you run a commercial app, join the waitlist now, and build your cap and disconnect handling against mocks while you wait. Treat plan usage as an option beside your own API billing, not a replacement. Save the token assertions and failure scenario in Apidog, so the day your client ID arrives, the only new variable is the real token.

button

Explore more

How to Build Your Own Version of Any App Feature With REA

How to Build Your Own Version of Any App Feature With REA

Use REA with Claude Code or Codex to understand one app feature, write your own spec, rebuild it in your stack, and prove it with tests and Apidog.

13 October 2026

Your AI Agent Just Posted Secrets to Slack. Here's How to Test It Never Does

Your AI Agent Just Posted Secrets to Slack. Here's How to Test It Never Does

A finance agent reportedly posted bank balances to Slack, and read-only scope didn't stop it. The canary test: mock every source and send in Apidog.

13 October 2026

What Is REA (Reverse Engineer Anything)? The MCP Server That Hit 115K GitHub Stars in a Week

What Is REA (Reverse Engineer Anything)? The MCP Server That Hit 115K GitHub Stars in a Week

REA is the open-source MCP server that lets coding agents reverse-engineer binaries, apps and network captures. Setup, limits, and the HAR-to-Apidog workflow.

12 October 2026

Practice API Design-first in Apidog

Discover an easier way to build and use APIs

Sign in with ChatGPT for developers: the OAuth flow, plan usage, and what it means for your API bill