FunCaptcha
A FunCaptcha (Arkose Labs) task returns a token (token) that you submit to the target site to pass the check, with no puzzles to solve. FunCaptchaTaskProxylessM1 costs 110 points (¥0.11) per task and FunCaptchaTask (your own proxy) costs 15 points (¥0.015); both are asynchronous: createTask, then getTaskResult every 5 seconds. Failed and timed-out tasks are refunded automatically.
https://api.yescaptcha.com/createTaskGlobal endpointhttps://cn.yescaptcha.com/createTaskChina endpointThe request body is JSON authenticated with your clientKey. Query results on the same endpoint you created the task on.
When to use
Section titled “When to use”The page loads an Arkose Labs check (arkoselabs.com, funcaptcha.com), common on sign-up and login pages. Use this page to get a token; to solve the image puzzles yourself in a browser, use FunCaptcha image recognition.
Task types and pricing
Section titled “Task types and pricing”| Task type | Price | Mode | Notes |
|---|---|---|---|
FunCaptchaTaskProxyless | 30 points (¥0.03) | Asynchronous | |
FunCaptchaTaskProxylessM1 | 110 points (¥0.11) | Asynchronous | |
FunCaptchaTask | 15 points (¥0.015) | Asynchronous | Own proxy |
FunCaptchaTaskloads the captcha through your own proxy and needs the proxy fields anduserAgent.- The three types take essentially the same parameters; compare pass rates and choose.
Request parameters
Section titled “Request parameters”| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Task type; see "Task types and pricing" on this page |
websiteURL | string | Yes | Full URL of the page that shows the captcha. Use the site you see the captcha on, not the captcha vendor's domain |
websitePublicKey | string | Yes | The FunCaptcha public key, the data-pkey value in the page or the part after pkey= in the request URL, e.g. B7D8911C-5CC8-A9A3-35B0-554ACEE604DA |
funcaptchaApiJSSubdomain | string | No | The subdomain that serves FunCaptcha; some sites use a custom one. Take it from the iframe URL, e.g. client-api.arkoselabs.com |
data | string | No | Extra blob data as a JSON string such as {"blob":"..."}. Pass it as is without URL encoding; omit if the page does not use it |
userAgent | string | Required for FunCaptchaTask | Browser User-Agent; must match the one you use to visit the target site |
proxyType | string | Required for FunCaptchaTask | Proxy protocol: http, https, socks4 or socks5 |
proxyAddress | string | Required for FunCaptchaTask | Proxy IP address or hostname. Local or private addresses such as 127.0.0.1 or 192.168.x.x will not work because our servers cannot reach them |
proxyPort | integer | Required for FunCaptchaTask | Proxy port |
proxyLogin | string | No | Proxy username, if the proxy requires authentication (FunCaptchaTask only) |
proxyPassword | string | No | Proxy password, if the proxy requires authentication (FunCaptchaTask only) |
websiteURL: the site where you see the captcha, notfuncaptcha.comorarkoselabs.com.websitePublicKey: the page’sdata-pkeyvalue, or thepkeyvalue in a request such as…/fc/api/nojs/?pkey=….funcaptchaApiJSSubdomain: some sites load FunCaptcha from a custom subdomain; take it from the iframe URL, for exampleclient-api.arkoselabs.com.data: blob data the site passes to the captcha, as a JSON string like{"blob":"..."}. Pass it exactly as is; don’t encode or decode characters such as%3Dand%2B. Omit it if you can’t find one.
Request example
Section titled “Request example”{ "clientKey": "YOUR_CLIENT_KEY", "task": { "type": "FunCaptchaTaskProxylessM1", "websiteURL": "https://example.com/signup", "websitePublicKey": "B7D8911C-5CC8-A9A3-35B0-554ACEE604DA", "funcaptchaApiJSSubdomain": "client-api.arkoselabs.com" }}curl -s https://api.yescaptcha.com/createTask \ -H 'Content-Type: application/json' \ -d '{ "clientKey": "YOUR_CLIENT_KEY", "task": { "type": "FunCaptchaTaskProxylessM1", "websiteURL": "https://example.com/signup", "websitePublicKey": "B7D8911C-5CC8-A9A3-35B0-554ACEE604DA", "funcaptchaApiJSSubdomain": "client-api.arkoselabs.com" }}'
# Returns {"errorId":0,"taskId":"..."}; then poll every 5 seconds:curl -s https://api.yescaptcha.com/getTaskResult \ -H 'Content-Type: application/json' \ -d '{"clientKey": "YOUR_CLIENT_KEY", "taskId": "TASK_ID"}'import osimport time
import requests
API = "https://api.yescaptcha.com"CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"] # Read the clientKey from an environment variable
def call(method, payload): r = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30) data = r.json() if data.get("errorId"): raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}") return data
def solve(task): task_id = call("createTask", {"task": task})["taskId"] for _ in range(36): # Poll every 5 seconds, for up to about 3 minutes time.sleep(5) result = call("getTaskResult", {"taskId": task_id}) if result.get("status") == "ready": return result["solution"] raise TimeoutError(task_id)
solution = solve({ "type": "FunCaptchaTaskProxylessM1", "websiteURL": "https://example.com/signup", "websitePublicKey": "B7D8911C-5CC8-A9A3-35B0-554ACEE604DA", "funcaptchaApiJSSubdomain": "client-api.arkoselabs.com",})print(solution["token"])const API = 'https://api.yescaptcha.com';const CLIENT_KEY = process.env.YESCAPTCHA_CLIENT_KEY; // Read the clientKey from an environment variable
async function call(method, payload) { const res = await fetch(`${API}/${method}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ clientKey: CLIENT_KEY, ...payload }), }); const data = await res.json(); if (data.errorId) throw new Error(`${data.errorCode}: ${data.errorDescription}`); return data;}
async function solve(task) { const { taskId } = await call('createTask', { task }); for (let i = 0; i < 36; i++) { // Poll every 5 seconds, for up to about 3 minutes await new Promise((r) => setTimeout(r, 5000)); const result = await call('getTaskResult', { taskId }); if (result.status === 'ready') return result.solution; } throw new Error(`timeout: ${taskId}`);}
const solution = await solve({ type: "FunCaptchaTaskProxylessM1", websiteURL: "https://example.com/signup", websitePublicKey: "B7D8911C-5CC8-A9A3-35B0-554ACEE604DA", funcaptchaApiJSSubdomain: "client-api.arkoselabs.com",});console.log(solution.token);With your own proxy and blob data:
{ "clientKey": "YOUR_CLIENT_KEY", "task": { "type": "FunCaptchaTask", "websiteURL": "https://example.com/signup", "websitePublicKey": "B7D8911C-5CC8-A9A3-35B0-554ACEE604DA", "data": "{\"blob\":\"BLOB_VALUE_FROM_THE_PAGE\"}", "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36", "proxyType": "http", "proxyAddress": "proxy.example.com", "proxyPort": 8080, "proxyLogin": "user", "proxyPassword": "pass" }}Result
Section titled “Result”{ "errorId": 0, "status": "ready", "solution": { "token": "36859d1086acb06e7.08293101|r=ap-southeast-1|metabgclr=%23ffffff|..." }}| Field | Type | Description |
|---|---|---|
token | string | The token to submit to the target site. Single use; submit it as soon as possible |
While in progress you get {"errorId": 0, "status": "processing"}; check again 5 seconds later. Handle errors by errorCode as described in Error codes.
How long is a token valid?
Section titled “How long is a token valid?”Single use. Submit it as soon as possible.
Every task fails
Section titled “Every task fails”Check websitePublicKey and funcaptchaApiJSSubdomain. If the site requires blob data, data must be included and must not be re-encoded. FunCaptchaTaskProxyless keeps failing (and refunding) until it is repaired; use the other two types.