AWS WAF Captcha Solver, solved in 5.0s.
Two protections, two task types: the silent Challenge (we return the aws-waf-token from just a URL) and the visible image-grid CAPTCHA (we classify the tiles, you keep your browser).
AWS WAF is Amazon's Web Application Firewall bot protection. It ships two distinct protections: • Challenge — a silent proof-of-work the browser runs invisibly. This is what most AWS WAF sites use. No visible puzzle; the page just needs a valid aws-waf-token. • CAPTCHA — a visible puzzle AWS escalates to for higher-risk sessions. The most common variant is an image grid ("select every tile with a chair"). We cover the Challenge end-to-end (AntiAwsWafTask*) and the image-grid CAPTCHA as a classification step (AwsWafClassification).
Quick Integration
The common case: a silent proof-of-work, no visible puzzle. Send just the websiteURL — we run the site's real challenge.js and return the aws-waf-token.
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": "AntiAwsWafTaskProxyLess",
"websiteURL": "https://example.com/protected-page"
}
}).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)
Using the result
The token is the aws-waf-token COOKIE value, not a header or form field. AWS resets that cookie on every response, so read the refreshed value from your responses as you go.
# Step 3 — AWS WAF: set the token as the aws-waf-token COOKIE (not a header/form field)
token = result["solution"]["token"]
session = requests.Session()
session.cookies.set("aws-waf-token", token, domain="target.example.com", path="/")
resp = session.get("https://target.example.com/")
# AWS rotates aws-waf-token on each response — keep reading the refreshed cookie
print(resp.status_code)1. Send Payload
Dispatch your AntiAwsWafTaskProxyLess to our processing cluster via the secure API endpoint.
2. Solving Engine
Challenge (AntiAwsWafTask*): we run the site's own challenge.js server-side and hand back the exact aws-waf-token AWS issues — correct by construction, so it keeps working when AWS rotates the script. You only need to send the websiteURL. Image grid (AwsWafClassification): send the tiles + the target label and we return the matching indices. You submit them in your own browser session.
3. Get Result
Poll getTaskResult for the validated token, then finalize your automated request.
Using your own proxy
Use AntiAwsWafTask instead of AntiAwsWafTaskProxyLess to route the solve through your own proxy — useful when the target site checks that the solving IP matches the submitting IP.
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": "AntiAwsWafTask",
"websiteURL": "https://example.com/protected-page",
"proxyType": "http",
"proxyAddress": "123.45.67.89",
"proxyPort": "8080",
"proxyLogin": "user",
"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)
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)userAgenttypestringreqnoUser-Agent string to use. Must match the UA you use when submitting the tokenTask Parameters
API SpectypetypestringreqyesAntiAwsWafTaskProxyLess or AntiAwsWafTask for the silent Challenge token flow; AwsWafClassification for the image-grid CAPTCHA.websiteURLtypestringreqyesChallenge flow (REQUIRED) — the URL of the page protected by AWS WAF. This is all we need: we discover the challenge.js and mint the aws-waf-token.awsChallengeJStypestringreqnoChallenge flow (optional, recommended for SPAs / hash-routed pages) — the full URL of the <script src="…challenge.js"> on the WAF interstitial. Provide it when the WAF page isn't in the first HTML response so we don't have to discover it.awsKeytypestringreqnoChallenge flow (optional) — window.gokuProps.key scraped from the WAF page. Pass together with awsIv + awsContext + awsChallengeJS to bind the token to that exact session (best fidelity on hardened sites).awsIvtypestringreqnoChallenge flow (optional) — window.gokuProps.iv (pair with awsKey).awsContexttypestringreqnoChallenge flow (optional) — window.gokuProps.context (pair with awsKey).imagestypestring[]reqnoAwsWafClassification only — array of base64-encoded grid tiles (typically 9), ordered top-left to bottom-right.questiontypestringreqnoAwsWafClassification only — the target label, e.g. "aws:grid:chair", "aws:grid:bag", "aws:grid:spoon".Response Shape
tokentypestringChallenge flow — the aws-waf-token value. Replay it as the aws-waf-token cookie (or header) on requests to the protected site.objectstypenumber[]Classification — 0-based indices of the tiles that matched the target label.scorestypenumber[]Classification — per-tile confidence, parallel to your input order.Example response
{
"errorId": 0,
"status": "ready",
"solution": {
"token": "d6975ede-…:EQoA…:<signed aws-waf-token bound to the AWS WAF challenge>",
"objects": [
0,
4,
7
],
"scores": [
0.93,
0.04,
0.01,
0.02,
0.88,
0.11,
0.06,
0.91,
0.05
]
}
}Error response
{
"errorId": 1,
"errorCode": "ERROR_CAPTCHA_UNSOLVABLE",
"errorDescription": "Solver gave up."
}Features
Pricing & Stats
Start solving aws waf captcha.
$0.10 in free credits — no card. ~250 free solves to test before you spend.