Cloudflare Turnstile Solver

Request-based token API — one endpoint, JSON in, token out.
service online

Base URL

https://80-47-9-18.sslip.io

All requests go over HTTPS. Interactive checks: /health.

Authentication

Every solve request must carry your API key in a header. Requests without it get 401.

X-API-Key: YOUR_API_KEY

Also accepted: Authorization: Bearer YOUR_API_KEY. Keep the key secret — anyone who has it can solve on your quota.

Solve a challenge

POST/v1/turnstile

Request body application/json

FieldTypeDescription
urlstringrequiredThe page the widget is embedded in, as the browser reports location.href.
sitekeystringrequiredThe widget sitekey (starts 0x…).
actionstringoptionalThe widget's action, if the site sets one. Empty by default.
cdatastringoptionalCustomer data to bind to the token. Empty by default.
proxystringoptionalUpstream proxy URL for this solve. Direct if omitted.

Response

On success, HTTP 200:

{
  "success": true,
  "token": "1.xxxxxxxx…"
}

On failure, HTTP 401 (missing key), 422 (bad body) or 502 (could not solve):

{
  "success": false,
  "message": "Could not solve the Turnstile challenge"
}

The token is single-use and short-lived — submit it promptly and do not log it.

Examples

curl

curl -s https://80-47-9-18.sslip.io/v1/turnstile \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: YOUR_API_KEY' \
  -d '{"url":"https://example.com/login","sitekey":"0x4AAAAAAA…"}'

Python

import requests

r = requests.post(
    "https://80-47-9-18.sslip.io/v1/turnstile",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"url": "https://example.com/login",
          "sitekey": "0x4AAAAAAA..."},
    timeout=120,
)
token = r.json()["token"]

Node

const r = await fetch("https://80-47-9-18.sslip.io/v1/turnstile", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-API-Key": "YOUR_API_KEY",
  },
  body: JSON.stringify({
    url: "https://example.com/login",
    sitekey: "0x4AAAAAAA...",
  }),
});
const { token } = await r.json();
Managed widgets (those that show a checkbox) go through an extra step and fail intermittently on a single try; the service retries up to three times automatically, so a normal call returns a token ~99.8% of the time. Invisible widgets succeed first try.

Health

GET/health — public, no key. Returns 200 with a small JSON body while the service is up.

Performance

~13,500/min
invisible widgets, sustained
~10,900/min
managed widgets, sustained
~0.9–1.1 s
median solve time
99.8–100%
success rate

Drive it with a connection-reusing client and keep several hundred requests in flight for peak throughput; a handful in flight for lowest latency.