Back to blog

How to Bypass CAPTCHAs: The Ultimate Guide 2026

Share article:

CAPTCHAs love to show up right when your scraper's getting somewhere. They exist to sort humans from bots, and if you're seeing them constantly, it's usually triggered by a mix of strict website security policies and a drop in your IP's trust score. That's why CAPTCHA bypass only works long-term if you treat it as a trust fix, not a workaround.

A circle with a diagonal line, surrounded by a second circle that overlaps the top of a mouse pointer, all within an incomplete outer circle with three connecting lines.

TL;DR

  • Avoiding a CAPTCHA is always cheaper than solving one, so the real goal is stopping it from triggering in the first place, not getting faster at clicking through.
  • Sites show CATPCHAs because your IP or request pattern looks suspicious, so it’s really just a visible sign of an IP trust problem underneath.
  • Residential and rotating proxies spread your requests across real device IPs to make you look like ordinary traffic instead of a suspicious source hammering the site.
  • Headers, TLS handshakes, and browser fingerprints need to match. If your request looks like a real browser on the surface but fails these deeper checks, sites tend to flag it anyway.
  • Headless browsers like Playwright or Puppeteer help you act human as they can mimic mouse movement, scrolling, and click timing.
  • CAPTCHA-solving services are useful when a challenge still slips through, but relying on them alone tends to be slower and pricier than fixing the trust issue upstream.
  • Managed tools like Decodo's Web Scraping API and Site Unblocker bundle proxy rotation, fingerprinting, and JavaScript rendering, so you're paying for the outcome rather than managing each piece yourself.

Why do web scrapers trigger CAPTCHAs?

By the time a site renders, it has already scored your request against several signals, and the CAPTCHA only shows up once that score drops low enough. That's why fixing the problem in the signals that got you flagged is the way to go.

Here's what most detection systems check before deciding whether to serve a challenge:

  • IP reputation. Datacenter IPs, shared proxies, and addresses with a history of abuse tend to carry a lower trust score, so requests from them get flagged more often, even if the request itself looks fine.
  • TLS/HTTP fingerprint. Your TLS handshake and HTTP request structure leave a signature, known as a fingerprint, and if that signature doesn't match a real browser, sites notice it fast.
  • Header coherence. Browsers send headers in a fairly consistent order and combination, so mismatched or missing headers, like a user agent that doesn't match the rest of the request, are an easy tell.
  • JS/browser environment. Many sites run a quick script to check for things a real browser environment would have, so a scraper without a proper JS engine or with obvious automation markers usually stands out.
  • Session age and cookies. Brand-new sessions with no cookie history look different from returning users, so a lack of session continuity can raise suspicion on its own.
  • Request rate and behavior. Unusually fast, repetitive, or perfectly timed requests don't look human, so sites watch for patterns like these on top of everything above.

Once enough of these signals land in the suspicious range, the CAPTCHA shows up as the visible result. Instead of treating the CAPTCHA as the obstacle, consider it feedback.

What are the different types of CAPTCHAs in web pages?

Most scrapers today run into a small handful of anti-bot systems, so it helps to know what each one is actually checking for.

  • reCAPTCHA. Google’s reCAPTCHA has 2 major versions in use. v2 demands visible interaction from users by providing a checkbox or image grid to solve, while v3 runs in the background, assigning your traffic a score without any puzzles to solve. Read our Google CAPTCHAs blog post for a detailed rundown.
  • hCaptcha. It works similarly to reCAPTCHA v2, but tends to trigger image grid challenges more readily. You'll likely see it more often if your traffic looks even slightly off.
  • Cloudflare Turnstile. Like reCAPTCHA v3, Cloudflare’s Turnstile is score-first and generally invisible, grading your request in the background and deciding if you’re in or not.

You'll also come across proof-of-work challenges, such as Friendly Captcha, which don't test human behavior at all. Instead, they force your browser to run a small computational task, so scrapers without a real browser environment tend to fail or slow down right there.

