CaptchaFox
Solve CaptchaFox challenges and get a verification token
Overview
CaptchaFox is a GDPR-compliant, European bot-protection CAPTCHA. It runs a token-based challenge (slide, one-click, or audio) backed by proof-of-work and behavioral signals, then returns a verification token the site validates server-side.
Our API solves CaptchaFox over a pure-HTTP path and returns the token for you to submit. It works across all CaptchaFox-protected sites, including United Internet properties (mail.com, gmx.com, web.de) which use a dedicated CaptchaFox host - routing is handled automatically.
Supported Task Types
| Task Type | Proxy Required | Description |
|---|---|---|
CaptchaFoxTaskProxyLess | No | Uses our proxy pool |
CaptchaFoxTask | Yes | Requires your proxy |
Create Task
Endpoint: POST /createTask
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
clientKey | String | Yes | Your API key |
task.type | String | Yes | Task type (see table above) |
task.websiteURL | String | Yes | Page URL containing the captcha |
task.websiteKey | String | Yes | CaptchaFox site key (sk_...) |
task.proxy | String | No | Required for CaptchaFoxTask. See Proxy Format |
Basic Request
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "CaptchaFoxTaskProxyLess",
"websiteURL": "https://signup.gmx.com/",
"websiteKey": "sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}Request with Proxy
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "CaptchaFoxTask",
"websiteURL": "https://signup.gmx.com/",
"websiteKey": "sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"proxy": "host:port:user:pass"
}
}Response
{
"errorId": 0,
"taskId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}Get Task Result
Endpoint: POST /getTaskResult
Request
{
"clientKey": "YOUR_API_KEY",
"taskId": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}Response (Ready)
{
"errorId": 0,
"status": "ready",
"solution": {
"token": "1ff8e270a3b1c4..."
}
}The token format differs by site (a MAM_-prefixed token on United Internet properties, a hex token elsewhere). Both are valid - submit whichever you receive without modification.
Code Examples
# Create task
curl -X POST https://api.capbypass.pro/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "CaptchaFoxTaskProxyLess",
"websiteURL": "https://signup.gmx.com/",
"websiteKey": "sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}'
# Get result
curl -X POST https://api.capbypass.pro/getTaskResult \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_API_KEY",
"taskId": "TASK_ID"
}'import requests
import time
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.capbypass.pro"
def solve_captchafox(website_url, website_key, proxy=None):
# Create task
task = {
"type": "CaptchaFoxTask" if proxy else "CaptchaFoxTaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key,
}
if proxy:
task["proxy"] = proxy # host:port:user:pass
response = requests.post(f"{BASE_URL}/createTask", json={
"clientKey": API_KEY,
"task": task,
})
task_id = response.json()["taskId"]
# Poll for result
while True:
result = requests.post(f"{BASE_URL}/getTaskResult", json={
"clientKey": API_KEY,
"taskId": task_id,
}).json()
if result.get("status") == "ready":
return result["solution"]["token"]
if result.get("errorId"):
raise Exception(f"Error: {result.get('errorDescription')}")
time.sleep(2)
# Usage
token = solve_captchafox(
"https://signup.gmx.com/",
"sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
)
print(f"Token: {token[:50]}...")const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://api.capbypass.pro';
async function solveCaptchaFox(websiteURL, websiteKey, proxy) {
// Create task
const task = {
type: proxy ? 'CaptchaFoxTask' : 'CaptchaFoxTaskProxyLess',
websiteURL,
websiteKey,
};
if (proxy) task.proxy = proxy; // host:port:user:pass
const createRes = await fetch(`${BASE_URL}/createTask`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ clientKey: API_KEY, task }),
});
const { taskId } = await createRes.json();
// Poll for result
while (true) {
const resultRes = await fetch(`${BASE_URL}/getTaskResult`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ clientKey: API_KEY, taskId }),
});
const result = await resultRes.json();
if (result.status === 'ready') {
return result.solution.token;
}
await new Promise((r) => setTimeout(r, 2000));
}
}
// Usage
const token = await solveCaptchaFox(
'https://signup.gmx.com/',
'sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
);How to Find the Website Key
The site key is the sk_... value passed to the CaptchaFox widget.
- HTML attribute: look for the widget element's
data-sitekey:
<div class="captchafox" data-sitekey="sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"></div>-
Script tag: the widget loads from
cdn.captchafox.com/api.js. Filter the Network tab forcaptchafox. -
JavaScript render: sites that render programmatically pass it to
captchafox.render():
captchafox.render('#container', { sitekey: 'sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' });Submitting the Token
CaptchaFox writes the token into a hidden form field named cf-captcha-response. Set that field to the token you received, then submit the form (or pass the token to the widget's success callback):
document.querySelector('[name="cf-captcha-response"]').value = token;Typical Solve Time
- Average: 1 - 10 seconds
- Maximum timeout: 60 seconds
Error Codes
| Error Code | Description |
|---|---|
ERROR_KEY_DOES_NOT_EXIST | Invalid API key |
ERROR_ZERO_BALANCE | Insufficient balance |
ERROR_CAPTCHA_UNSOLVABLE | Challenge could not be solved |
ERROR_TASK_NOT_FOUND | Task ID not found |
ERROR_INVALID_TASK_DATA | Missing or invalid parameters |
ERROR_PROXY_NOT_DEFINED | Proxy required for a non-ProxyLess task type — use the ProxyLess variant or supply task.proxy |
ERROR_PROXY_CONNECTION_FAILED | Could not connect through your proxy (refused, unreachable, or bad credentials) - check the proxy is alive and reachable |
ERROR_PROXY_BANNED | The target blocked your proxy IP (datacenter or flagged) - use a residential or mobile proxy |
ERROR_INVALID_DEVELOPER_KEY | The provided developerKey is invalid or disabled |
ERROR_WRONG_TASK_TYPE | Wrong task type for this site (e.g., standard vs enterprise) |
ERROR_TIMEOUT | Task exceeded timeout |
ERROR_TASK_QUEUE_FULL | Server is at capacity — retry in a few seconds |
ERROR_TASK_TYPE_COMING_SOON | Task type is not yet available |
ERROR_TASK_TYPE_INACTIVE | Task type is currently disabled |
ERROR_WORKER_CRASHED | Solver process exited mid-solve — balance refunded, safe to retry |
ERROR_INTERNAL | Internal server error |
Best Practices
Tokens are short-lived
CaptchaFox tokens expire roughly 120 seconds after issuance. Submit the token immediately after receiving the solution.
-
Match the page URL - use the exact URL where the widget appears; the host determines challenge routing.
-
Submit the token unmodified - do not strip the
MAM_prefix or alter the hex token. -
Use a proxy for geo-sensitive sites - submit
CaptchaFoxTaskwith your own proxy when the target binds sessions to a region.