Documentation Python quickstart Blog Free tools Enterprise solutions hello@quanticdata.ioLog in

Web Unlocker · CAPTCHAs

CAPTCHA when web scraping: why you get one, and how not to

A CAPTCHA is what a site serves when it does not trust a request. A scraper gets one for its address, client, pace or missing session, so the way through is not to be served one. The Web Unlocker sends each request from a residential or mobile IP with a browser-grade client, and retries on a fresh exit.

88.9%
calls answered with the real page across 27 protected targets, canary of 11 November 2026
81
calls, 3 runs, default settings
4.1 s
median response across the run

Which captcha is which

These are the checks a scraper meets most often. Some are widgets a site adds to a form; others belong to a protection system in front of the whole site. They are triggered by different things.

CAPTCHAWhat it looks likeWho shows itWhat triggers itExplained on
reCAPTCHA v2A box labelled "I'm not a robot". Its invisible form has no box and runs when a button on the page is clicked.Google, on a form or a page where the site put it.Google's judgement of the visitor. A tick passes at once or is followed by a challenge; in the invisible form, by default only the most suspicious traffic is challenged.This page
reCAPTCHA v3Nothing. It never interrupts the visitor.Google, on sites that score every interaction.It returns a score for each request, and the site decides what to do with a low one: ask for more proof, moderate, or throttle.This page
hCaptchaA box to tick inside a form, then a task such as picking the images that match. An invisible mode shows no box.hCaptcha, where the site put the widget.The confidence that the visitor is human and the difficulty the site chose. Failing one brings another.This page
Cloudflare Turnstile"Verify you are human" with a box, a spinner, or nothing at all. No images or text to decipher.Cloudflare, inside its challenge pages and as a widget on any site's forms.What it reads in the browser: a tick is asked only when a further check is needed.Cloudflare Turnstile
DataDome sliderA slider puzzle to drag, behind the sentence "Please enable JS and disable any ad blocker".DataDome, in front of the whole site.A request it scored as automated, when its device check alone was not enough to decide."Please enable JS and disable any ad blocker"
AWS WAF puzzle"Let's confirm you are human", a puzzle with an audio option, served with status 405.AWS WAF, on a rule the owner of the site set to CAPTCHA.A request that matched that rule without a valid aws-waf-token.AWS WAF guide
Press & HoldOne button: "Press & Hold to confirm you are a human".HUMAN Security, formerly PerimeterX, in front of the whole site.A session with a low score. The hold is a behaviour test, not a puzzle.Press and hold CAPTCHA
Why a scraper is served a CAPTCHA: first the four things a site judges in a request, the address, the client, the pace and the session, then a page that holds either a captcha box or the content, last a card that says what comes back: with little trust a captcha or a refusal, with enough trust the page with status 200, and the blocked and blockClass fields of the answer.
What a site judges in a request, and what it serves: a captcha, or the page.

If you are a visitor

In your own browser a captcha is the same judgement, made about you: something in the visit looked unusual. Solve it once and it normally goes away. When it returns on every page, the cause is nearly always one of a few.

  • Turn off the VPN or proxy. A shared address is the most common reason for repeated captchas.
  • Allow cookies for the site. The pass is stored in one, and without it every page asks again.
  • Pause extensions that block scripts, and use an up-to-date browser: a check that cannot run cannot pass.
  • Slow down. Many tabs or fast reloads look like a machine.
  • If a puzzle is hard to see or to use, look for its audio or accessibility option, or ask the site for another way in.

If your script gets it

A site does not show a captcha at random. It is the answer to doubt, and four things raise that doubt for a script. Lower them and the captcha is not served in the first place.

  • The address: requests from hosting ranges, or from an address that already sent a lot, are doubted first. A residential or mobile address starts from the trust of an ordinary visitor.
  • The client: an HTTP library does not connect like the browser it names, and an automated browser leaves marks. A client that is coherent with a real browser removes the most common trigger.
  • The pace: many requests in a short time from one identity look like a machine, whatever sent them. Fewer requests per address, and pauses between them, keep the count under the line.
  • The session: a visitor who passed a check carries a cookie that says so. A script that throws its cookies away is a stranger on every request, and is tested every time.
  • What does not help: a new User-Agent alone, or a token or a cookie taken from another machine.

Each system has its guide, and the block page dictionary tells them apart: Cloudflare, DataDome, Akamai Bot Manager, PerimeterX (HUMAN), Kasada, Imperva (Incapsula), F5 BIG-IP and Shape, AWS WAF.

Get the page with one call

Send the URL to the REST endpoint. The request leaves from a residential or mobile exit with a browser-grade client. When the site answers with a check that needs no person, a real browser opens the page and lets it clear. A blocked attempt is retried on a fresh exit, and after a pass the session is reused for your next calls to that site.

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"}'

When a captcha is still served, the answer says so: blocked: true, blockClass: "captcha", and in vendor the system or the widget, such as recaptcha or hcaptcha. Your code can skip the page or send it again later.

What the answer tells you

FieldWhat it says
blockedfalse when the real page came back. true only when every attempt met the block; the block page is then in body.
vendorThe system or the widget the engine recognised on a blocked attempt, such as recaptcha, hcaptcha, cloudflare, datadome, awswaf or perimeterx.
blockClasscaptcha when the page asks a person: a tick, a puzzle, a slider, press and hold. js_challenge for a check that a browser clears by itself.
tier_servedtls for a browser-grade request, browser when a real browser had to open the page.
attempts, latency_msHow many tries the call took and how long it lasted.
costThe 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, sites of the eight systems of the guides among them: 72 of 81 calls came back with the real page, with a median response of 4.1 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.

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: true and blockClass: "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.

CAPTCHA when scraping: questions people ask

Why do I get a CAPTCHA when web scraping?

Because the site, or the protection in front of it, did not trust the request. The usual reasons are an address from a hosting range, a client that does not look like a real browser, too many requests in a short time, or no session from an earlier visit. The captcha is the site asking for proof.

How do I avoid CAPTCHAs when scraping?

Remove the reasons for doubt before the request is sent: a residential or mobile address, a client that is coherent with a real browser, a pace a person could keep, and the cookies of a session that already passed. A request that looks ordinary is answered with the page, and no captcha is served.

Can I scrape a website that uses reCAPTCHA or hCaptcha?

Often yes, because the widget usually guards a form, not the pages. Public pages load without it. Where a site shows a captcha before the content, it does so when it doubts the request, so a trusted request gets the page. Read blocked in the Web Unlocker answer to know which case you met.

How does reCAPTCHA v3 affect a scraper?

reCAPTCHA v3 shows nothing. Per Google's documentation it returns a score for each request, and the site chooses what to do with a low one: ask for more proof, moderate, or throttle bots that may be scraping content. A scraper never sees a puzzle; it sees slower or refused answers instead.

What is the difference between a CAPTCHA and a JavaScript challenge?

A JavaScript challenge is a check the browser passes by itself: a script runs, and the page follows with no click. A CAPTCHA asks a person to do something: tick, drag, hold, pick images. The Web Unlocker reports the first as blockClass js_challenge and the second as blockClass captcha.

What does the Web Unlocker return when a CAPTCHA is served?

The same JSON as for a page, with blocked: true, blockClass captcha and the system or the widget in vendor, such as recaptcha or hcaptcha. The body carries the page that was served. The call was already retried on a fresh exit, so your code can skip the page or send it again later.

Is it legal to scrape a site that shows a CAPTCHA?

The captcha 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.