Older styles, like image, text, audio, or math-based challenges, still show up occasionally, but they're becoming less common as sites shift toward behavioral and score-based systems instead.

Avoid any kind of CAPTCHA

Simplify how you collect data with Web Scraping API. Backed by 125M+ IPs across 195+ locations and 99.99% success rates.

Should you avoid CAPTCHAs or solve them?

Avoiding vs. solving depends on what's triggering the challenge and how often you're seeing it. It helps to think of this as 3 different situations rather than one universal rule:

  • Prevent by default. If you're dealing with score-based systems like reCAPTCHA v3 or Cloudflare Turnstile, prevention is the more practical option. This is also the right call for low-medium volume scraping, since you're not hitting enough requests to justify extra tooling, and it works best when you control the client (your own headless browser or HTTP setup), because that's exactly where the trust signals get set in the first place.
  • Solve as a fallback. Some setups are built to always show a challenge, no matter how clean your traffic looks, so prevention alone won't get you past them. Mandatory verification gates work this way, and so do a handful of high-value pages that sites tend to lock down harder than the rest of the site. In those cases, solving becomes the main plan.
  • Reach for a managed tool. At some point, the upkeep of maintaining proxies, fingerprints, and browser configurations starts costing more time and money than it actually saves. That's usually the signal to hand the problem off to a managed solution instead of maintaining the stack yourself.

Keep in mind that most scraping setups end up using all 3 at different points, depending on what they're up against that day.

How to avoid CAPTCHAs when scraping

Since prevention is the cheaper and more reliable way in many cases, it's worth understanding what actually goes into it:

  • Pace and randomize your requests. Sending requests at a constant, predictable rate is one of the fastest ways to get flagged, so spacing them out with some randomness makes your traffic look a lot more like a normal user browsing.
  • Fix your HTTP headers and TLS fingerprint. Mismatched or incomplete headers are an easy tell, so it's worth checking that your user agent actually matches the rest of your request. The same goes for your JA3 fingerprint, which comes from your TLS handshake and can give you away even when your headers look fine. If you want to see how this plays out in practice, our blog on sending headers with cURL is a good place to start.
  • Manage your IP reputation. This usually comes down to using rotating residential proxies rather than datacenter IPs, since that's what keeps your requests looking like they're coming from real devices.
  • Make headless browsers look human. Tools like Playwright and Selenium will get you most of the way there. For tougher setups, projects like BotBrowser patch over the automation markers that headless browsers tend to leave behind, and you can check out our blog post on how to bypass CreepJS to test how exposed a browser setup is.
  • Preserve your sessions and cookies. A brand new session with no cookie history looks different from a returning user, so holding onto session state across requests removes one more reason to get flagged.

How to solve CAPTCHAs when avoidance fails

When a challenge shows up anyway, your only other choice is to use a solver service. The general flow looks like this:

  1. Extract the sitekey from the page
  2. Submit it to a solver like 2Captcha
  3. Poll for the result
  4. Inject the returned token into the right field (e.g. g-recaptcha-responseh-captcha-response, or cf-turnstile-response)
  5. Submit the form before the token expires (usually around 2 minutes)

So, if push comes to shove, set up a solver using Puppeteer.

Note that tokens get rejected often, and it's usually because the token was solved on a different IP or session than the one submitting it or the token simply expired before it got submitted.

Why isn't your CAPTCHA bypass working?

When nothing seems to work, it's rarely just one thing. So, it's worth troubleshooting layer by layer instead of guessing at a single fix.

Start by checking your IP reputation. If that’s not the case, work through your headers, fingerprints, browser environment, and session handling to see if there are any inconsistencies or hiccups in the setup.

And if you're still stuck, it helps to understand what you're actually up against. Run through our blog to learn pro tips on bypassing anti-bot systems and check out our go-to guide on avoiding blocks while scraping.

How can rotating proxies help to overcome CAPTCHAs?

