Create a key in the panel, then send the page URL that shows the Turnstile widget.
curl -X POST https://pc-bn9wxsy57bl5.manus.host/api/solve \
-H 'Content-Type: application/json' \
-H 'X-Api-Key: YOUR_KEY' \
-d '{"page_url":"https://example.com/login","sitekey":""}'
Leave sitekey empty and the solver reads it from the page. A call usually returns in 8–20 seconds.
{"ok": true, "token": "...", "elapsed_ms": 14200}
curl https://pc-bn9wxsy57bl5.manus.host/api/v1/me -H 'X-Api-Key: YOUR_KEY'
| 401 | Missing, unknown, revoked, or expired key |
| 403 | Page host is not on that key's allowlist |
| 429 | Per-minute limit, daily quota, or all workers are busy |
| 502 | The page did not produce a token |
Python 3.10+, Node 18+, and Chrome. From the turnstile_solver directory:
npm install export CHROME_PATH=/usr/bin/google-chrome export ADMIN_PASSWORD='a-long-password' export SOLVER_DATA=/var/lib/turnstile-solver/data.json export SOLVER_WORKERS=4 export BIND=127.0.0.1 export PORT=8787 export PUBLIC_URL=https://pc-bn9wxsy57bl5.manus.host python3 -m turnstile_solver.service
Put a reverse proxy on 443 and allow at least 180 seconds for /api/solve. Sign in at /panel to create keys. A key can have a daily solve cap, an expiry in days, and an optional host allowlist. Blank means unlimited, never expires, and any host. Set ACCESS_KEY once if you already have a client key; it is imported as checker with those defaults.