Result Task Pool
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
websiteKeythat gets steady traffic across SolverCF's users, tokens are usually already sitting in the pool, ready to be pulled instantly. - For a
websiteKeynobody has requested recently, the pool will likely be empty — fall back to a normalcreateTaskwithtype: "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 |
{
"clientKey": "YOUR_CLIENT_KEY",
"websiteKey": "0x4AAAAAAAf4mfyVrG728T40"
}
Response
| Field | Type | Description |
|---|---|---|
status |
string | Status of the returned token |
token |
string | The pre-solved token |
{
"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 -X POST https://solvercf.com/token/resultTaskPool \
-H "Content-Type: application/json" \
-d '{ "clientKey": "YOUR_CLIENT_KEY", "websiteKey": "0x4AAAAAAAf4mfyVrG728T40" }'
Example: 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
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#
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());
Recommended pattern
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.