Pre-solved Token Pool
The Token Pool feature allows high-concurrency scraping and automation bots to retrieve valid CAPTCHA tokens instantly (< 100ms) without waiting for the normal 5–15 second solving time.
How It Works
- Pre-populate the Pool: Submit a task with a pool type and specify how many tokens to solve (
taskCount). SolverCF workers solve them in advance and deposit them into your targetwebsiteKeypool. - Instant Consumption: Whenever your bot needs a token, call the
resultTaskPoolendpoint. A pre-solved token, matching User-Agent, and cookie (if applicable) are popped from the pool instantly.
1. Pre-populating the Pool (createTask)
Submit a task using one of the pool task types:
| Task Type | Target Captcha |
|---|---|
TurnstileTaskPool |
Cloudflare Turnstile |
RecaptchaV3TaskProxylessPool |
Google reCAPTCHA v3 |
RecaptchaV3EnterpriseTaskProxylessPool |
Google reCAPTCHA v3 Enterprise |
Request Parameters
Send a POST request to https://solvercf.com/token/extension/createTask:
cURL
curl -X POST https://solvercf.com/token/extension/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_CLIENT_KEY",
"task": {
"type": "TurnstileTaskPool",
"websiteUrl": "https://example.com/target-page",
"websiteKey": "0x4AAAAAAAB__YGWiObopXheP",
"taskCount": 10
}
}'
| Field | Type | Required | Description |
|---|---|---|---|
type |
string | Yes | One of the pool task types above. |
websiteUrl |
string | Yes | URL containing the challenge. |
websiteKey |
string | Yes | Target site key. Tokens are pooled and indexed by this websiteKey. |
taskCount |
integer | Yes | Number of tokens to solve and deposit into the pool (must be > 0). |
Response:
JSON
{
"errorId": 0,
"taskId": "f1a2b3c4-d5e6-7a8b-9c0d-1e2f3a4b5c6d",
"status": "created"
}
2. Instant Token Retrieval (resultTaskPool)
Call this endpoint to instantly claim one pre-solved token from the pool.
Request
Code
POST https://solvercf.com/token/extension/resultTaskPool
JSON
{
"clientKey": "YOUR_CLIENT_KEY",
"websiteKey": "0x4AAAAAAAB__YGWiObopXheP"
}
| Field | Type | Required | Description |
|---|---|---|---|
clientKey |
string | Yes | Your account API key. |
websiteKey |
string | Yes | The site key of the pool you wish to pull a token from. |
Response
JSON
{
"status": "success",
"token": "0.4AAAAAAAB__YGWiObopXheP_...",
"cookie": "cf_clearance=...",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...",
"remaining": 9
}
| Field | Type | Description |
|---|---|---|
status |
string | "success" when a token is retrieved, or error message if pool is empty. |
token |
string | Solved token. |
cookie |
string | Solved cookie (if applicable). |
userAgent |
string | Exact User-Agent the token was solved with. |
remaining |
integer | Number of tokens remaining in this websiteKey pool. |
Complete Code Examples: Instant Token Retrieval
cURL
cURL
curl -X POST https://solvercf.com/token/extension/resultTaskPool \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_CLIENT_KEY",
"websiteKey": "0x4AAAAAAAB__YGWiObopXheP"
}'
Python
Python
import requests
CLIENT_KEY = "YOUR_CLIENT_KEY"
WEBSITE_KEY = "0x4AAAAAAAB__YGWiObopXheP"
def get_token_from_pool(client_key: str, website_key: str):
resp = requests.post("https://solvercf.com/token/extension/resultTaskPool", json={
"clientKey": client_key,
"websiteKey": website_key
}).json()
if resp.get("status") != "success" or not resp.get("token"):
raise Exception(f"Failed to get token from pool: {resp.get('status')}")
print(f"Token retrieved instantly! Remaining in pool: {resp.get('remaining')}")
print(f"Token: {resp['token']}")
print(f"UserAgent: {resp.get('userAgent')}")
if resp.get("cookie"):
print(f"Cookie: {resp.get('cookie')}")
return resp
if __name__ == "__main__":
result = get_token_from_pool(CLIENT_KEY, WEBSITE_KEY)
Node.js
JavaScript
const CLIENT_KEY = "YOUR_CLIENT_KEY";
const WEBSITE_KEY = "0x4AAAAAAAB__YGWiObopXheP";
async function getTokenFromPool(clientKey, websiteKey) {
const res = await fetch("https://solvercf.com/token/extension/resultTaskPool", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ clientKey, websiteKey }),
}).then((r) => r.json());
if (res.status !== "success" || !res.token) {
throw new Error(`Failed to get token from pool: ${res.status}`);
}
console.log(`Token received! Remaining: ${res.remaining}`);
return res;
}
getTokenFromPool(CLIENT_KEY, WEBSITE_KEY)
.then((data) => console.log(data))
.catch((err) => console.error(err));
C#
C#
using System;
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading.Tasks;
class Program
{
private static readonly HttpClient HttpClient = new HttpClient();
private const string ClientKey = "YOUR_CLIENT_KEY";
private const string WebsiteKey = "0x4AAAAAAAB__YGWiObopXheP";
static async Task Main()
{
var result = await GetTokenFromPoolAsync(ClientKey, WebsiteKey);
Console.WriteLine($"Token: {result.Token}");
Console.WriteLine($"UserAgent: {result.UserAgent}");
Console.WriteLine($"Remaining: {result.Remaining}");
}
public static async Task<ResultTaskPoolResponse> GetTokenFromPoolAsync(string clientKey, string websiteKey)
{
var response = await HttpClient.PostAsJsonAsync("https://solvercf.com/token/extension/resultTaskPool", new
{
clientKey,
websiteKey
});
var result = await response.Content.ReadFromJsonAsync<ResultTaskPoolResponse>();
if (result == null || result.Status != "success" || string.IsNullOrEmpty(result.Token))
{
throw new Exception($"Failed to get token from pool: {result?.Status ?? "unknown error"}");
}
return result;
}
public class ResultTaskPoolResponse
{
public string? Status { get; set; }
public string? Token { get; set; }
public string? Cookie { get; set; }
public string? UserAgent { get; set; }
public int Remaining { get; set; }
}
}