Most CAPTCHA problems start with your IP, since that's the first thing a site reads before anything else. So, managing your IP reputation is the foundation to build your scraper on.

IP reputation and rotation

Not all IPs carry the same trust, so it helps to think of them in a rough hierarchy:

  1. Mobile IPs tend to score highest, since they're shared across huge numbers of real devices on carrier networks, and it's practically impossible for a site to block one without also blocking a large chunk of legitimate mobile users.
  2. Residential IPs come next, since they're tied to real home internet connections, so they still look like ordinary user traffic even though they're not shared at the same scale as mobile networks.
  3. ISP IPs sit between residential and datacenter, since they're datacenter-hosted but registered under an ISP, so they carry an ISP's residential legitimacy without losing the speed and stability of datacenter infrastructure.
  4. Datacenter IPs sit at the bottom, and that's not because they're inherently worse technically. They simply come from known hosting ranges that plenty of bots and scrapers use too, so sites tend to treat the entire range with suspicion regardless of what any single IP on it is actually doing.

Rotating proxies help here, but rotation on its own isn't a fix. If you're rotating IPs without pacing your requests, you'll still trip rate limits, since a lot of detection systems are watching request volume and timing patterns across a session or fingerprint.

If you're working through a multi-page session, like paginated results or a multi-step checkout, it's best to pin one IP for that entire session. Sudden IP jumps partway through look more suspicious than one that stays consistent. Rotation is meant to happen between sessions, not within one.

How to bypass CAPTCHAs with an all-in-one solution?

Prevention and solving both take ongoing work, since proxies, stealth browsers, and solver integrations all need maintaining as detection methods change. Once you're operating at scale, or you don't have the DevOps capacity to keep that stack running yourself, handing the problem to a managed tool usually works out cheaper than maintaining it in-house.

Decodo offers 2 solutions. The first is Web Scraping API, which is built for structured data collection at scale, so it fits better when you're constantly pulling data from many pages. The second is Site Unblocker, a tool for unblocking specific targets.

How to set up Site Unblocker?

1. Install the prerequisites

Install the Requests library, which sends HTTP requests to the target website. You'll also want Beautiful Soup to parse the scraped data into a clean format. Both install through pip, which comes bundled with Python.

Run this in your terminal:

pip install requests beautifulsoup4

2. Choose a target website

For the sake of safety and simplicity with this example, we'll use https://quotes.toscrape.com/, a sandbox site built for scraping practice. We'll pull quotes from the first page and print them to the terminal.

3. Write the script

Start by importing the 2 libraries.

import requests
from bs4 import BeautifulSoup

Then set up the target site and your proxy credentials, which you'll find in your dashboard.

website = "https://quotes.toscrape.com/"
proxies = {
'http': 'http://{username}:{password}@unblock.decodo.com:60000',
'https': 'http://{username}:{password}@unblock.decodo.com:60000'
}

4. Send a request to the target

Make a GET request through Site Unblocker.

response = requests.request(
'GET',
website,
verify=False,
proxies=proxies,
)

Keep verify=False in there, since Site Unblocker requires ignoring the SSL certificate.

5. Parse the desired data

Inspecting the page shows each quote sits inside a span with the class text, and nothing else on the page uses that class, so a single find_all call gets everything you need.

quotes = soup.find_all(class_="text")
for quote in quotes:
print(quote.text)

The full script looks like this:

import requests
from bs4 import BeautifulSoup
website = "https://quotes.toscrape.com/"
proxies = {
'http': 'http://{username}:{password}@unblock.decodo.com:60000',
'https': 'http://{username}:{password}@unblock.decodo.com:60000'
}
response = requests.request(
'GET',
website,
verify=False,
proxies=proxies,
)
soup = BeautifulSoup(response.content, "html.parser")
quotes = soup.find_all(class_="text")
for quote in quotes:
print(quote.text)

Running it should print something like:

