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

  1. Call createTask with the captcha details. You get a taskId back straight away.
  2. Call getTaskResult about once a second until status is ready.
  3. Submit solution.token to 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"])
        break

Requests 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.

JSON
{
  "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.