| # Cloudflare Turnstile Usage |
|
|
| Cloudflare Turnstile is an invisible or widget-based CAPTCHA alternative. The solver visits the target page with Chromium, interacts with the Turnstile widget, and extracts the resulting token from a hidden `cf-turnstile-response` input field. |
|
|
| ## Supported task types |
|
|
| | Task type | Description | |
| |-----------|-------------| |
| | `TurnstileTaskProxyless` | Standard Turnstile solving | |
| | `TurnstileTaskProxylessM1` | Same path, alternate tier naming | |
|
|
| ## Required fields |
|
|
| | Field | Type | Description | |
| |-------|------|-------------| |
| | `websiteURL` | string | Full URL of the page containing the Turnstile widget | |
| | `websiteKey` | string | The Turnstile `data-sitekey` value | |
|
|
| ## Solution field |
|
|
| Unlike reCAPTCHA tasks, the result is returned in `solution.token` (not `solution.gRecaptchaResponse`): |
|
|
| ```json |
| { |
| "errorId": 0, |
| "status": "ready", |
| "solution": { |
| "token": "0.ufq5RgSV..." |
| } |
| } |
| ``` |
|
|
| ## Test targets |
|
|
| Cloudflare provides official dummy site keys for testing: |
|
|
| | Site key | Behavior | URL | |
| |----------|----------|-----| |
| | `1x00000000000000000000AA` | Always passes | Any domain | |
| | `2x00000000000000000000AB` | Always fails | Any domain | |
| | `3x00000000000000000000FF` | Forces interactive challenge | Any domain | |
|
|
| The React Turnstile demo is a good live test target: |
|
|
| - **URL:** `https://react-turnstile.vercel.app/basic` |
| - **Site key:** `1x00000000000000000000AA` (test key, always passes) |
|
|
| ## Create a task |
|
|
| ```bash |
| curl -X POST http://localhost:8000/createTask \ |
| -H "Content-Type: application/json" \ |
| -d '{ |
| "clientKey": "your-client-key", |
| "task": { |
| "type": "TurnstileTaskProxyless", |
| "websiteURL": "https://react-turnstile.vercel.app/basic", |
| "websiteKey": "1x00000000000000000000AA" |
| } |
| }' |
| ``` |
|
|
| Response: |
|
|
| ```json |
| { |
| "errorId": 0, |
| "taskId": "uuid-string" |
| } |
| ``` |
|
|
| ## Poll for result |
|
|
| ```bash |
| curl -X POST http://localhost:8000/getTaskResult \ |
| -H "Content-Type: application/json" \ |
| -d '{ |
| "clientKey": "your-client-key", |
| "taskId": "uuid-from-createTask" |
| }' |
| ``` |
|
|
| When ready: |
|
|
| ```json |
| { |
| "errorId": 0, |
| "status": "ready", |
| "solution": { |
| "token": "XXXX.DUMMY.TOKEN.XXXX" |
| } |
| } |
| ``` |
|
|
| !!! info "Dummy token" |
| Cloudflare test keys (`1x00000000000000000000AA`) return the dummy token `XXXX.DUMMY.TOKEN.XXXX`. This is the expected and correct behavior for test sitekeys — the token is accepted by Cloudflare's test infrastructure. |
| |
| ## Acceptance status |
|
|
| | Target | Site key | Status | |
| |--------|----------|--------| |
| | `https://react-turnstile.vercel.app/basic` | `1x00000000000000000000AA` | ✅ Dummy token returned | |
|
|
| ## Operational notes |
|
|
| - Turnstile auto-solves most of the time without user interaction; the solver polls for the token after page load. |
| - Real production sitekeys will return a real token (not the dummy token). |
| - The `TurnstileTaskProxylessM1` type uses the same implementation path. |
|
|