Web Unlocker · AWS WAF
How to bypass AWS WAF challenge and CAPTCHA pages
AWS WAF answers a scraper in three ways: a 202 with a silent challenge script, a 405 with a CAPTCHA puzzle, or a plain 403. The Web Unlocker sends the URL from a residential or mobile IP, lets a real browser run the challenge and collect the aws-waf-token, and returns the page in one JSON answer.
- 88.9%
- calls answered with the real page across 27 protected targets, AWS WAF among them, canary of 11 November 2026
- 81
- calls, 3 runs, default settings
- 4.1 s
- median response across the run
What an AWS WAF block looks like
AWS WAF is unusual in that the status code tells you exactly which action the rule took. One response header confirms it.
| Where to look | What an AWS WAF block shows |
|---|---|
| Status code | 202 for the silent challenge, 405 for the CAPTCHA, 403 when a rule blocks the request outright. |
| Response header | x-amzn-waf-action: challenge or x-amzn-waf-action: captcha names the action that was taken. |
| Challenge page | A page that looks empty, with a script from a host ending in awswaf.com. In a browser it reloads by itself. |
| CAPTCHA page | "Let's confirm you are human", with a puzzle to solve and an audio option. |
| Block page | A bare "403 Forbidden", or the CloudFront page "The request could not be satisfied. Request blocked." |
| Cookie | aws-waf-token. The site accepts requests that carry a valid token that has not expired. |
Why AWS WAF blocks a scraper
AWS WAF is a rule engine. The owner of the site chooses which rule groups run and what each one does: count, block, challenge or CAPTCHA. The Bot Control group is the one that looks for scrapers.
- Common bots: requests are matched on the
User-Agent, on the IP ranges of hosting providers and on the signatures of known libraries. A match is blocked with 403. - Targeted bots: Bot Control follows each client through a token and scores its behaviour: the request rate, how the session moves, signs of automation in the browser.
- Challenge: a script runs silently in the browser, proves that it is one and stores the
aws-waf-token. An HTTP client cannot run it and stays on 202. - CAPTCHA: when the rule asks for a person, the puzzle page comes with 405, and passing it renews the token.
- The token expires after a few minutes by default, so a scraper that gets through once is asked again soon.
Get the page behind AWS WAF with one call
Send the URL to the REST endpoint. With mode: "auto", the default, the first attempt is a browser-grade request from a residential IP. When AWS WAF answers 202, a real browser opens the page, runs the challenge, and returns the page that loads after it.
curl -X POST https://app.quanticdata.io/api/v1/scraper/unlock \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/", "country": "us"}'
A 405 on an AWS WAF site is the CAPTCHA action, not a wrong method: changing the method does not help. Keep calling from the same account so that the session is reused while its token is valid.
What the answer tells you
| Field | What it says |
|---|---|
blocked | false when the real page came back. true only when every attempt met the block; the block page is then in body. |
vendor | The system the engine recognised on a blocked attempt. For this guide: awswaf. |
blockClass | Usually js_challenge for the silent challenge, captcha for the puzzle and access_denied for a block rule. |
tier_served | tls for a browser-grade request, browser when a real browser had to open the page. |
attempts, latency_ms | How many tries the call took and how long it lasted. |
cost | The bytes this call moved and what it was charged. |
Measured, with a date
The canary of 11 November 2026 runs a fixed list of 27 protected targets, AWS WAF sites among them: 72 of 81 calls came back with the real page, with a median response of 4.1 s.
The first request to a protected site waits for the site's own check. The next ones from the same account reuse the session: in our test of 11 November 2026, four requests in a row to the same AWS WAF-protected page took 6.6 s, 1.8 s, 4.3 s and 1.8 s.
A call counts only when the answer is 2xx and carries the real page, not a challenge. The list, the method and every run are on the Web Unlocker status page.
Your own scraper or the Web Unlocker
Getting past AWS WAF once is an afternoon. Staying past it every week is the work. This is what has to stay right, and who keeps it right.
| What has to be right | With your own scraper | With the Web Unlocker |
|---|---|---|
| The IP address | You rent residential or mobile IPs and rotate them yourself. | Residential (Premium) or mobile exits, chosen by country, state and city. |
| The browser identity | Handshake, HTTP/2 settings and headers must describe one browser, and be updated with every browser release. | A browser-grade request on the first attempt, kept current for you. |
| The JavaScript check | You run real browsers for the pages that need one, and keep them from looking automated. | A real browser opens the page only when the site asks for one. |
| After a pass | You keep the aws-waf-token and run the challenge again each time it expires. | The session is reused for your next calls to that site. |
| When a call still fails | You recognise the AWS WAF block page yourself and decide what to retry. | Retries on a fresh exit. The answer says blocked, blockClass and vendor. |
What it is for, and what it does not do
- It is for pages anyone can open in a browser without signing in: prices, listings, reviews, search results, public profiles.
- Challenges that need no human input are handled by the browser tier. An interactive captcha that asks a person to click, pick images or type is not solved: the answer comes back with
blocked: trueandblockClass: "captcha", so your code can skip the page or try later. - It does not log in for you and it does not create accounts. Pages behind a login stay behind it.
- Whether you may collect a page depends on the terms of the site and on the law that covers the data. A protection system does not change that, in either direction.
AWS WAF and scraping: questions people ask
Why does AWS WAF return 202 with an empty page?
That is the Challenge action. AWS WAF answers with status 202 and a script; a browser runs it without showing anything, receives a token in the aws-waf-token cookie and loads the page again. A client that cannot run JavaScript only ever sees the 202 and its almost empty body.
Why does AWS WAF return 405 Method Not Allowed?
On an AWS WAF site, a 405 with a puzzle page is the CAPTCHA action, not a wrong HTTP method. The header x-amzn-waf-action: captcha confirms it. The rule wants a person to solve the puzzle before it issues a token. Changing the method or the headers does not remove it.
What is the aws-waf-token cookie?
It is the proof that a client passed the challenge or the CAPTCHA. AWS WAF checks it on later requests and lets them through while the token is valid, a few minutes by default. Because it expires, a token copied from a browser into a script works briefly at best.
Does the Web Unlocker solve the AWS WAF CAPTCHA?
The silent challenge is run by the browser tier, which collects the token and returns the page. The CAPTCHA puzzle asks for a person and is not solved: the answer comes back with blocked: true and blockClass captcha, so your code can retry later or from another country.
Is the AWS WAF challenge paid on every call?
No. After the first call, your next calls to the same site reuse the session while its token is valid. In our test of 11 November 2026, four calls in a row to the same AWS WAF-protected page took 6.6, 1.8, 4.3 and 1.8 seconds.
Is it legal to scrape a site protected by AWS WAF?
The protection system does not decide that. What matters is the page and the data: whether the page is public, what the terms of the site say, and which law covers the data, personal data above all. The Web Unlocker fetches pages anyone can open without signing in; it does not log in and it does not create accounts.
Send the URL that AWS WAF blocks
Create the free account, open Web Unlocker in the dashboard and paste the URL into the test box. The answer shows the status, the tier that served the page, the attempts and the cost of the call.
References
- AWS WAF developer guide: CAPTCHA and Challenge action behavior (status 405 and 202, the x-amzn-waf-action header)
- AWS WAF developer guide: token characteristics (the aws-waf-token cookie)
- AWS WAF developer guide: Bot Control
- Web Unlocker in the QuanticData API docs: request, answer, errors and blocked pages
- Web Unlocker status: the canary list, the method and every run