Token based
FunCaptcha
Solve FunCaptcha automatically with our secure, high-speed Token API.
Accelerate your workflows with our Token-based FunCaptcha Solver, which provides instant verification tokens that allow you to bypass visual challenges entirely without manual intervention.
Create Task Request Fields
| Field | Type | Required | Description |
|---|---|---|---|
| task.type | String | Yes | FUNCAPTCHA_TOKEN |
| task.input.publicKey | String | Yes | Arkose public key for the site (e.g., A2A14B1D-1AF3-C791-9BBC-EE33CC7A0A6F) |
| task.input.serviceUrl | String | Yes | Arkose challenge base URL (e.g., https://arkoselabs.roblox.com) |
| task.input.websiteUrl | String | Yes | Site base URL (e.g., https://www.roblox.com) |
| task.input.locationHref | String | Yes | Current page URL (e.g., https://www.roblox.com/CreateAccount) |
| task.input.documentTitle | String | No | Document title for the current page (e.g., Roblox) |
| task.input.referer | String | No | Referrer URL (e.g., https://www.roblox.com/) |
| task.input.windowAncestorOrigins | Array | No | Window ancestory origins |
| task.input.windowTreeIndex | Array | No | Window tree index |
| task.input.windowTreeStructure | String | No | Window tree structure |
| task.input.proxyUrl | String | Yes | Proxy URL |
| task.input.data.blob | String | No | Required for some publicKey |
Example
import time
import os
import requests
API_KEY = "YOUR_API_KEY"
URL = "https://solver.nocap.ing"
def solve(blob, proxy_url, max_attempt=60):
headers = {
"X-Api-Key": API_KEY,
}
payload = {
"task": {
"type": "FUNCAPTCHA_TOKEN",
"input": {
"publicKey": "A2A14B1D-1AF3-C791-9BBC-EE33CC7A0A6F",
"websiteUrl": "https://www.roblox.com",
"serviceUrl": "https://arkoselabs.roblox.com",
"locationHref": "https://www.roblox.com/CreateAccount",
"referer": "",
"documentTitle": "Roblox",
"windowAncestorOrigins": [],
"windowTreeIndex": [],
"windowTreeStructure": "[]",
"proxyUrl": proxy_url,
"data": {"blob": blob}
},
}
}
response = requests.post(f"{URL}/createTask", json=payload, headers=headers).json()
task_id = response.get("taskId")
if not task_id:
return None
for attempt in range(max_attempt):
time.sleep(1)
result = requests.post(f"{URL}/getTask", json={"id": task_id}, headers=headers).json()
status = result.get("status")
if status == "SUCCESS":
return result.get("solution")
if status == "REFUNDED":
return None
return None
solution = solve("CHALLENGE_BLOB", "http://your-proxy:80")
if solution:
print("token", solution.get("token"))Response Format
Create Task Response
{
"success": true,
"taskId": "cmpdpjp8l00003j6q1p3pf36i",
"status": "PENDING",
"charged": "0.4"
}Task Result Response ( Pending )
{
"success": true,
"id": "cmpdpjp8l00003j6q1p3pf36i",
"status": "PENDING",
"solution": null,
"charged": "0.4"
}Task Result Response ( Success )
{
"success": true,
"id": "cmpdpjp8l00003j6q1p3pf36i",
"status": "SUCCESS",
"solution": {
"token": "88218b1e12b5c0ba8.3269698104|r=ap-southeast-1|meta=3|metabgclr=transparent|metaiconclr=%23757575|maintxtclr=%23b8b8b8|guitextcolor=%23474747|pk=A2A14B1D-1AF3-C791-9BBC-EE33CC7A0A6F|at=40|ag=101|cdn_url=https%3A%2F%2Farkoselabs.roblox.com%2Fcdn%2Ffc|surl=https%3A%2F%2Farkoselabs.roblox.com|smurl=https%3A%2F%2Farkoselabs.roblox.com%2Fcdn%2Ffc%2Fassets%2Fstyle-manager",
},
"charged": "0.4"
}Task Result Response ( Refund )
{
"success": true,
"id": "cmpdpjp8l00003j6q1p3pf36i",
"status": "REFUNDED",
"solution": null,
"charged": "0.4"
}