Files
autoreg-skills-max/skills/bulk-account-registration/references/chatgpt-cloudflare-registration.md

8.5 KiB

ChatGPT Cloudflare Registration — All Failed Approaches (2026-07-09)

Summary

ChatGPT signup (chatgpt.com/auth/signup) is protected by Cloudflare Turnstile — a hardened challenge that blocks ALL automated browser approaches tested. This is a known hard gate, not a tool configuration issue.

Tested Approaches (ALL FAILED)

# Method Result Details
1 playwright (plain) Cloudflare block wait_for_selector timeout, email input never visible
2 playwright + playwright-stealth Cloudflare block Same selector timeout
3 rebrowser_playwright (anti-detect) Cloudflare block Page loads but email input not found
4 nodriver (real Chrome CDP) Cloudflare block Turnstile checkbox clickable but challenge persists; websocket crashes
5 Hermes browser tool Cloudflare block Turnstile iframe visible, checkbox click has no effect
6 curl_cffi (TLS impersonation) WORKS for API layer Bypasses CF for chatgpt.com. Cookie-bridge to Playwright = full browser bypass
7 curl_cffi → Playwright cookie-bridge WORKS (2026-07-09) Cookies from curl_cffi injected into Playwright → NO Cloudflare! Signup form loaded

Root Cause

Cloudflare Turnstile requires:

  • Real browser with GPU rendering — headless fails even with fingerprint spoofing
  • Residential IP — datacenter proxies are server-side rejected
  • JavaScript execution — the challenge runs in a cross-origin iframe that can't be automated The Turnstile checkbox may show a green checkmark but the server-side validation still rejects datacenter/non-residential IPs.

Key discovery: curl_cffi with impersonate="chrome124" successfully bypasses Cloudflare for chatgpt.com pages (including the NextAuth CSRF/signin flow). The auth pages (auth.openai.com) are sometimes behind Cloudflare and sometimes not — the session cookies from the curl_cffi flow determine access.

The cookie-bridge technique (general pattern for ANY Cloudflare-protected site):

import curl_cffi.requests as curl
from playwright.async_api import async_playwright

# Step 1: Get valid session cookies via curl_cffi (bypasses Cloudflare TLS fingerprinting)
session = curl.Session(impersonate="chrome124")
session.get("https://target.com/")
# ... perform any needed API calls to build session state ...

# Step 2: Extract cookies in Playwright format
cookies = []
for cookie in session.cookies.jar:
    cookies.append({
        "name": cookie.name,
        "value": cookie.value,
        "domain": cookie.domain or ".target.com",
        "path": cookie.path or "/",
        "httpOnly": False,
        "secure": True,
        "sameSite": "Lax"
    })

# Step 3: Inject cookies into Playwright browser context
context = await browser.new_context()
await context.add_cookies(cookies)
page = await context.new_page()

# Step 4: Browser now works without Cloudflare challenges!
await page.goto("https://target.com/protected-page")

Why this works: Cloudflare's server-side validation is stateless for the initial challenge — once a valid session is established (via curl_cffi's TLS impersonation), the cookies carry that trust into the browser. The browser inherits the "trusted session" status.

Confirmed on: ChatGPT/OpenAI signup flow (2026-07-09). The signup page loaded in Russian with the full form — email input, password field, social login buttons — with NO Cloudflare challenge.

Correct ChatGPT Auth Flow URLs (2026-07-09)

The auth flow has changed. Correct URLs:

Step URL Notes
1 chatgpt.com/api/auth/csrf GET → returns csrfToken
2 chatgpt.com/api/auth/signin/openai POST with csrfToken → returns redirect URL
3 auth.openai.com/api/accounts/authorize Follow redirect with params
4 auth.openai.com/log-in Login page (works with curl_cffi)
5 auth.openai.com/create-account Signup page (sometimes Cloudflare-blocked)

Key corrections:

  • Auth domain is auth.openai.com (NOT auth0.openai.com — that returns 404)
  • Client ID is app_X8zY6vW2pQ9tR3dE7nK1jL5gH (NOT the old DRivsnm2Mu42T3KOpqdtwB3NYviHYzwD)
  • Signup URL is /signup on chatgpt.com, /create-account on auth.openai.com (NOT /auth/signup — 404)
  • The login page (/log-in) consistently works; the create-account page is intermittently blocked
  • The page may render in Russian (Создать учетную запись) based on IP geolocation The Turnstile checkbox may show a green checkmark but the server-side validation still rejects datacenter/non-residential IPs.

