Skip to content
capzy
AWS WAF Captcha
AntiAwsWafTaskProxyLess

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).

Avg Speed~5.0s
Success99%+
Cost / 1k$2.00
Throughput12/m

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.

solve.py
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.

use_result.py
# 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.

solve_proxy.py
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 socks5
proxyAddresstypestringreqyesProxy IP address or hostname
proxyPorttypenumberreqyesProxy port number
proxyLogintypestringreqnoProxy username (if auth required)
proxyPasswordtypestringreqnoProxy password (if auth required)
userAgenttypestringreqnoUser-Agent string to use. Must match the UA you use when submitting the token

Task Parameters

API Spec
typetypestringreqyesAntiAwsWafTaskProxyLess 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

Silent Challenge solved from just a website URL
Runs the site's real challenge.js — correct even as AWS rotates it
Returns the exact aws-waf-token AWS issues (~2s typical)
Image-grid CAPTCHA classification: fast, no proxy bandwidth charged
Covers all standard AWS WAF grid labels (chair, bag, spoon, …)

Pricing & Stats

Per 1,000 solves$2.00
Avg solve time~5.0s
Success rate99%+
Throughput12/m

Start solving aws waf captcha.

$0.10 in free credits — no card. ~250 free solves to test before you spend.

Frequently asked questions