NeuroCaptcha

TurnstileTaskProxyless

Parameters, request and response for Cloudflare Turnstile without a proxy: the TurnstileTaskProxyless task type.

On this page

Cloudflare Turnstile: the widget from challenges.cloudflare.com/turnstile/v0/api.js, usually a “Verify you are human” box, sometimes invisible. The task is solved from our IP addresses — no proxy needed.

Price$0.80 per 1000 tasks ($0.0008 per task), only for solved tasks — pricing
Proxynot needed
Queue in getQueueStats—
Also accepted asTurnstileTaskProxyLess

Parameters#

Fields of the task object in createTask:

type
stringrequired
TurnstileTaskProxyless
websiteURL
stringrequired
Full address of the page with the captcha: http(s), up to 2048 characters, a public site.
websiteKey
stringrequired
Turnstile site key: the data-sitekey attribute of the cf-turnstile widget or the sitekey passed to turnstile.render, usually 0x4AAAAAAA….
action
string
The widget action (data-action), if the page sets one. Letters, digits, _ / . -, up to 128 characters. pageAction is accepted too.
turnstileCData
string
The widget cData (data-cdata), if the page sets one. Up to 1024 characters: letters, digits and _ - . : = + /.
userAgent
string
User-Agent of the browser that will submit the token, up to 512 characters. It is returned in solution.userAgent.
cookies
string
Cookies of the target site for the solving browser: name=value; name2=value2, up to 8192 characters. Stored encrypted.

Request#

POST /createTask
{
  "clientKey": "YOUR_API_KEY",
  "task": {
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA-SITE-KEY"
  }
}

Complete example#

Create the task, poll every 2 seconds, print the token:

import os
import time

import requests

API = "https://neurocaptcha.com"
KEY = os.environ["API_KEY"]


def call(method, payload):
    data = requests.post(f"{API}/{method}", json={"clientKey": KEY, **payload}, timeout=30).json()
    if data.get("errorId"):
        raise RuntimeError(f'{data["errorCode"]}: {data.get("errorDescription", "")}')
    return data


task = {
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA-SITE-KEY",
}

# 1. create the task: its price is held, not charged
task_id = call("createTask", {"task": task})["taskId"]

# 2. poll every 2 s; a failed task raises with its error code and costs nothing
deadline = time.time() + 300
while time.time() < deadline:
    time.sleep(2)
    result = call("getTaskResult", {"taskId": task_id})
    if result["status"] == "ready":
        print(result["solution"]["token"])
        break
else:
    raise TimeoutError("the task was not solved in time")

Response#

getTaskResult once the task is solved:

getTaskResult
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "token": "0.Q2Vo3vPq7TnZxw…",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36"
  },
  "cost": "0.000800",
  "ip": "198.51.100.7",
  "createTime": 1793370000,
  "endTime": 1793370007,
  "solveCount": 1
}

Tips#

  • Find websiteKey in the data-sitekey attribute of the cf-turnstile element or in the turnstile.render call.
  • Copy action and cData exactly when the widget sets them: the site may compare them with the token.
  • Put the token into the cf-turnstile-response field (or pass it to the widget callback) and send the form.
  • If the site binds the answer to the IP address, switch to the type with your proxy.