What is Friendly Captcha?
Friendly Captcha is a GDPR-friendly, privacy-first CAPTCHA widely deployed across EU websites — banks, government portals, e-commerce — as a non-tracking alternative to Google reCAPTCHA. The visitor's browser solves a proof-of-work puzzle invisibly in the background while they fill in a form, and the resulting solution token is submitted alongside. Two versions ship in production: v1 (the legacy `friendly-challenge` widget loaded from jsDelivr) and v2 (the `global.frcapi.com` API). Both produce a long alphanumeric token bound to the sitekey but not to the visitor's IP.
How It Works
Send Task
POST your FriendlyCaptchaTaskProxyLess with the target URL and sitekey to our API. We'll queue it instantly.
We Solve
Capzy auto-detects whether the target uses v1 or v2 and runs the matching widget on our infrastructure with the sitekey you provide. We wait for the PoW to complete naturally and harvest the resulting solution token. No user interaction simulated — the puzzle solves the same way it does for a real visitor, so the resulting token is indistinguishable from a legitimate submission.
Get Token
Poll getTaskResult — when status is 'ready', the solution contains the token to inject into the target page.
Quick Integration
import requests, time
API = "https://api.capzy.ai"
KEY = "capzy_your_key_here"
# Step 1: Create task
task = requests.post(f"{API}/createTask", json={
"clientKey": KEY,
"task": {
"type": "FriendlyCaptchaTaskProxyLess",
"type": "FriendlyCaptchaTaskProxyLess",
"websiteKey": "FCMS01ABCDEF...",
"websiteURL": "https://example.com/contact"
}
}).json()
task_id = task["taskId"]
print(f"Task created: {task_id}")
# Step 2: Poll for result
while True:
result = requests.post(f"{API}/getTaskResult", json={
"clientKey": KEY,
"taskId": task_id
}).json()
if result["status"] == "ready":
print("Solved!", result["solution"])
break
elif result["status"] == "failed":
print("Failed:", result.get("errorDescription"))
break
time.sleep(1)
# Step 3: Use the result — paste the token into the site's captcha form field
token = result["solution"]["token"]
# Browser side: set the textarea value or the hidden input. Then submit.
# Server-to-server: post the token alongside the form fields you normally send.
resp = requests.post("https://target.example.com/submit", data={
"username": "...",
"captcha_response": token, # <-- replace with the field name your site uses
})
print(resp.status_code)Using Your Own Proxy
Use FriendlyCaptchaTask instead of FriendlyCaptchaTaskProxyLess to route the solve through your own proxy. This is useful when the target site checks the IP that solved the captcha matches the IP submitting the form.
import requests, time
API = "https://api.capzy.ai"
KEY = "capzy_your_key_here"
# Step 1: Create task
task = requests.post(f"{API}/createTask", json={
"clientKey": KEY,
"task": {
"type": "FriendlyCaptchaTask",
"type": "FriendlyCaptchaTask",
"proxyPort": "8080",
"proxyType": "http",
"proxyLogin": "user",
"websiteKey": "FCMS01ABCDEF...",
"websiteURL": "https://example.com/contact",
"proxyAddress": "123.45.67.89",
"proxyPassword": "pass"
}
}).json()
task_id = task["taskId"]
print(f"Task created: {task_id}")
# Step 2: Poll for result
while True:
result = requests.post(f"{API}/getTaskResult", json={
"clientKey": KEY,
"taskId": task_id
}).json()
if result["status"] == "ready":
print("Solved!", result["solution"])
break
elif result["status"] == "failed":
print("Failed:", result.get("errorDescription"))
break
time.sleep(1)
# Step 3: Use the result — paste the token into the site's captcha form field
token = result["solution"]["token"]
# Browser side: set the textarea value or the hidden input. Then submit.
# Server-to-server: post the token alongside the form fields you normally send.
resp = requests.post("https://target.example.com/submit", data={
"username": "...",
"captcha_response": token, # <-- replace with the field name your site uses
})
print(resp.status_code)additional proxy parameters
proxyTypetypestringreqyesProxy protocol: http, https, socks4, or socks5proxyAddresstypestringreqyesProxy IP address or hostnameproxyPorttypenumberreqyesProxy port numberproxyLogintypestringreqnoProxy username (if auth required)proxyPasswordtypestringreqnoProxy password (if auth required)task parameters.
typetypestringreqyesFriendlyCaptchaTaskProxyLess (recommended) or FriendlyCaptchaTaskwebsiteURLtypestringreqyesFull URL of the page hosting the Friendly Captcha widgetwebsiteKeytypestringreqyesThe Friendly Captcha sitekey — read it from the widget's data-sitekey attributesolution response.
tokentypestringThe solution token — drop it into the `frc-captcha-solution` form input or POST it directly to your site's verify endpointExample response
Full getTaskResult response shape. The fields in the table above describe what's inside solution — the outer envelope (errorId, status) is identical for every captcha type.
{
"errorId": 0,
"status": "ready",
"solution": {
"token": ".UMNS4ABCDEFGHIJ0123456789abcdefghij.AaBbCcDd1122334455667788.ZyXwVuTsRqPoNmLkJiHgFeDcBa9876543210"
}
}Error response
Failures use the same envelope with errorId: 1 plus errorCode + errorDescription. See the error-code reference for the full list.
{
"errorId": 1,
"errorCode": "ERROR_CAPTCHA_UNSOLVABLE",
"errorDescription": "Solver gave up — automatically refunded."
}Pending response
While the solver is still working, getTaskResult returns status: "processing". Poll every 1–2 seconds until ready or failed.
{
"errorId": 0,
"status": "processing"
}Features
ProxyLess Task Type
FriendlyCaptchaTaskProxyLessWith Proxy
FriendlyCaptchaTaskFrequently Asked Questions
start solving friendly captcha.
$0.10 in free credits — no card. ~250 free solves to test before you spend.