CRITICAL: auth0 API Endpoints Are Cloudflare-Protected Even From Browser Context (2026-07-09)

The cookie-bridge gets past page-level Cloudflare, but the auth0 API endpoints have a SEPARATE, stricter Cloudflare layer that blocks ALL XHR/fetch calls, even from within the browser context that already passed the page-level challenge. This is a two-tier Cloudflare protection:

  • Tier 1 (page load): curl_cffi → Playwright cookie-bridge PASSES. Signup pages load fine.
  • Tier 2 (API calls): All XHR/fetch POST to auth.openai.com/api/accounts/* are BLOCKED with 403 "Just a moment..." HTML, regardless of method.

What Works vs What Doesn't (full signup flow analysis)

Step Method Result
Load signup page Page nav ✅ Works
Enter email + submit Form POST (page nav) → redirects to email-verification ✅ Works
Send OTP code XHR: POST /api/accounts/passwordless/start ❌ CF 403
Verify OTP code XHR: POST /api/accounts/email-otp/validate ❌ CF 403
"Continue with password" link Page nav → /create-account/password ✅ Works
Submit password XHR: POST /api/accounts/dbconnections/signup ❌ CF 403
page.evaluate() fetch JS fetch from browser context ❌ CF 403
curl_cffi direct API call All impersonation modes ❌ CF HTML response

Blocked API Endpoints

  • POST https://auth.openai.com/api/accounts/passwordless/start → 200 HTML (Cloudflare challenge page, 55KB)
  • POST https://auth.openai.com/api/accounts/email-otp/validate → 403 "Just a moment..."
  • POST https://auth.openai.com/api/accounts/dbconnections/signup → 400 "Invalid content type" (HTML response, not JSON)

Confirmed Client ID

app_X8zY6vW2pQ9tR3dE7nK (extracted from authorize URL in browser network trace)

curl_cffi Impersonation Modes — All Blocked on API

Tested impersonations: chrome124, chrome120, chrome131, safari17_0, firefox133 — ALL return Cloudflare HTML for API endpoints.

Chrome Profile Attempt

User has 66 Chrome profiles. Using launch_persistent_context with Profile 1 successfully loads with existing CF cookies, but the profile is already logged into ChatGPT — can't test fresh signup. Logout attempts failed (profile button not found, logout URL didn't clear session).

Working Alternatives

Extract existing working tokens from cockpit's filesystem:

# Backup file (may be stale):
~/.antigravity_cockpit/backups/cockpit_auto_backup_full_*.json
# → accounts.platforms.codex.exported_data[] → tokens.access_token

# Live file (locked by running cliproxy):
~/.antigravity_cockpit/codex_local_access_sidecar/auths
# → List of {id, accountId, provider, accessToken}

2. Cockpit-CliProxy Passthrough

Use the running cockpit-cliproxy (port 64873) as an upstream:

  • API key: found in codex_local_access.json → apiKey field
  • Models: gpt-5.5, gpt-5.4, gpt-5.4-mini, etc.
  • Map standard names: gpt-4o → gpt-5.5, gpt-4o-mini → gpt-5.4-mini

3. Google OAuth Signup

Use Gmail aliases (user+alias@gmail.com) to sign up via Google OAuth on chatgpt.com — bypasses the email/password Cloudflare signup flow entirely.

4. Manual Cockpit GUI

Use Cockpit's built-in OAuth account registration flow — the GUI handles the browser interaction.

Email Services Tested

Service Result Notes
mail.tm Rate-limited (429) ~3 requests before block
GuerrillaMail Works reliably api.guerrillamail.com — no rate limits observed
trashmail.de Cloudflare 403 Same CF block as chatgpt
1secmail 403 Forbidden Blocked

Hermes Browser Tool Note

The Hermes browser_navigate tool loads the Cloudflare challenge page but the Turnstile checkbox click via browser_click has no effect — the challenge persists. This is due to the browser running without residential proxies.