Solver Cloudflare

Result Task Pool

Code
POST https://solvercf.com/token/resultTaskPool

TurnstileTaskPool works differently from a normal task: instead of solving on demand, SolverCF keeps a shared pool of pre-solved Turnstile tokens per websiteKey. This endpoint pulls the oldest available token for a given websiteKey immediately — there's no createTask/getTaskResult round trip and no waiting.

Use this when you need the lowest possible latency for a websiteKey you solve repeatedly, and can tolerate an error if the pool happens to be empty at that moment.

How the pool gets filled

The pool isn't warmed proactively for arbitrary site keys — it's populated as a side effect of TurnstileTaskPool tasks (created via Create Task with type: "TurnstileTaskPool") being solved by workers and submitted into the shared pool instead of being tied to a single caller's task. In practice this means:

  • For a websiteKey that gets steady traffic across SolverCF's users, tokens are usually already sitting in the pool, ready to be pulled instantly.
  • For a websiteKey nobody has requested recently, the pool will likely be empty — fall back to a normal createTask with type: "TurnstileTaskPool" to both get a token and seed the pool for subsequent calls.

Pool tokens are also short-lived: Cloudflare Turnstile tokens are generally only valid for a few minutes after being solved, so stale pool entries are pruned automatically — don't rely on a pulled token still being valid if you hold onto it before submitting it.

Request

Field Type Required Description
clientKey string yes Your account API key
websiteKey string yes The site key to pull a pre-solved token for
JSON
{
  "clientKey": "YOUR_CLIENT_KEY",
  "websiteKey": "0x4AAAAAAAf4mfyVrG728T40"
}

Response

Field Type Description
status string Status of the returned token
token string The pre-solved token
JSON
{
  "status": "success",
  "token": "0.AbC123..."
}

If no token is currently available for that websiteKey, the request fails with errorId: 1 and a "pools is empty" description — fall back to Create Task with type: "TurnstileTaskPool" in that case.

Code examples

Example: cURL

cURL
curl -X POST https://solvercf.com/token/resultTaskPool \
  -H "Content-Type: application/json" \
  -d '{ "clientKey": "YOUR_CLIENT_KEY", "websiteKey": "0x4AAAAAAAf4mfyVrG728T40" }'

Example: Python

Python
import requests

response = requests.post("https://solvercf.com/token/resultTaskPool", json={
    "clientKey": "YOUR_CLIENT_KEY",
    "websiteKey": "0x4AAAAAAAf4mfyVrG728T40",
})
print(response.json().get("token", "pool empty"))

Example: JavaScript

JavaScript
const response = await fetch("https://solvercf.com/token/resultTaskPool", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ clientKey: "YOUR_CLIENT_KEY", websiteKey: "0x4AAAAAAAf4mfyVrG728T40" }),
});
const { token } = await response.json();
console.log(token);

Example: C#

C#
using var client = new HttpClient();
var response = await client.PostAsJsonAsync("https://solvercf.com/token/resultTaskPool", new
{
    clientKey = "YOUR_CLIENT_KEY",
    websiteKey = "0x4AAAAAAAf4mfyVrG728T40",
});
Console.WriteLine(await response.Content.ReadAsStringAsync());
Python
import requests

def get_turnstile_token(website_key, client_key):
    pool = requests.post("https://solvercf.com/token/resultTaskPool", json={
        "clientKey": client_key,
        "websiteKey": website_key,
    }).json()

    if pool.get("token"):
        return pool["token"]  # instant hit

    # pool empty -> fall back to the normal create/poll flow
    return solve_turnstile(website_key)  # see Getting Started for solve_turnstile()

Treat the pool as a fast path, not a guarantee — always have the normal createTask/getTaskResult flow as a fallback for the cache-miss case.