flow / docs /usage /turnstile.md
zbq111's picture
Upload 75 files
504b397 verified
# 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.