YOUR NEXT REQUEST STARTS HERE
Build more.
Let us solve the captcha.
One familiar API. Your own key. Only pay for success.
Turnstile from $0.002 per successful solve.Captcha solving API for developers.
Solve Turnstile and Aliyun with one familiar API. Built on our own infrastructure. Priced for what works.
curl -X POST https://bilsolver.com/createTask \
-H 'Content-Type: application/json' \
-d '{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "TurnstileTaskProxyless",
"websiteURL": "https://example.com",
"websiteKey": "YOUR_SITE_KEY"
}
}'
"status": "ready" Solved.01 / CAPTCHA COVERAGE
One integration for your captcha stack.
Available today, with more on the way.
A straightforward API for your Turnstile challenges. Proxy and proxyless tasks.
TurnstileTaskSlider challenges, handled. Send your scene ID, prefix, and website URL.
AliyunV2TaskV3 slider support with the same create, poll, and receive workflow.
AliyunV3Task02 / BUILT TO KEEP YOU MOVING
We own and operate the infrastructure.
You focus on the code that matters.
A self-hosted, 28-core cluster built for high concurrency. Parallel tasks, without managing solver infrastructure yourself.
See the infrastructure live2Captcha / CapMonster-compatible endpoints. Keep your create-and-poll workflow and switch the base URL.
Bring your proxy when the task needs one, or use a supported proxyless task.
Pass a callbackUrl and receive the result by webhook. Polling is optional.
Concurrent processing with automatic retries and backoff for transient failures.
Failed tasks are refunded automatically. Every API key has its own balance.
03 / SIMPLE MATH
Clear, per-solve pricing in USD.
Only successful solves count.
| Captcha type | Per solve | Per 1,000 solves | Get started |
|---|---|---|---|
| Cloudflare Turnstile | $0.002 | $2.00 | |
| Aliyun Captcha V2 | $0.003 | $3.00 | |
| Aliyun Captcha V3 | $0.004 | $4.00 |
Task cost is deducted when created. If the solve fails, your balance is refunded automatically.
04 / LESS SETUP. MORE BUILDING.
Plain HTTP. JSON in, token out.
Pick your language and make it yours.
Send your clientKey and captcha details to /createTask.
Poll /getTaskResult until the status is ready. Use the returned token.
Check your key’s balance with /getBalance, or add a webhook.
https://bilsolver.com#!/usr/bin/env bash
set -euo pipefail
BASE="https://bilsolver.com"
KEY="YOUR_API_KEY"
# 1. Create a task
created=$(curl --fail-with-body -sS --max-time 30 \
"$BASE/createTask" -H 'Content-Type: application/json' \
-d "{\"clientKey\":\"$KEY\",\"task\":{
\"type\":\"TurnstileTaskProxyless\",
\"websiteURL\":\"https://example.com\",
\"websiteKey\":\"YOUR_SITE_KEY\"}}")
task_id=$(printf '%s' "$created" | jq -er \
'if .errorId == 0 then .taskId else error(.errorCode) end')
# 2. Poll every 2s, with a 120s deadline
deadline=$((SECONDS + 120))
while (( SECONDS < deadline )); do
sleep 2
result=$(curl --fail-with-body -sS --max-time 30 \
"$BASE/getTaskResult" -H 'Content-Type: application/json' \
-d "{\"clientKey\":\"$KEY\",\"taskId\":\"$task_id\"}")
printf '%s' "$result" | jq -e \
'if .errorId == 0 then true else error(.errorCode) end' > /dev/null
if [[ $(printf '%s' "$result" | jq -r '.status') == ready ]]; then
printf '%s' "$result" | jq -r '.solution.token'
exit 0
fi
done
printf '%s\n' 'Polling timed out; the task may still finish.' >&2
exit 1import time
import requests
BASE = "https://bilsolver.com"
KEY = "YOUR_API_KEY"
def post(endpoint, **payload):
response = requests.post(
BASE + endpoint,
json={"clientKey": KEY, **payload},
timeout=30,
)
response.raise_for_status()
data = response.json()
if data.get("errorId") != 0:
raise RuntimeError(data.get("errorCode", "API error"))
return data
# 1. Create a task
created = post("/createTask", task={
"type": "TurnstileTaskProxyless",
"websiteURL": "https://example.com",
"websiteKey": "YOUR_SITE_KEY",
})
# 2. Poll until ready (120s deadline)
deadline = time.monotonic() + 120
while time.monotonic() < deadline:
time.sleep(2)
result = post("/getTaskResult", taskId=created["taskId"])
if result.get("status") == "ready":
print(result["solution"]["token"])
break
else:
raise TimeoutError("Polling timed out; task may still finish.")import { setTimeout as sleep } from "node:timers/promises";
const BASE = "https://bilsolver.com";
const KEY = "YOUR_API_KEY";
async function post(endpoint, payload) {
const response = await fetch(BASE + endpoint, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ clientKey: KEY, ...payload }),
signal: AbortSignal.timeout(30_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
if (data.errorId !== 0) throw new Error(data.errorCode || "API error");
return data;
}
// 1. Create a task
const { taskId } = await post("/createTask", { task: {
type: "TurnstileTaskProxyless",
websiteURL: "https://example.com",
websiteKey: "YOUR_SITE_KEY",
}});
// 2. Poll until ready (120s deadline)
const deadline = Date.now() + 120_000;
let ready = false;
while (Date.now() < deadline) {
await sleep(2_000);
const result = await post("/getTaskResult", { taskId });
if (result.status === "ready") {
console.log(result.solution.token);
ready = true;
break;
}
}
if (!ready) throw new Error("Polling timed out; task may still finish.");05 / GOOD QUESTIONS
The details, before your first request.
More in the docsYes. BILSOLVER supports the compatible JSON workflow: POST /createTask, POST /getTaskResult, and POST /getBalance. Set your base URL to https://bilsolver.com, use your BILSOLVER clientKey, and choose a supported task type. Check task parameters in the docs when migrating.
The task cost is deducted from your key’s balance when you create a task. Transient failures are retried with backoff. If the task ultimately fails, its cost is automatically refunded. You only pay for successful solves.
Cloudflare Turnstile, Aliyun Captcha V2, and Aliyun Captcha V3 are available, including proxyless task variants. Aliyun tasks require a website URL, a scene ID as websiteKey, and a prefix. reCAPTCHA v3, GeeTest, and hCaptcha are coming soon and are not available yet.
Yes. Provide proxy settings on supported task types. To receive the result without polling, pass callbackUrl at the top level of your /createTask request. See the API reference for task fields and the callback payload.
Each API key has its own balance. Send your clientKey to POST /getBalance to check it. Pricing is per successful solve in USD, with automatic refunds for failed tasks.
They are live metrics from the public /stats endpoint, refreshed every 10 seconds while this page is visible. Counts cover reporting workers, success rate is solved divided by completed tasks, and uptime belongs to the responding worker. Metrics can reset when workers restart; they are not historical uptime guarantees.
YOUR NEXT REQUEST STARTS HERE
One familiar API. Your own key. Only pay for success.
Turnstile from $0.002 per successful solve.