# gorouter.app Registration > Updated 2026-07-30. Sign-up via GitHub OAuth. $70 signup bonus. Tor SOCKS5 for Cloudflare bypass. ## URL - **Sign-in (use for first-time OAuth):** `https://gorouter.app/sign-in` - Sign-up: `https://gorouter.app/sign-up?aff=6lhB` — GitHub OAuth from here silently redirects back to sign-in for new accounts - API Keys: `/dashboard/keys` - Dashboard: `/dashboard/overview` ## Flow 1. Navigate to `https://gorouter.app/sign-in` 2. Click "GitHub" → OAuth flow → login + 2FA → authorize → dashboard 3. Balance ~$70 auto-credited 4. Navigate to keys page via sidebar click (SPA routing — DO NOT use page.goto) 5. API key page: `https://gorouter.app/keys` ## CRITICAL: API Key Masking **gorouter masks keys in ALL API responses — GET, POST, everything.** The full key is NEVER returned by the API. Even `POST /api/token/` (create) returns a masked key in the response. The only way to get the full key is: 1. **During creation**: the UI toast/modal shows the full key exactly once. Click the copy button and read from clipboard. 2. **Clipboard extraction**: click the masked key button in the table → key is copied to clipboard → read with `navigator.clipboard.readText()`. **Do NOT rely on API response interception for full keys** — every endpoint returns `sk-Yt0p**********Fg4C` pattern. ### API response structure (all keys masked): ```json { "data": { "page": 1, "page_size": 20, "total": 2, "items": [ {"id": 5471, "key": "Yt0p**********Fg4C", "name": "key-Chunkuot-1", "status": 1, ...} ] }, "success": true, "message": "success" } ``` ## Cloudflare Bypass: Tor SOCKS5 ```bash tor.exe --SOCKSPort 9050 --ControlPort 9051 --DataDirectory /tmp/tor_data ``` Verify: `curl -s --socks5 localhost:9050 https://gorouter.app/sign-in | wc -c` (0 = dead) Playwright: `browser.new_context(proxy={"server": "socks5://127.0.0.1:9050"})` Circuit cycling: ControlPort 9051 → `AUTHENTICATE\r\n` → `SIGNAL NEWNYM\r\n` ## SPA Routing (Next.js) gorouter uses client-side routing — `page.goto("/dashboard/keys")` stays on `/dashboard/overview`. Navigate by clicking sidebar links: ```python # CORRECT: click sidebar link link = page.locator("a:has-text('Ключи API')").first await link.click() # URL becomes https://gorouter.app/keys # WRONG: page.goto does nothing await page.goto("https://gorouter.app/dashboard/keys") # URL stays https://gorouter.app/dashboard/overview ``` Fallback: `page.evaluate("window.location.href = '/dashboard/keys'")` triggers a full page reload. ## Playwright Click Interception Overlay divs (`