"The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking."
"It is our choices, Harry, that show what we truly are, far more than our abilities."
"There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle."

Check the documentation for the full list of parameters and integration steps.

6. Final tuning

Once you have an active Site Unblocker subscription, you can send a request straight from the dashboard, under Playground in the Site Unblocker section, by entering a target URL and clicking Send request. You'll get a cURL example, a JSON response, and a live render of the page you targeted.

You can also set other parameters like custom cookies, location and language, and enable JavaScript rendering for when you need finer control over the request.

And if all of this setup feels like more than you want to manage, that's exactly what Web Scraping API is for. Instead of writing the proxy handling, request logic, and parsing yourself, you send it a target and get structured data back, so the maintenance work you'd otherwise own shifts onto Decodo instead.

Conclusion

If there's one thing worth taking away from all of this, it's that prevention beats solving. That's because the CAPTCHA itself is just the downstream result of a score you've already been given. By the time a challenge actually shows up, the site's already looked at your request and everything tied to it. So if you get those right, you won’t get stopped.

Solvers still have their place, but think of them as a fallback for the setups that are going to show a challenge no matter what you do, That said, every wall you run into looks a bit different, so if you're dealing with something specific, like Cloudflare or Google, it's worth checking the target-specific guides linked throughout this piece since they'll get into what that particular fight actually takes.

Get Web Scraping API

Plug our Web Scraping API straight into your data workflows to scale your projects in the most efficient way. 125M+ IPs from 195+ locations with 99.99% success rates.

Share article:

About the author

Robertas Lisickis

Content Specialist

Robertas brings 10+ years of IT content experience to the table. Here, he focuses on creating tutorials and educational pieces that make technical concepts easier to grasp.

Connect with Robertas via LinkedIn.

All information on Decodo Blog is provided on an as is basis and for informational purposes only. We make no representation and disclaim all liability with respect to your use of any information contained on Decodo Blog or any third-party websites that may belinked therein.

Frequently asked questions

Can I bypass CAPTCHA?

Yes, but prevention should come first. Since a CAPTCHA only shows up once your traffic scores as suspicious, the best fix is addressing what triggered it, like your IP reputation, headers, fingerprint, or session setup. If prevention isn't enough, tools like Site Unblocker can handle the unblocking process for you so you're not building and maintaining that stack yourself.

What's the difference between avoiding and solving a CAPTCHA?

Avoiding a CAPTCHA means your traffic never triggers one in the first place. Solving a CAPTCHA means a challenge has already appeared, and you're completing it (or using a service to do so) to get through. Avoidance tends to be more reliable and cheaper at scale, while solving works better as a fallback for the systems that show a challenge no matter what.

Do you need residential proxies to bypass CAPTCHAs?

You don't necessarily have to use residential proxies. While residential proxies are a strong option for avoiding CAPTCHAs, mobile or ISP proxies can be even stronger depending on your target and setup.

How do I handle CAPTCHAs in a Python scraper?

It comes down to a combination of pacing your requests, keeping your headers and TLS fingerprint consistent, managing IP reputation, and using a headless browser that behaves like a real one. Libraries like Playwright can simulate mouse movement and scrolling to help pass behavioral checks, and if a challenge still gets through, a solver service can handle it as a fallback.

Can reCAPTCHA be bypassed?

Yes. reCAPTCHA v2 still shows a visible challenge, so solver services exist as a fallback when prevention doesn't work. reCAPTCHA v3 is trickier to solve, but can still be tackled by a solver. The drawback is that it introduces latency, complexity, and extra costs that scale poorly with high-volume operations. So, prevention should always be the first course of action.

Is it legal to bypass CAPTCHAs when scraping?

The legality of scraping depends. In a nutshell, you can collect publicly available data, but you have to make sure your automations respect the target’s terms of service and applicable laws. When in doubt, talk to a legal professional.

© 2018-2026 decodo.com (formerly smartproxy.com). All Rights Reserved