Anti Turnstile

The Turnstile captcha is Cloudflare's attempt to replace reCaptcha. We automatically support all subtypes (manual, non-interactive, invisible) without needing you to specify them.

How to Use

Create the task with the `createTask` method and poll for the result using the `getTaskResult` method.

Proxy Information

This task type is **proxyless** (`AntiTurnstileTaskProxyLess`). You do not need to provide a proxy.

1. Create Task

Use the `createTask` method to initiate the solving process. You must provide the `websiteURL` and `websiteKey`.

Task Object Parameters

PropertyTypeRequiredDescription
typeStringRequiredMust be `AntiTurnstileTaskProxyLess`
websiteURLStringRequiredThe full URL of the target page where Turnstile is present.
websiteKeyStringRequiredThe Turnstile `site-key` found on the target website.
metadataObjectOptionalAn object for Turnstile's extra data parameters.
metadata.actionStringOptionalThe value of the `data-action` attribute of the Turnstile element.
metadata.cdataStringOptionalThe value of the `data-cdata` attribute of the Turnstile element.

Run Sandbox Task

2. Get Result

After creating a task, use the `getTaskResult` method to check the status and retrieve the solution. Poll this endpoint every 3-5 seconds until the status is `completed`.

Fetch Result Sandbox

SDK Usage

# Coming soon: A simplified Python SDK
# pip install --upgrade captchasonic
#
# from captchasonic import CaptchaSonic
#
# client = CaptchaSonic(api_key="YOUR_API_KEY")
#
# solution = client.solve_turnstile(
#   website_url="https://your-target-website.com",
#   website_key="0x4AAAAAAABRS0NDnxxxxx"
# )
# print(solution.token)

Full Sample Code

import requests
import time

API_KEY = "YOUR_API_KEY"
API_URL = "https://api.captchasonic.com"

def solve_turnstile():
    # 1. Create the task
    print("Creating Turnstile task...")
    create_payload = {
        "apiKey": API_KEY,
        "task": {
            "type": "AntiTurnstileTaskProxyLess",
            "websiteURL": "https://your-target-website.com",
            "websiteKey": "0x4AAAAAAABRS0NDnxxxxx"
        }
    }
    res = requests.post(f"{API_URL}/createTask", json=create_payload)
    if res.status_code != 200:
        print(f"Error creating task: {res.text}")
        return

    task_id = res.json().get("taskId")
    if not task_id:
        print(f"Could not find taskId in response: {res.json()}")
        return
    
    print(f"Task created successfully. Task ID: {task_id}")

    # 2. Poll for the result
    while True:
        print("Polling for result...")
        time.sleep(3) # Wait 3 seconds between polls
        get_payload = {"apiKey": API_KEY, "taskId": task_id}
        res = requests.post(f"{API_URL}/getTaskResult", json=get_payload)
        
        if res.status_code != 200:
            print(f"Error getting result: {res.text}")
            continue

        resp_json = res.json()
        status = resp_json.get("status")
        
        if status == "completed":
            print("Task completed!")
            return resp_json.get("solution")
        elif status == "failed":
            print(f"Task failed: {resp_json.get('errorDescription')}")
            return
        elif status == "processing":
            print("Task is still processing, trying again...")
        else:
            print(f"Unknown status: {status}, response: {resp_json}")
            
# Run the solver
solution = solve_turnstile()
if solution:
    print("\n--- SOLUTION ---")
    print(f"Token: {solution.get('token')[:30]}...")
    print("----------------")