SilentCap API
SilentCap returns valid tokens for FunCaptcha and Cloudflare Turnstile. You send the page details, we solve the captcha, and you submit the token as if a person had solved it.
Base URL
All requests go to https://api.silentcap.fun.
Authentication
Every request includes your API key as clientKey in the JSON body. You can find and rotate
your key in the dashboard. Keep it on your server, never in client-side code.
How solving works
- Call
createTaskwith the captcha details. You get ataskIdback straight away. - Call
getTaskResultabout once a second untilstatusisready. - Submit
solution.tokento the site the same way its own widget would.
You pay only for tasks that return a token. Failed solves are free. See FunCaptcha and Turnstile for the fields each task type takes.
Unlimited plans
Instead of paying per token, you can buy hours of unlimited solving for one captcha type: $20.00 an hour for FunCaptcha or $16.00 an hour for Turnstile. While a plan is active, tasks of that type are not charged per solve, and you can have up to 1,000 of them in progress at once.
Plans are bought from the pricing section or your dashboard, 1 to 720 hours at a time. A plan starts when your payment is confirmed, and hours bought while it is active are added to its end. Nothing changes in your integration: you use the same key and the same endpoints.
Quickstart
import time, requests
API = "https://api.silentcap.fun"
KEY = "YOUR_API_KEY"
task = requests.post(f"{API}/createTask", json={
"clientKey": KEY,
"task": {
"type": "TurnstileTask",
"websiteURL": "https://example.com/login",
"websiteKey": "0x4AAAAAAA...",
},
}).json()
while True:
time.sleep(1)
res = requests.post(f"{API}/getTaskResult", json={
"clientKey": KEY, "taskId": task["taskId"],
}).json()
if res["status"] == "ready":
print(res["solution"]["token"])
breakRequests and responses
Every endpoint takes a POST request with a JSON body and Content-Type: application/json. Every response includes errorId: 0 means the request succeeded. Anything else means it failed, and the response also
carries an errorCode and a readable errorDescription.
{
"errorId": 1,
"errorCode": "ERROR_KEY_DOES_NOT_EXIST",
"errorDescription": "The clientKey you sent does not match any account."
}Check errorId rather than the HTTP status. The full list of codes is on the Errors page.