How To Bypass Cloudflare When Web Scraping (2026)

With an estimated 40% of websites using Cloudflare's CDN, learning how to bypass Cloudflare when web scraping has become essential for developers targeting popular retail, job-board, and finance sites.
Luckily, bypassing Cloudflare's anti-bot protection is possible — but it is not one-size-fits-all. Approaches range from managed smart proxies (fastest to ship) to TLS impersonation, browser APIs, and full reverse engineering.
Quick reference: 8 ways to bypass Cloudflare
| # | Method | Best for | Difficulty | Benchmark coverage |
|---|---|---|---|---|
| 1 | Smart proxy API | Production scraping at scale | Easy | 100% of test domains |
| 2 | TLS impersonation (curl_cffi) | High-volume HTTP when TLS is the main signal | Easy | 80% |
| 3 | Paid browser APIs | Heavy JS interaction | Easy | ~60%+ combined |
| 4 | Cloudflare solvers (FlareSolverr) | Self-hosted JS challenge solving | Medium | ~55% |
| 5 | Fortified headless browsers | Open-source DIY stacks | Medium | ~35% |
| 6 | Cached snapshots | Stale data is acceptable | Easy | ~10% |
| 7 | Origin server bypass | Rare misconfigs only | Easy | 0% in our tests |
| 8 | Reverse engineering | Custom infra teams | Expert | Not benchmarked |
Use the table to pick a starting point, then read the detailed sections below for code, costs, and when each method breaks down.
TLDR: Options To Bypass Cloudflare
We tested all the 8 bypassing options against the 20 Cloudflare protected test domains to see which ones actually work.
Smart proxy APIs ranked first because they trade some cost for good performance and reliability. You pay for vendor-maintained Cloudflare bypasses instead of owning detection cat-and-mouse yourself.
- Coverage: On our 20-domain benchmark, every site had at least one integrated smart-proxy provider that met our qualifying tiers (80% success rate and 15 seconds average success latency).
- Success & speed: Winning plans averaged about ~97% success and ~5.6s average success latency in the aggregate run—stronger and more consistent than DIY stacks in our tests.
- Operations: Difficulty stays low (standard HTTP client + API key), you are not patching headless browsers or solvers on every target change.
- Support & updates: Providers iterate on bypasses as Cloudflare changes, you benefit from that without reverse-engineering challenges yourself.
Test Results Overview
Below is a summary of the test results for each option. Expand a card to see a short summary plus the same results tables as in the detailed section (scroll horizontally on small screens). Use View Bypass Details to jump to the full section for context and how-tos.
What Is Cloudflare?
Cloudflare is a web infrastructure company that provides Content Delivery Network (CDN) services, DDoS mitigation, and security features to websites.
With over 40% of websites using their services, Cloudflare sits between users and website servers, acting as a reverse proxy that filters all incoming traffic.
Why Do Websites Use Cloudflare?
Website owners deploy Cloudflare for several key reasons:
- DDoS Protection: Cloudflare absorbs and mitigates distributed denial-of-service attacks that could otherwise crash websites.
- Performance Optimization: By caching content across their global network of data centers, Cloudflare reduces load times for users worldwide.
- Bot Protection: Cloudflare's Bot Manager identifies and blocks malicious bots while allowing legitimate traffic (like search engine crawlers) through.
- Security: Features like Web Application Firewall (WAF), SSL/TLS encryption, and rate limiting protect sites from various attack vectors.
- Cost Reduction: By blocking unwanted bot traffic, websites reduce server costs and bandwidth usage.
How Does Cloudflare Detect Bots?
Cloudflare uses a multi-layered approach to identify and block automated traffic:
-
IP Reputation Analysis: Cloudflare maintains databases of known bot networks, VPNs, and suspicious IP addresses. IP addresses with poor reputation scores are more likely to be challenged or blocked.
-
TLS/HTTP Fingerprinting: Every browser and HTTP client creates unique fingerprints based on how they establish TLS connections and send HTTP requests. Cloudflare compares these fingerprints against known browser patterns.
-
Browser Fingerprinting: JavaScript challenges run in the browser to check for headless browser indicators, automation tools (like Selenium), and inconsistencies in browser APIs.
-
Behavioral Analysis: Cloudflare tracks mouse movements, click patterns, and page interactions. Non-human behavior patterns trigger additional challenges.
-
Challenge Pages: When suspicious activity is detected, Cloudflare serves its "Checking your browser" page, which runs JavaScript challenges in the background to verify the visitor is human.
-
CAPTCHAs: For high-risk traffic, Cloudflare may require users to solve hCaptcha challenges that automated systems struggle to complete.
Understanding these detection mechanisms is essential for bypassing Cloudflare, as each method we'll cover targets different aspects of their protection system.
How We Tested Cloudflare Bypassing Techniques
We evaluated each bypass approach against real Cloudflare-protected sites rather than synthetic test pages. Unless a section notes otherwise, the same 20-domain benchmark set was used:
| Category | Domains |
|---|---|
| Job boards | indeed.com, glassdoor.com |
| Real estate | zillow.com, realtor.com, redfin.com |
| Retail & apparel | nike.com, adidas.com, bestbuy.com, wayfair.com, etsy.com, newegg.com, skechers.com, sneakersnstuff.com |
| Crypto & finance | coinmarketcap.com, coingecko.com, investing.com, etf.com |
| Regional retail | mediamarkt.de, pccomponentes.com |
| Equipment listings | controller.com |
These domains span common Cloudflare configurations so coverage numbers in this guide reflect mixed protection levels, not a single easy or hard target.
We used two testing methodologies depending on how much data the approach needs to compare fairly:
-
Full performance tests: For Smart Proxy API & Stealth Browser API approaches, we routed through the ScrapeOps Proxy Aggregator, recorded success rate, average success latency, and estimated plan cost at 100k pages (picking the cheapest qualifying plan where success stayed at least 80% and average success latency stayed under 15 seconds).
-
Per-domain pass/fail (spot checks): For DIY and single-tool approaches, we sent 10 requests per domain on the benchmark set, checked each response against the expected successful page content, and marked the method as working for that domain only if more than 80% of those requests succeeded.
The table below summarizes which methodology we applied to each bypass category in this guide.
| Bypass method | Testing methodology |
|---|---|
| Smart proxy with Cloudflare built-in bypass (ScrapeOps Proxy Aggregator) | Full performance tests (100k pages per domain: success rate, avg. success latency, plan cost at 100k pages) |
| TLS impersonation (curl_cffi) | Per-domain pass/fail |
| Paid stealth browser APIs (Bright Data, ZenRows, Scrapeless) | Per-domain pass/fail |
| Cloudflare solvers (FlareSolverr) | Per-domain pass/fail |
| Fortified headless browsers (Undetected ChromeDriver, Patchright, Puppeteer Extra + Stealth) | Per-domain pass/fail |
| Cached versions (Wayback Machine) | Per-domain pass/fail |
| Origin server bypass | Per-domain pass/fail |
| Reverse engineering | Not benchmarked, implementations are one-offs and not comparable in a standardized run |
How To Bypass Cloudflare: Smart Proxy With Cloudflare Built-In Bypass
Option #1: Smart Proxy With Cloudflare Built-In Bypass
Use a smart or residential proxy that maintains private Cloudflare bypass logic on the provider side. You keep sending ordinary HTTP requests while they handle TLS fingerprinting, challenges, and session churn.
Most open source Cloudflare bypasses only have a couple months of shelf life before they stop working. Anti-bot companies like Cloudflare can analyze public bypass code and quickly patch the vulnerabilities they exploit.
Smart proxies take a different approach, they develop and maintain their own private Cloudflare bypasses that aren't visible to anti-bot companies. These are typically more reliable because:
- Private Implementation: Cloudflare can't easily analyze and patch what they can't see
- Financial Motivation: Proxy companies are financially incentivized to stay one step ahead of Cloudflare
- Rapid Response: Bypasses are fixed the minute they stop working, often within hours
- Dedicated Teams: Full-time engineers focused solely on anti-bot bypass development
Smart proxy providers handle all the complexity of TLS fingerprinting, JavaScript challenge solving, and session management—you just make simple HTTP requests.
To validate the effectiveness of smart proxy services for Cloudflare bypass, we tested the Proxy APIs available within the ScrapeOps Proxy Aggregator across the 20 Cloudflare protected test domains.
ScrapeOps Proxy Aggregator Results
The ScrapeOps Proxy Aggregator routes requests through 20+ integrated proxy providers, automatically selecting the best provider for each target domain.
For each domain, the next table shows how many integrated providers met three benchmark tiers:
- 80%+ success rate with ≤15 s average success latency,
- 60%+ success rate with ≤25 s average success latency,
- 40%+ success rate with ≤35 s average success latency,
- and how many could not meet even the loosest tier (Failing).
| Domain | Success Rate / Avg. Success Latency | Failing | ||
|---|---|---|---|---|
| 80% / 15s | 60% / 25s | 40% / 35s | ||
| indeed.com | 10 | 2 | 1 | 4 |
| zillow.com | 14 | 2 | 1 | 1 |
| realtor.com | 2 | 0 | 1 | 4 |
| redfin.com | 14 | 0 | 1 | 4 |
| glassdoor.com | 10 | 2 | 0 | 4 |
| nike.com | 14 | 3 | 2 | 1 |
| adidas.com | 6 | 4 | 4 | 4 |
| bestbuy.com | 7 | 0 | 1 | 8 |
| wayfair.com | 11 | 2 | 1 | 3 |
| etsy.com | 4 | 5 | 3 | 1 |
| newegg.com | 14 | 2 | 3 | 1 |
| skechers.com | 17 | 2 | 0 | 1 |
| sneakersnstuff.com | 16 | 1 | 2 | 1 |
| coinmarketcap.com | 19 | 0 | 0 | 1 |
| coingecko.com | 17 | 3 | 0 | 0 |
| investing.com | 13 | 2 | 1 | 3 |
| etf.com | 15 | 1 | 2 | 1 |
| mediamarkt.de | 14 | 2 | 1 | 0 |
| pccomponentes.com | 13 | 2 | 2 | 2 |
| controller.com | 12 | 4 | 0 | 2 |
The table below lists the best-performing provider the aggregator chose for each domain based on scraping 100,000 pages of that website.
The best provider was choosen based on which delievered the lowest cost plan whilst obtaining a success rate of at least 80% and a average succeess latency of less than 15 seconds.
| Domain | Best Provider | Success Rate & Success Latency | API Credits | Plan | CPM |
|---|---|---|---|---|---|
| indeed.com | Scrapingant | 97%13.4s | 1 | Enthusiast$19/month | $190 |
| zillow.com | Scrapedo | 99%3.4s | 1 | Basic$29/month | $290 |
| realtor.com | Scrapingdogrender | 98%4.2s | 5 | Standard$90/month | $450 |
| redfin.com | Scrapingant | 98%3.9s | 1 | Enthusiast$19/month | $190 |
| glassdoor.com | Scrapingbee | 91%8.5s | 1 | Freelance$49/month | $327 |
| nike.com | Zyte Api | 99%8.9s | 1 | Pay-As-You-Go$13 | $130 |
| adidas.com | Scrapedo | 100%4.9s | 1 | Basic$29/month | $290 |
| bestbuy.com | Scrapedo | 97%3.7s | 1 | Basic$29/month | $290 |
| wayfair.com | Scrapingant | 97%11.9s | 1 | Enthusiast$19/month | $190 |
| etsy.com | Scraperapi | 91%12.4s | 1 | Hobby$49/month | $490 |
| newegg.com | Zyte Api | 99%5.7s | 1 | Pay-As-You-Go$13 | $130 |
| skechers.com | Zyte Api | 98%1.8s | 1 | Pay-As-You-Go$13 | $130 |
| sneakersnstuff.com | Scrapingant | 97%9.0s | 1 | Enthusiast$19/month | $190 |
| coinmarketcap.com | Zyte Api | 99%1.3s | 1 | Pay-As-You-Go$13 | $130 |
| coingecko.com | Zyte Api | 99%2.0s | 1 | Pay-As-You-Go$13 | $130 |
| investing.com | Scrapedo | 97%3.0s | 1 | Basic$29/month | $290 |
| etf.com | Zyte Api | 97%1.6s | 1 | Pay-As-You-Go$13 | $130 |
| mediamarkt.de | Scrapingant | 90%7.7s | 1 | Enthusiast$19/month | $190 |
| pccomponentes.com | Scrapedo | 97%2.4s | 1 | Basic$29/month | $290 |
| controller.com | Scrapingant | 99%2.3s | 1 | Enthusiast$19/month | $190 |
Performance Summary
| Metric | Result |
|---|---|
| Domain coverage | 20/20 domains — each benchmark site had a best-scoring integrated provider in the results above |
| Success rate (best provider per domain) | ~89.5%–99.6% (average ~96.9%) on measured successful responses |
| Average response time (successful requests) | ~5.6 seconds for the best provider per domain; range ~1.3s–13.4s depending on the site |
Key Observations:
- Full domain coverage: All 20 targets—including job boards (e.g. Indeed, Glassdoor), real estate (Zillow, Realtor.com, Redfin), retail and apparel (Nike, Adidas, Wayfair, Best Buy), and crypto/finance (CoinMarketCap, CoinGecko, Investing.com) were able to be scraped using Proxy APIs contained within the ScrapeOps Proxy Aggregator.
- Per-domain success rates for that winning provider stayed in the high 80s to high 90s; the lowest in this dataset was mediamarkt.de at 89.5%, while several domains exceeded 99% (e.g. Adidas at 99.6%).
- Automatic provider selection split wins across multiple backends: Zyte API, ScrapingAnt, and ScrapeDO each led on multiple domains; ScrapingBee, ScraperAPI, and ScrapingDog each topped individual targets—matching the diversity shown in the provider criteria counts.
- Latency reflects HTTP-level bypasses (no full browser session for these tests): fastest successful responses were under ~2 seconds on some domains, while heavier pages pushed toward ~10–13 seconds.
Smart proxies with professionally maintained Cloudflare bypasses delivered the strongest aggregate results in our comparison.
The combination of private bypass implementations, rapid updates, and intelligent multi-provider routing makes this approach a strong fit for production workloads when you want high success rates without running your own bypass stack.
Smart proxies are the pragmatic choice when you need reliable Cloudflare bypass without the engineering overhead of maintaining your own solution.
Ideal Use Cases
- Production Scraping: When uptime and reliability matter more than squeezing every cent of margin
- Variable Targets: Scraping multiple domains with different Cloudflare configurations
- Teams Without Anti-Bot Expertise: Skip the learning curve of reverse engineering Cloudflare
- Speed-Critical Workloads: HTTP-only requests are 10-100x faster than browser-based approaches
- High Volume: Scale to millions of requests without managing browser infrastructure
When NOT to Use This Method
- Extremely Tight Budgets: Per-request pricing adds up; DIY may be cheaper at very high volumes
- Sites Without Protection: Overkill for sites that work with basic HTTP requests
- JavaScript Rendering Required: Smart proxies return HTML; if you need JS execution, consider browser APIs
- Full Control Required: If you need custom browser interactions or session logic
Cost Considerations
Smart proxy pricing varies significantly by provider and bypass level. Here's what to expect:
| Volume | Basic Proxy | Smart Proxy (Low Security) | Smart Proxy (High Security) |
|---|---|---|---|
| 10,000 pages/month | ~$10-30 | ~$50-100 | ~$100-400 |
| 100,000 pages/month | ~$50-150 | ~$200-500 | ~$500-2,000 |
| 1M pages/month | ~$200-500 | ~$1,000-3,000 | ~$3,000-10,000 |
The tradeoff: Smart proxies cost more than basic proxies but eliminate engineering time and provide significantly higher success rates on protected sites.
- Simple HTTP API, use your existing HTTP client and codebase
- No browser overhead, fast response times (milliseconds vs seconds)
- Professionally maintained bypasses updated continuously
- Scales linearly without infrastructure management
- Multiple bypass levels for different security configurations
- Higher success rates than DIY open source solutions
- Wide performance and cost variations between providers
- Less control over bypass implementation details
- Dependent on provider's bypass effectiveness
- May require testing multiple providers to find best fit
Most smart proxy providers offer similar functionality with varying pricing and effectiveness. The ScrapeOps Proxy Aggregator is unique in that it integrates 20+ proxy providers into a single API, automatically routing your requests to the best/cheapest provider for each target domain.
ScrapeOps Proxy Aggregator
The ScrapeOps Proxy Aggregator integrates over 20 proxy providers into the same proxy API, and finds the best/cheapest proxy provider for your target domains.
Basic Usage (Python)
import requests
response = requests.get( url='https://proxy.scrapeops.io/v1/', params={ 'api_key': 'YOUR_API_KEY', 'url': 'http://example.com/', },)
print('Body: ', response.content)Getting Started
- Sign up for a free API key at here (includes 1,000 free API credits)
- Monitor success rates in your ScrapeOps dashboard to optimize bypass selection
This section answers common questions about using smart proxies for bypassing Cloudflare.
For more information about smart proxies and Cloudflare bypass, check out these resources:
- ScrapeOps Proxy Aggregator Documentation
- Anti-Bot Bypass Guide
- Proxy Provider Comparison Tool
- Residential Proxy Comparison
This change log tracks any updates and revisions made to the Smart Proxy Method over time.
How To Bypass Cloudflare: TLS Impersonation
Option #2: TLS Impersonation
TLS impersonation makes your client look like a real browser at the wire: same TLS/JA3 and HTTP/2 fingerprints, no headless browser and no JavaScript execution. It fits targets where Cloudflare leans on fingerprinting more than interactive challenges.
Cloudflare uses TLS fingerprinting to identify bots. Every HTTP client—whether a real browser or Python's requests library, creates a unique fingerprint based on how it negotiates TLS connections and structures HTTP/2 frames. Standard libraries like requests and httpx have fingerprints that Cloudflare recognizes as non-browser and blocks.
curl_cffi is a Python binding for curl-impersonate that sends requests with TLS fingerprints matching real browsers (Chrome, Safari, Firefox, Edge). Cloudflare sees a request that looks like it came from a real browser and allows it through—without you needing to run any JavaScript or launch a headless browser.
We tested curl_cffi across 20 Cloudflare-protected domains. If you prefer the httpx API, httpx-curl_cffi provides the same TLS fingerprinting via an httpx transport adapter.
| Domain | Status |
|---|---|
| indeed.com | PASS |
| zillow.com | PASS |
| realtor.com | FAIL |
| redfin.com | PASS |
| glassdoor.com | PASS |
| nike.com | PASS |
| adidas.com | FAIL |
| bestbuy.com | FAIL |
| wayfair.com | PASS |
| etsy.com | FAIL |
| Domain | Status |
|---|---|
| newegg.com | PASS |
| skechers.com | PASS |
| sneakersnstuff.com | PASS |
| coinmarketcap.com | PASS |
| coingecko.com | PASS |
| investing.com | PASS |
| etf.com | FAIL |
| mediamarkt.de | PASS |
| pccomponentes.com | PASS |
| controller.com | FAIL |
Overall, curl_cffi achieved 16 out of 20 domains (80%) working in our tests. It works best on sites where TLS fingerprinting is the main detection method, while failing on sites that require JavaScript execution or have stricter multi-layer protection.
TLS impersonation is ideal when you need a lightweight, fast bypass that doesn't consume the CPU and memory of a headless browser. It works well on sites where fingerprinting is the primary detection method.
Ideal Use Cases
- High-Volume Scraping: Lightweight requests scale to millions of pages without the overhead of browser instances.
- Sites Using Basic Fingerprinting: When Cloudflare relies mainly on TLS/HTTP fingerprint checks rather than JavaScript challenges.
- Async Workflows: curl_cffi has native async support for concurrent scraping.
- Memory-Constrained Environments: No browser process, just HTTP requests with spoofed fingerprints.
- Budget Constraints: Free, open-source, no API costs.
When NOT to Use This Method
- Sites Requiring JavaScript Execution: If Cloudflare serves a "Checking your browser" page that runs JS challenges, curl_cffi cannot execute it. Use FlareSolverr or fortified browsers instead.
- Mandatory CAPTCHAs: TLS impersonation cannot solve hCaptcha or Turnstile. Consider smart proxies or browser APIs.
- High-Security Sites: Sites with aggressive multi-layer detection may still block you.
- Free and open-source with no API costs
- Lightweight—no headless browser, minimal CPU/RAM
- Fast—standard HTTP request latency
- Async support for high-concurrency scraping
- Strong success rate on fingerprint-based detection (80% in our tests)
- Cannot execute JavaScript challenges
- Fails on sites requiring JS-based verification
- CAPTCHAs remain unsolvable
- Can break when Cloudflare updates fingerprint detection
curl_cffi
curl_cffi is a Python binding for curl-impersonate that can mimic browser TLS/JA3 and HTTP/2 fingerprints.
Installation
pip install curl_cffiBasic Usage
from curl_cffi.requests import Session
# Create a session that impersonates Chromewith Session(impersonate="chrome136") as session: response = session.get("https://cloudflare.com/") print(response.status_code) print(response.text[:500])Available Browser Impersonations
curl_cffi supports impersonating multiple browser versions:
| Browser | Versions |
|---|---|
| Chrome | chrome99, chrome100, chrome104, chrome110, chrome116, chrome119, chrome120, chrome123, chrome124, chrome131, chrome133a, chrome136 |
| Chrome Android | chrome99_android, chrome131_android |
| Safari | safari153, safari155, safari170, safari180, safari184, safari260 |
| Safari iOS | safari172_ios, safari180_ios, safari184_ios, safari260_ios |
| Firefox | firefox133, firefox135 |
| Edge | edge99, edge101 |
Using With Proxies
from curl_cffi.requests import Session
proxies = { "http": "http://user:pass@proxy.example.com:8080", "https": "http://user:pass@proxy.example.com:8080"}
with Session(impersonate="chrome136", proxies=proxies) as session: response = session.get("https://cloudflare.com/")Async Support
import asynciofrom curl_cffi.requests import AsyncSession
async def fetch_urls(urls): async with AsyncSession(impersonate="chrome136") as session: tasks = [session.get(url) for url in urls] responses = await asyncio.gather(*tasks) return responses
urls = ["https://example1.com", "https://example2.com", "https://example3.com"]results = asyncio.run(fetch_urls(urls))Best For: High-volume scraping where TLS fingerprinting is the main detection method, async workflows, memory-constrained environments. If you prefer the httpx API, httpx-curl_cffi provides the same TLS fingerprinting via an httpx transport adapter.
How To Bypass Cloudflare: Paid Stealth Browser APIs
Option #3: Paid Stealth Browser APIs
Paid stealth browser APIs are hosted Puppeteer/Playwright (or similar) with unblocking, proxies, fingerprints, and CAPTCHA handling built in. You write the automation; the vendor runs hardened browsers and keeps the anti-bot stack updated.
Browser APIs are managed browser services designed specifically for web scraping at scale. Unlike running your own fortified headless browser locally, these services handle:
- Automated Unblocking: Built-in CAPTCHA solving, JavaScript challenge handling, and anti-bot mitigation
- Fingerprint Management: Automatic browser fingerprint rotation and consistency
- Proxy Integration: Built-in residential/datacenter proxy rotation
- Session Handling: Persistent sessions, cookie management, and retry logic
- Infrastructure: Cloud-based browser instances that scale on demand
You interact with these services using familiar Puppeteer or Playwright APIs, but the underlying browser runs on their infrastructure with all stealth optimizations pre-configured.
To validate the effectiveness of browser API services, we tested Bright Data Scraping Browser, ZenRows Scraping Browser, and Scrapeless Scraping Browser across 20 domains including job boards (Indeed, Glassdoor), real estate (Zillow, Realtor, Redfin), retail (Nike, Best Buy, Etsy, Wayfair), and crypto/finance sites (CoinMarketCap, CoinGecko). Each service was tested using default configurations with Puppeteer integration. Success rates are shown per domain.
| Domain | Bright Data | Scrapeless | ZenRows |
|---|---|---|---|
| indeed.com | 29% | 22% | 90% |
| zillow.com | 82% | 41% | 71% |
| realtor.com | 9% | 0% | 1% |
| redfin.com | 81% | 52% | 0% |
| glassdoor.com | 0% | 1% | 0% |
| nike.com | 81% | 61% | 100% |
| adidas.com | 99% | 1% | 0% |
| bestbuy.com | 29% | 30% | 1% |
| wayfair.com | 9% | 38% | 60% |
| etsy.com | 0% | 0% | 1% |
| newegg.com | 19% | 31% | 1% |
| skechers.com | 81% | 42% | 100% |
| sneakersnstuff.com | 41% | 60% | 60% |
| coinmarketcap.com | 78% | 61% | 48% |
| coingecko.com | 89% | 60% | 89% |
| investing.com | 58% | 30% | 51% |
| etf.com | 82% | 51% | 88% |
| mediamarkt.de | 82% | 29% | 2% |
| pccomponentes.com | 79% | 71% | 0% |
| controller.com | 52% | 11% | 1% |
Combined domain coverage: 13/20 benchmark domains (65%) had at least one provider at ≥60% success (Bright Data, Scrapeless, or ZenRows).
Summary Comparison
| Provider | Avg. Success Rate | Best For | Considerations |
|---|---|---|---|
| Bright Data | ~54% | Enterprise, broad domain coverage | Highest average; strong on Adidas (99%), CoinGecko (89%); struggles on job boards and some retail |
| ZenRows | ~36% | Strong on specific domains (Indeed 90%, Nike/Skechers 100%) | Inconsistent—excellent on some sites, near-zero on others |
| Scrapeless | ~32% | High concurrency, cost-conscious | Newer platform; moderate rates across domains; AI-driven |
Overall, browser APIs outperform self-hosted fortified browsers (which showed 0–35% in our tests) but success is domain-dependent. For difficult targets, expect variable results. Bright Data posted the highest average success rate across domains in this run; combined domain coverage (≥60% on any provider) is higher than any single provider’s slice of the benchmark because different vendors excel on different sites.
Browser APIs are ideal when you want the power of browser automation without the operational overhead of maintaining stealth patches, proxy infrastructure, and browser orchestration.
Ideal Use Cases
- High-Value Targets: Sites with aggressive anti-bot protection where DIY stealth solutions fail
- Production Workloads: When reliability matters more than cost optimization
- Teams Without Anti-Bot Expertise: Skip the learning curve of stealth patches and fingerprint management
- Variable Scale: Projects that need to scale up/down without managing browser infrastructure
- Rapid Prototyping: Get scraping quickly without building evasion infrastructure
When NOT to Use This Method
- Tight Budgets: Per-request pricing adds up quickly at high volumes
- Simple Sites: Overkill for sites that work with basic HTTP requests or curl_cffi
- Full Control Required: If you need deep customization of browser behavior
- Vendor Lock-in Concerns: Your scraping logic becomes dependent on third-party services
Cost Considerations
Browser API pricing is typically per-request or per-minute of browser time. Here's a rough comparison:
| Volume | Self-Hosted (Fortified Browser + Proxies) | Browser API Service |
|---|---|---|
| 10,000 pages/month | ~$50-100 (proxy costs) | ~$100-300 |
| 100,000 pages/month | ~$200-500 (proxy + infrastructure) | ~$500-1,500 |
| 1M pages/month | ~$1,000-3,000 | ~$2,000-8,000 |
The tradeoff: Browser APIs cost more per request but eliminate engineering time spent on stealth maintenance, infrastructure management, and debugging detection issues.
- Zero maintenance overhead for stealth patches and browser updates
- Built-in CAPTCHA solving and anti-bot bypass
- Native Puppeteer/Playwright compatibility—minimal code changes
- Automatic proxy rotation and fingerprint management
- Scales without managing browser infrastructure
- Higher success rates on difficult targets
- Higher per-request costs than self-hosted solutions
- Vendor dependency and potential lock-in
- Less control over browser behavior and customization
- Variable latency depending on service load
- May require code changes if switching providers
Choose the browser API that best fits your needs. Each provider offers similar core functionality but differs in pricing, features, and target use cases. All support Puppeteer and Playwright integration via WebSocket connections.
Bright Data – Scraping Browser
Bright Data's Scraping Browser is a managed browser service designed specifically for web scraping at scale with automated unblocking capabilities. Unlike a plain headless browser, it acts like a true browser instance with built-in site unlocking, fingerprint management, CAPTCHA solving, retries, and session handling.
Status: Industry leader with extensive infrastructure. Part of a larger proxy network ecosystem. Well-documented with enterprise support options.
Performance Notes: Highly effective against Cloudflare and most anti-bot systems. Automatic retry logic and session management handle edge cases. Best-in-class success rates but premium pricing reflects this.
Key Features
| Feature | Description |
|---|---|
| Automated Unblocking | Built-in CAPTCHA solving, JavaScript challenges, and dynamic anti-bot mitigation |
| Framework Compatible | Native Puppeteer and Playwright support via WebSocket endpoint |
| Session Management | Automatic headers, cookies, and session persistence |
| Detection Avoidance | Both headless and headed modes with fingerprint rotation |
Setup
- Create a Bright Data account at brightdata.com
- Navigate to Proxies & Scraping → Scraping Browser
- Create a new zone and note your credentials (Customer ID, Zone Name, Password)
Basic Usage (Puppeteer)
const puppeteer = require('puppeteer-core');
const SBR_CDP = 'wss://brd-customer-CUSTOMER_ID-zone-ZONE_NAME:PASSWORD@brd.superproxy.io:9222';
async function main() { const browser = await puppeteer.connect({ browserWSEndpoint: SBR_CDP, }); const page = await browser.newPage(); await page.goto('https://cloudflare.com/', { waitUntil: 'domcontentloaded' }); console.log(await page.title()); await browser.close();}
main();Basic Usage (Playwright)
const { chromium } = require('playwright-core');
const SBR_CDP = 'wss://brd-customer-CUSTOMER_ID-zone-ZONE_NAME:PASSWORD@brd.superproxy.io:9222';
async function main() { const browser = await chromium.connectOverCDP(SBR_CDP); const page = await browser.newPage(); await page.goto('https://cloudflare.com/'); console.log(await page.title()); await browser.close();}
main();Usage With Python (Playwright)
import asynciofrom playwright.async_api import async_playwright
SBR_CDP = 'wss://brd-customer-CUSTOMER_ID-zone-ZONE_NAME:PASSWORD@brd.superproxy.io:9222'
async def main(): async with async_playwright() as p: browser = await p.chromium.connect_over_cdp(SBR_CDP) page = await browser.new_page() await page.goto('https://cloudflare.com/') print(await page.title()) await browser.close()
asyncio.run(main())Best For: Enterprise teams needing maximum reliability, projects requiring high success rates against difficult targets, workflows that benefit from Bright Data's broader proxy ecosystem.
ZenRows – Scraping Browser API
ZenRows Scraping Browser is part of the Universal Scraper API suite. It integrates a built-in browser that renders JavaScript, simulates human-like behavior (scrolling, interaction patterns), and blends anti-bot techniques directly into each session.
Status: Growing platform with focus on developer experience. Part of a broader scraping API ecosystem. Good documentation and responsive support.
Performance Notes: Effective against most Cloudflare configurations. Built-in human behavior simulation helps with behavioral analysis. Competitive pricing for mid-scale projects.
Key Features
| Feature | Description |
|---|---|
| Human-Like Behavior | Automatic scrolling, mouse movements, and interaction patterns |
| All-In-One | Integrated proxies, rendering, and anti-bot bypass |
| Simplified Integration | Clean API that replaces complex headless browser setups |
| JavaScript Rendering | Full JS execution for SPAs and dynamic content |
Setup
- Create a ZenRows account at zenrows.com
- Navigate to your dashboard and get your API key
- Access the Scraping Browser WebSocket endpoint
Basic Usage (Puppeteer)
const puppeteer = require('puppeteer-core');
const ZENROWS_CDP = 'wss://browser.zenrows.com?apikey=YOUR_API_KEY';
async function main() { const browser = await puppeteer.connect({ browserWSEndpoint: ZENROWS_CDP, }); const page = await browser.newPage(); await page.goto('https://cloudflare.com/', { waitUntil: 'domcontentloaded' }); console.log(await page.title()); await browser.close();}
main();Basic Usage (Playwright)
const { chromium } = require('playwright-core');
const ZENROWS_CDP = 'wss://browser.zenrows.com?apikey=YOUR_API_KEY';
async function main() { const browser = await chromium.connectOverCDP(ZENROWS_CDP); const page = await browser.newPage(); await page.goto('https://cloudflare.com/'); console.log(await page.title()); await browser.close();}
main();Usage With Python (Playwright)
import asynciofrom playwright.async_api import async_playwright
ZENROWS_CDP = 'wss://browser.zenrows.com?apikey=YOUR_API_KEY'
async def main(): async with async_playwright() as p: browser = await p.chromium.connect_over_cdp(ZENROWS_CDP) page = await browser.new_page() await page.goto('https://cloudflare.com/') print(await page.title()) await browser.close()
asyncio.run(main())Best For: Developers wanting a plug-and-play solution, mid-scale projects with JS-heavy targets, teams already using ZenRows' other scraping APIs.
Scrapeless – Scraping Browser
Scrapeless Scraping Browser is an AI-powered browser built on a customized Chromium engine with anti-detection logic. It abstracts away browser orchestration, session handling, fingerprint spoofing, and proxy management.
Status: Newer entrant focused on AI-driven automation. Competitive pricing with high-concurrency support. Growing documentation and community.
Performance Notes: AI-driven behavior simulation adapts to different sites. Strong performance on high-concurrency workloads. Good value for large-scale scraping projects.
Key Features
| Feature | Description |
|---|---|
| AI-Driven Automation | Realistic human-like interactions (clicks, typing, dynamic behavior) |
| Native SDK Support | Direct Puppeteer and Playwright compatibility |
| Built-In Infrastructure | Global proxy network and anti-bot bypass included |
| High Concurrency | Designed for thousands of parallel browser sessions |
Setup
- Create a Scrapeless account at scrapeless.com
- Navigate to the Scraping Browser section
- Generate an API token for WebSocket connections
Basic Usage (Puppeteer)
const puppeteer = require('puppeteer-core');
const SCRAPELESS_CDP = 'wss://browser.scrapeless.com?token=YOUR_API_TOKEN';
async function main() { const browser = await puppeteer.connect({ browserWSEndpoint: SCRAPELESS_CDP, }); const page = await browser.newPage(); await page.goto('https://cloudflare.com/', { waitUntil: 'domcontentloaded' }); console.log(await page.title()); await browser.close();}
main();Basic Usage (Playwright)
const { chromium } = require('playwright-core');
const SCRAPELESS_CDP = 'wss://browser.scrapeless.com?token=YOUR_API_TOKEN';
async function main() { const browser = await chromium.connectOverCDP(SCRAPELESS_CDP); const page = await browser.newPage(); await page.goto('https://cloudflare.com/'); console.log(await page.title()); await browser.close();}
main();Usage With Python (Playwright)
import asynciofrom playwright.async_api import async_playwright
SCRAPELESS_CDP = 'wss://browser.scrapeless.com?token=YOUR_API_TOKEN'
async def main(): async with async_playwright() as p: browser = await p.chromium.connect_over_cdp(SCRAPELESS_CDP) page = await browser.new_page() await page.goto('https://cloudflare.com/') print(await page.title()) await browser.close()
asyncio.run(main())Best For: Large-scale scraping with high concurrency requirements, projects needing AI-driven behavior simulation, cost-conscious teams wanting browser API capabilities.
Instead of developers maintaining their own stealth patches and proxy infrastructure for Puppeteer or Playwright, browser APIs combine rendering, anti-bot mitigation, and session handling behind a single WebSocket endpoint.
What Browser APIs Replace
| Capability | DIY Approach | Browser API |
|---|---|---|
| Stealth Patches | Manual updates to puppeteer-extra-stealth, Patchright, etc. | Automatic, managed by provider |
| Fingerprint Management | Custom code for canvas, WebGL, fonts, etc. | Built-in rotation and consistency |
| Proxy Rotation | Separate proxy provider integration | Included in the service |
| CAPTCHA Solving | Third-party integration (2Captcha, etc.) | Built-in or integrated |
| Session Persistence | Custom cookie/storage handling | Automatic session management |
| Infrastructure | Docker, Kubernetes, cloud VMs | Fully managed |
Migration From Local Browsers
If you already have Puppeteer or Playwright scripts, migrating to a Browser API typically requires changing just one line:
// Before: Local Puppeteer with stealthconst puppeteer = require('puppeteer-extra');const StealthPlugin = require('puppeteer-extra-plugin-stealth');puppeteer.use(StealthPlugin());const browser = await puppeteer.launch({ headless: false });
// After: Browser APIconst puppeteer = require('puppeteer-core');const browser = await puppeteer.connect({ browserWSEndpoint: 'wss://provider.example.com?apikey=YOUR_KEY',});The rest of your scraping logic—page navigation, selectors, data extraction—remains unchanged.
Future-Proofing
Future anti-bot defenses increasingly rely on behavioral and session analysis, meaning services that simulate entire browser environments with human-like patterns are more robust than standalone headless browsers. Browser APIs invest continuously in staying ahead of detection methods, making them a sustainable choice for long-term scraping projects.
This section answers common questions about using browser APIs for bypassing Cloudflare and other anti-bot systems.
For more information about browser APIs and managed scraping solutions, check out these resources:
- Bright Data Scraping Browser Documentation
- ZenRows Scraping Browser Guide
- Scrapeless Documentation
- Puppeteer Documentation
- Playwright Documentation
- Browser Fingerprinting Explained
This change log tracks any updates and revisions made to the Browser API Method over time.
How To Bypass Cloudflare: Cloudflare Solvers
Option #4: Cloudflare Solvers
Cloudflare solvers (e.g. FlareSolverr) drive a real browser through the challenge page, then return HTML and cookies such as cf_clearance for your scraper to reuse. Heavier than TLS-only approaches, but they cover JavaScript-based checks.
FlareSolverr is a proxy server that bypasses Cloudflare and DDoS-GUARD protection using a headless browser. It uses Selenium with undetected-chromedriver to solve Cloudflare's JavaScript and browser fingerprinting challenges.
When Cloudflare suspects a visitor is a bot, it displays a "Checking your browser" challenge page that runs JavaScript. FlareSolverr opens the target URL in a headless browser, waits until the challenge is solved, then returns the HTML and cookies to your scraper. You can use those cookies with a lightweight HTTP client for subsequent requests.

We tested FlareSolverr across 20 Cloudflare-protected domains:
| Domain | Status |
|---|---|
| indeed.com | PASS |
| zillow.com | FAIL |
| realtor.com | FAIL |
| redfin.com | FAIL |
| glassdoor.com | WARN |
| nike.com | PASS |
| adidas.com | FAIL |
| bestbuy.com | PASS |
| wayfair.com | WARN |
| etsy.com | PASS |
| Domain | Status |
|---|---|
| newegg.com | WARN |
| skechers.com | PASS |
| sneakersnstuff.com | PASS |
| coinmarketcap.com | PASS |
| coingecko.com | PASS |
| investing.com | FAIL |
| etf.com | PASS |
| mediamarkt.de | PASS |
| pccomponentes.com | PASS |
| controller.com | FAIL |
FlareSolverr achieved 11 working + 3 partially working out of 20 domains (55-70%) in our tests. It works best on sites that require JavaScript execution to pass Cloudflare's challenge, but is slower and more resource-intensive than lightweight HTTP requests.
Ideally, FlareSolverr is a fallback when TLS impersonation fails, because the site requires JavaScript execution. On paper it's more resource-intensive but can solve challenges that curl_cffi cannot. In practice, it's not always reliable and often fails to solve the challenge.
Ideal Use Cases
- Sites Requiring JavaScript Execution: When Cloudflare's challenge runs JS that must complete before access is granted.
- Cookie Harvesting: Solve the challenge once, get valid
cf_clearancecookies, then scrape with lightweight HTTP clients. - Budget Constraints: Free, open-source alternative to commercial bypass services.
- Moderate Scale: Thousands to tens of thousands of pages where browser overhead is acceptable.
When NOT to Use This Method
- High Volume: Headless browser solvers consume significant CPU/RAM—impractical for millions of requests.
- Real-Time Requirements: High latency (10-60+ seconds per challenge).
- High Security Sites: Sites with CAPTCHAs, Turnstile, or aggressive fingerprinting often defeat FlareSolverr.
- Reliability Critical: Can break when Cloudflare updates; requires community patches.
Important Consideration
Open-source Cloudflare solvers have a limited shelf life. Many older solvers (cloudscraper, cloudflare-scrape) have been abandoned. Always verify the tool has recent commits and community activity.
- Free and open-source with no API costs
- Can solve JavaScript challenges that TLS impersonation cannot
- Cookie harvesting allows lightweight HTTP clients for most requests
- Works on sites requiring JS execution
- Resource-intensive (CPU/RAM)—each request launches a browser
- High latency (10-60+ seconds per challenge)
- Often fails against high-security configurations
- Can break when Cloudflare updates their systems
- CAPTCHAs (hCaptcha, Turnstile) remain unsolvable
FlareSolverr
FlareSolverr is a proxy server that bypasses Cloudflare and DDoS-GUARD protection using a headless browser.
Installation
Install FlareSolverr using Docker (Firefox browser included):
docker run -d \ --name=flaresolverr \ -p 8191:8191 \ -e LOG_LEVEL=info \ --restart unless-stopped \ ghcr.io/flaresolverr/flaresolverr:latestUsage Example
Send requests to the FlareSolverr server to get valid cookies:
import requests
post_body = { "cmd": "request.get", "url": "https://cloudflare.com/", "maxTimeout": 60000}
response = requests.post( 'http://localhost:8191/v1', headers={'Content-Type': 'application/json'}, json=post_body)
data = response.json()print("Status:", data['status'])print("Cookies:", data['solution']['cookies'])print("User-Agent:", data['solution']['userAgent'])Response Format
{ "status": "ok", "message": "Challenge not detected!", "solution": { "url": "https://cloudflare.com/", "status": 200, "cookies": [ { "domain": ".cloudflare.com", "name": "cf_clearance", "value": "...", "expiry": 1705160731 } ], "userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36...", "response": "<html>...</html>" }}Using Cookies for Subsequent Requests
Once you have valid cookies, use them with your regular HTTP client:
import requests
# Use cookies from FlareSolverrsession = requests.Session()session.headers['User-Agent'] = flaresolverr_user_agentfor cookie in flaresolverr_cookies: session.cookies.set(cookie['name'], cookie['value'], domain=cookie['domain'])
# Now make requests without FlareSolverrresponse = session.get('https://target-site.com/data')Best For: Sites requiring JavaScript execution, cookie harvesting for lightweight HTTP clients, moderate request volumes.
- FlareSolverr GitHub Repository
- TLS Fingerprinting with JA3 and JA3S
- Understanding Browser Fingerprinting
How To Bypass Cloudflare: Fortified Headless Browsers
Option #5: Scrape With Fortified Headless Browsers
Fortified headless browsers patch automation leaks (navigator.webdriver, canvas, WebGL, and similar) so Puppeteer, Playwright, or Selenium sessions read like a normal user. You self-host the stack and own debugging when Cloudflare updates.
Vanilla headless browsers leak their identity in their JavaScript fingerprints which anti-bot systems can easily detect. Fortified headless browsers are modified versions of standard automation tools (Puppeteer, Playwright, Selenium) that patch these detection vectors.
For example, a commonly known leak present in headless browsers like Puppeteer, Playwright and Selenium is the value of navigator.webdriver. In normal browsers, this is set to false, however, in unfortified headless browsers it is set to true.
Headless browser navigator.webdriver leak
There are over 200 known headless browser leaks which stealth plugins attempt to patch. However, the actual number is believed to be much higher as browsers are constantly changing and it's in browser developers' & anti-bot companies' interest to not reveal all the leaks they know of.
Categories of Fortified Browser Tools
The ecosystem of fortified headless browsers can be broken down into three categories:
| Category | Tools | Description |
|---|---|---|
| Stealth Plugins | Puppeteer Extra + Stealth, Playwright Stealth | Plugin frameworks that add stealth patches to existing automation tools |
| Patched Variants | Patchright, Undetected ChromeDriver | Modified forks of automation tools with stealth patches built-in |
| Browser Patches | Rebrowser Patches | Low-level patches that fix automation leaks in the browser itself |
To validate the effectiveness of fortified headless browser tools, we tested three popular options across 20 domains including job boards (Indeed, Glassdoor), real estate (Zillow, Realtor, Redfin), retail (Nike, Best Buy, Etsy, Wayfair), and crypto/finance sites (CoinMarketCap, CoinGecko). Each tool was tested in its default configuration without additional proxy integration.
We compared Undetected ChromeDriver (Python/Selenium, widely used), Patchright (patched Playwright with stealth fixes), and Puppeteer Extra with its stealth plugin (Node.js). Results:
| Domain | Undetected ChromeDriver | Patchright | Puppeteer Extra + Stealth |
|---|---|---|---|
| indeed.com | FAIL | FAIL | FAIL |
| zillow.com | FAIL | FAIL | FAIL |
| realtor.com | FAIL | FAIL | FAIL |
| redfin.com | FAIL | FAIL | FAIL |
| glassdoor.com | FAIL | FAIL | FAIL |
| nike.com | FAIL | WARN | WARN |
| adidas.com | FAIL | FAIL | FAIL |
| bestbuy.com | FAIL | PASS | PASS |
| wayfair.com | FAIL | FAIL | FAIL |
| etsy.com | FAIL | FAIL | FAIL |
| newegg.com | FAIL | FAIL | FAIL |
| skechers.com | FAIL | WARN | WARN |
| sneakersnstuff.com | FAIL | FAIL | FAIL |
| coinmarketcap.com | FAIL | PASS | PASS |
| coingecko.com | FAIL | WARN | WARN |
| investing.com | FAIL | FAIL | FAIL |
| etf.com | FAIL | FAIL | FAIL |
| mediamarkt.de | FAIL | PASS | PASS |
| pccomponentes.com | FAIL | FAIL | FAIL |
| controller.com | FAIL | FAIL | FAIL |
Summary Comparison
| Tool | Success Rate | Best For | Limitations |
|---|---|---|---|
| Patchright | ~35% (4 pass, 3 partial) | Playwright users, modern stealth | Newer, smaller community; fails on job boards and most retail |
| Puppeteer Extra + Stealth | ~35% (4 pass, 3 partial) | Node.js projects | Slower plugin updates; same pass rate as Patchright |
| Undetected ChromeDriver | 0% | Python/Selenium stacks | Failed on all 20 test domains; Selenium overhead |
Overall, Patchright and Puppeteer Extra + Stealth tied with ~35% success, achieving full bypass on Best Buy, CoinMarketCap, and MediaMarkt, plus partial success on Nike, Skechers, and CoinGecko. Undetected ChromeDriver failed on every domain in our test, suggesting fortified browsers struggle against the anti-bot protections used by job boards, real estate sites, and most retail domains.
Fortified headless browsers are the go-to solution when you need to execute JavaScript, render dynamic content, or interact with pages while evading bot detection. They strike a balance between effectiveness and resource usage.
Ideal Use Cases
This method works best when:
- JavaScript-Heavy Sites: Single-page applications, React/Vue/Angular sites, or pages requiring JavaScript execution to render content.
- Interactive Scraping: When you need to click buttons, fill forms, scroll pages, or interact with elements to access data.
- Medium Security Sites: Websites with Cloudflare's standard protection where TLS fingerprinting alone isn't enough.
- Cookie Harvesting: Solving initial challenges to get valid session cookies for subsequent lightweight HTTP requests.
When NOT to Use This Method
Avoid fortified headless browsers when:
- High Volume Scraping: Browser instances consume 100-500MB RAM each, making them impractical for millions of concurrent requests.
- Speed is Critical: Page loads take 2-10+ seconds versus milliseconds for HTTP requests.
- Simple Static Content: If a site works with curl_cffi or similar TLS fingerprinting tools, headless browsers add unnecessary overhead.
- Maximum Stealth Required: For sites with the most aggressive anti-bot protection, even fortified browsers may be detected.
Cost Considerations
Pairing headless browsers with residential/mobile proxies can get expensive fast. Headless browsers typically consume 2MB of bandwidth per page (versus 250kb without). Here's an example cost breakdown using BrightData residential proxies:
| Pages | Bandwidth | Cost Per GB | Total Cost |
|---|---|---|---|
| 25,000 | 50 GB | $13 | $625 |
| 100,000 | 200 GB | $10 | $2,000 |
| 1 Million | 2TB | $8 | $16,000 |
- Can execute JavaScript and render dynamic content
- Handles interactive elements, forms, and page navigation
- Multiple mature tools available for different tech stacks
- Free and open-source options available
- Works well against medium-security Cloudflare configurations
- High resource consumption (100-500MB RAM per instance)
- Slow compared to HTTP-only approaches (2-10+ seconds per page)
- Bandwidth costs multiply when paired with residential proxies
- Can still be detected by advanced anti-bot systems
- Requires ongoing maintenance as detection methods evolve
Choose the tool that best fits your programming language and automation framework. Each has trade-offs in terms of stealth effectiveness, ease of use, and community support.
Undetected ChromeDriver
Undetected ChromeDriver is a patched Selenium ChromeDriver that hides common automation signals. It's the most popular fortified browser solution for Python.
Status: Actively maintained with a large community. Widely used in production scraping stacks.
Performance Notes: Effective against most Cloudflare configurations. Can struggle with sites using advanced fingerprinting or behavioral analysis. Works best when paired with quality proxies.
Installation
pip install undetected-chromedriverBasic Usage
import undetected_chromedriver as uc
driver = uc.Chrome()driver.get('https://cloudflare.com/')print(driver.title)driver.quit()Usage With Proxies
To use authenticated proxies with Undetected ChromeDriver, you need to create a Chrome extension that handles proxy authentication:
import osimport shutilimport tempfileimport timeimport undetected_chromedriver as webdriver
class ProxyExtension: """Class to create and manage a Chrome proxy extension."""
manifest_json = """ { "version": "1.0.0", "manifest_version": 2, "name": "Chrome Proxy", "permissions": [ "proxy", "tabs", "unlimitedStorage", "storage", "<all_urls>", "webRequest", "webRequestBlocking" ], "background": {"scripts": ["background.js"]}, "minimum_chrome_version": "76.0.0" } """
background_js = """ var config = { mode: "fixed_servers", rules: { singleProxy: { scheme: "http", host: "%s", port: %d }, bypassList: ["localhost"] } };
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) { return { authCredentials: { username: "%s", password: "%s" } }; }
chrome.webRequest.onAuthRequired.addListener( callbackFn, { urls: ["<all_urls>"] }, ['blocking'] ); """
def __init__(self, host, port, user, password): self._dir = os.path.normpath(tempfile.mkdtemp()) manifest_file = os.path.join(self._dir, "manifest.json") with open(manifest_file, mode="w") as f: f.write(self.manifest_json) background_js = self.background_js % (host, port, user, password) background_file = os.path.join(self._dir, "background.js") with open(background_file, mode="w") as f: f.write(background_js)
@property def directory(self): return self._dir
def cleanup(self): if os.path.exists(self._dir): shutil.rmtree(self._dir)
# Usageproxy = ("proxy.example.com", 8080, "username", "password")proxy_extension = ProxyExtension(*proxy)
options = webdriver.ChromeOptions()options.add_argument(f"--load-extension={proxy_extension.directory}")driver = webdriver.Chrome(options=options)
try: driver.get("https://cloudflare.com/") time.sleep(5) print("Page title:", driver.title)finally: driver.quit() proxy_extension.cleanup()Best For: Python developers using Selenium, projects needing mature ecosystem support, cookie harvesting workflows.
For more information, check out our Undetected ChromeDriver guide.
Patchright
Patchright is a patched version of Playwright with comprehensive stealth fixes to reduce automation artifacts. It's growing in popularity due to its effectiveness against modern anti-bot systems.
Status: Growing community support. More effective than basic Playwright stealth plugins and actively maintained.
Performance Notes: Currently one of the most effective open-source stealth solutions. Patches more detection vectors than Puppeteer stealth plugins. Works well against Cloudflare and similar anti-bot systems.
Installation (Python)
pip install patchrightpatchright install chromiumInstallation (Node.js)
npm install patchrightnpx patchright install chromiumBasic Usage (Python)
from patchright.sync_api import sync_playwright
with sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page() page.goto("https://cloudflare.com/") print(page.title()) browser.close()Async Usage (Python)
import asynciofrom patchright.async_api import async_playwright
async def main(): async with async_playwright() as p: browser = await p.chromium.launch(headless=False) page = await browser.new_page() await page.goto("https://cloudflare.com/") print(await page.title()) await browser.close()
asyncio.run(main())Usage With Proxies (Python)
from patchright.sync_api import sync_playwright
with sync_playwright() as p: browser = p.chromium.launch( headless=False, proxy={ "server": "http://proxy.example.com:8080", "username": "user", "password": "pass" } ) page = browser.new_page() page.goto("https://cloudflare.com/") print(page.title()) browser.close()Basic Usage (Node.js)
const { chromium } = require('patchright');
(async () => { const browser = await chromium.launch({ headless: false }); const page = await browser.newPage(); await page.goto('https://cloudflare.com/'); console.log(await page.title()); await browser.close();})();Best For: Playwright users, projects requiring modern stealth capabilities, async Python workflows, developers wanting better bypass rates than Puppeteer stealth.
Puppeteer Extra + Stealth Plugin
Puppeteer Extra is a plugin framework for Puppeteer that includes a stealth plugin to patch fingerprint leaks.
Status: Actively used but plugin updates have slowed. Known to be detectable on some advanced bot tests, but still functional for many sites.
Performance Notes: Was the original stealth solution and pioneered many techniques. Effectiveness has declined as anti-bot systems have adapted. Still works for medium-security sites but may struggle with aggressive protection.
Installation
npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealthBasic Usage
const puppeteer = require('puppeteer-extra');const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async () => { const browser = await puppeteer.launch({ headless: false }); const page = await browser.newPage(); await page.goto('https://cloudflare.com/'); console.log(await page.title()); await browser.close();})();Usage With Proxies
const puppeteer = require('puppeteer-extra');const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async () => { const browser = await puppeteer.launch({ headless: false, args: ['--proxy-server=http://proxy.example.com:8080'] }); const page = await browser.newPage(); // Handle proxy authentication await page.authenticate({ username: 'user', password: 'pass' }); await page.goto('https://cloudflare.com/'); console.log(await page.title()); await browser.close();})();Customizing Stealth Evasions
You can enable or disable specific evasion techniques:
const puppeteer = require('puppeteer-extra');const StealthPlugin = require('puppeteer-extra-plugin-stealth');
const stealth = StealthPlugin();// Disable specific evasions if neededstealth.enabledEvasions.delete('chrome.runtime');
puppeteer.use(stealth);Best For: Node.js developers already using Puppeteer, projects that need the extensive Puppeteer ecosystem, quick prototyping.
Rebrowser Patches
Rebrowser Patches provides low-level patches to remove detectable automation leaks from Puppeteer and Playwright internals. Rather than being a standalone tool, these patches fix issues at the source.
Status: Actively maintained and used to patch several downstream automation builds. Addresses detection vectors that plugin-based solutions can't fix.
Performance Notes: These patches fix fundamental issues in how automation tools communicate with browsers (like the Runtime.Enable leak). They can significantly improve stealth when combined with other tools but require more setup.
How It Works
Rebrowser Patches modifies the actual automation protocol communication to remove detectable patterns. For example, it patches the Runtime.Enable command that anti-bot systems use to detect automation.
Key Patches Included:
- Runtime.Enable leak fix: Removes the detectable CDP command pattern
- Source URL leak fix: Hides internal Puppeteer/Playwright script URLs
- ExecContextId leak fix: Prevents detection via execution context IDs
- TargetFilter leak fix: Removes automation target patterns
Installation for Puppeteer
npx rebrowser-patches@latest patch --packageName puppeteer-coreInstallation for Playwright
npx rebrowser-patches@latest patch --packageName playwrightUsage After Patching
After patching, use your automation tool normally—the patches are applied to the package itself:
// Puppeteer (after patching)const puppeteer = require('puppeteer-core');
(async () => { const browser = await puppeteer.launch({ headless: false, executablePath: '/path/to/chrome' }); const page = await browser.newPage(); await page.goto('https://cloudflare.com/'); console.log(await page.title()); await browser.close();})();Combining With Stealth Plugins
For maximum effectiveness, combine Rebrowser Patches with stealth plugins:
const puppeteer = require('puppeteer-extra');const StealthPlugin = require('puppeteer-extra-plugin-stealth');
// Patches are already applied to puppeteer-corepuppeteer.use(StealthPlugin());
(async () => { const browser = await puppeteer.launch({ headless: false }); const page = await browser.newPage(); await page.goto('https://cloudflare.com/'); console.log(await page.title()); await browser.close();})();Best For: Advanced users who want maximum stealth, developers building custom automation solutions, projects where standard stealth plugins aren't enough.
This section answers some frequently asked questions about using fortified headless browsers for bypassing Cloudflare.
For more information about fortified headless browsers and browser automation stealth, check out these resources:
- Undetected ChromeDriver Guide
- Patchright GitHub Repository
- Puppeteer Extra GitHub Repository
- Rebrowser Patches GitHub Repository
- Playwright Stealth (Python) GitHub Repository
- Browser Fingerprinting Explained
This change log tracks any updates and revisions made to the Fortified Headless Browser Method over time.
How To Bypass Cloudflare: Google Cache
Option #6: Use Cached Versions Of Website
Cached or archived copies (Wayback Machine, search-engine cache, CDNs) sometimes expose the same HTML without Cloudflare in front. Use this when freshness requirements are loose and a snapshot is enough.
The Cached Version Bypass Method is a technique that allows you to bypass Cloudflare's anti-bot protection by retrieving data from cached or archived versions of websites.
Websites have traditionally allowed search engines and other archiving services to crawl and cache their websites, to improve search engine rankings and contribute to a open and accessible internet.
The bypass method works by retrieving the cached version of the website from the archiving service like Internet Archive's Wayback Machine and using that data instead of the live website.
To validate the effectiveness of this bypass method, we tested the performance of this method using the Internet Archive's Wayback Machine.
Here are the performance results across the 20 domains:
| Domain | Status |
|---|---|
| indeed.com | FAIL |
| zillow.com | FAIL |
| realtor.com | FAIL |
| redfin.com | FAIL |
| glassdoor.com | FAIL |
| nike.com | FAIL |
| adidas.com | FAIL |
| bestbuy.com | FAIL |
| wayfair.com | FAIL |
| etsy.com | FAIL |
| Domain | Status |
|---|---|
| newegg.com | FAIL |
| skechers.com | FAIL |
| sneakersnstuff.com | FAIL |
| coinmarketcap.com | PASS |
| coingecko.com | PASS |
| investing.com | FAIL |
| etf.com | FAIL |
| mediamarkt.de | FAIL |
| pccomponentes.com | FAIL |
| controller.com | FAIL |
Overall, the Cached Version Bypass Method performs poorly in practice, only 2 out of 20 tested domains (10%) returned usable cached data. The vast majority of sites now block archiving services from crawling their content, making this method unreliable for most targets.
It remains a viable option only when you've verified that your specific target site has recent, usable snapshots and you don't need real-time freshness.
The Cached Version Bypass Method is low-effort to try, but works for only a small minority of sites—our testing found a 10% success rate. It's still worth checking before investing in more complex bypass techniques, since archived content is served from third-party servers like archive.org where Cloudflare's protection doesn't apply.
Ideal Use Cases
This method works best when your scraping requirements align with the limitations of archived data:
- Infrequent Updates: Websites that don't update frequently are often well-preserved in archives. Product descriptions, articles, blog posts, documentation, and other content that doesn't change frequently is often well-preserved in archives.
- Heavily Protected Sites: When a target site has aggressive Cloudflare anti-bot measures that make direct scraping impractical or expensive, cached versions offer an alternative path to the data.
- Backup Data Source: Use as a fallback when your primary scraping method encounters blocks or rate limits.
When NOT to Use This Method
Avoid the Cached Version Bypass when:
- Real-Time Data is Critical: Price monitoring, inventory tracking, news aggregation, or any use case where data freshness matters.
- Dynamic Content: Single-page applications, JavaScript-rendered content, user dashboards, or personalized pages are rarely captured correctly by archiving services.
- Authenticated Content: Login-protected pages, user-specific data, and gated content are never archived.
- High-Frequency Updates: Sites that update multiple times per day will have stale data in archives.
Important Consideration
With the rise of generative AI and concerns about content being used to train AI models, many websites are now actively blocking archiving services from crawling their content. Our testing found that only 2 out of 20 domains (10%) had usable cached data—a significant decline from previous years.
Always verify that your target site has recent, usable snapshots before building your scraping pipeline around this method.
- Completely free to use with no API costs
- Zero anti-bot protection on archived content
- Access to years of historical data and page versions
- No need for proxies, headless browsers, or complex setups
- Great starting point before investing in advanced techniques
- Low success rate, only ~10% of tested sites had usable cached data
- Data freshness varies, snapshots may be days, weeks, or months old
- Incomplete coverage, dynamic pages, APIs, and gated content are rarely archived
- No control over when new snapshots are created
- Declining effectiveness as more sites block archiving services
- May not capture JavaScript-rendered content accurately
To use the Cached Version Bypass Method, you will have to update your scrapers to send the requests to the cached version of the website instead of the live website.
The Internet Archive's Wayback Machine stores archived snapshots of webpages. Because the archived page is served from archive.org and not the original host, Cloudflare protections do not apply to requests for those archived snapshots.
How to Use It
Step 1: Check for available snapshots
Use the Wayback Machine API to find the closest archived version:
import requests
wayback_url = 'https://archive.org/wayback/available?url=example.com'response = requests.get(wayback_url)data = response.json()
if data.get('archived_snapshots'): archived_url = data['archived_snapshots']['closest']['url'] print("Use this snapshot:", archived_url)else: print("No archived version available.")This returns the nearest snapshot for example.com if one exists. The archived URL can then be used directly.
Step 2: Request the archived page
Once you have the archived URL, you fetch it like a normal webpage:
archived_html = requests.get(archived_url).text# parse archived_html as neededThis content is served by the archive rather than the protected site.
Step 3: Iterate through multiple snapshots (optional)
If you need historical data, you can collect snapshot lists using the wildcard pattern:
https://web.archive.org/web/YYYYMMDDhhmmss*/https://example.comThis returns a list of all snapshots around those timestamps.
This section answers some frequently asked questions about the Cached Version Bypass Method.
For more information about using cached and archived versions of websites, check out these resources:
This change log tracks any updates and revisions made to the Cached Version Bypass Method over time.
How To Bypass Cloudflare: Send Requests To Origin Server
Option #7: Send Requests To Origin Server
Origin bypass means finding the site’s real host IP (DNS history, misconfigurations, headers) and requesting it directly so traffic never hits Cloudflare’s edge. It only works when the origin is reachable and not locked to Cloudflare-only traffic.
The Origin Server Bypass Method is a technique that allows you to bypass Cloudflare's anti-bot protection by sending requests directly to the website's origin server IP address instead of to Cloudflare's CDN network.
Instead of having to trick Cloudflare into thinking your requests are from a real user, you bypass Cloudflare completely by finding the IP address of the origin server that hosts the website and send your requests to that instead—completely bypassing Cloudflare and all its protections!
How To Bypass Cloudflare - Via Origin Server
Cloudflare is a sophisticated anti-bot protection system, but it is setup by humans who:
- Mightn't fully understand Cloudflare,
- Might cut corners, or
- Make mistakes when setting up their website on Cloudflare.
Because of this, sometimes with a bit of snooping around you can find the IP address of the server that hosts the master version of the website. Once you find this IP address, you can configure your scrapers to send the requests to this server instead of Cloudflare's servers which have the anti-bot protection active.
The Origin Server Bypass Method is the ultimate low-effort, high-reward approach when it works. If you can find an exposed origin server, you can scrape without any anti-bot protection at all—no proxies, no headless browsers, no fingerprinting concerns.
Ideal Use Cases
This method works best when:
- Misconfigured Cloudflare Setup: The website administrators haven't properly restricted access to the origin server or haven't set up Origin CA certificates.
- Legacy Infrastructure: Older websites that added Cloudflare as an afterthought without updating their server configuration.
- Cost-Sensitive Projects: When you need free, unlimited access without spending on proxies or anti-bot bypass services.
- Simple Scraping Needs: When you just need the HTML content and don't require JavaScript rendering.
When NOT to Use This Method
Avoid the Origin Server Bypass when:
- Properly Configured Sites: Well-secured websites limit their origin servers to only accept traffic from Cloudflare IP ranges.
- Origin CA Certificates: Sites using Cloudflare's Origin CA certificates will reject direct connections.
- Dynamic Content: If the site relies heavily on Cloudflare's edge features (Workers, caching), the origin may not serve the same content.
- Time Constraints: Finding the origin IP can be time-consuming with no guarantee of success.
Important Consideration
Even if you find what appears to be an origin server, it may be a development or staging server rather than the production server. Verify that the data matches the live site before building your scraping pipeline around it.
- Completely bypasses all Cloudflare anti-bot protection
- Free to use with no API costs or proxy fees
- No need for headless browsers or complex fingerprinting
- Simple HTTP requests work, making scraping fast and efficient
- No rate limiting from Cloudflare (though origin may have its own limits)
- Low success rate, most sites are properly configured
- Time-consuming to find origin IP with no guarantee of success
- Origin server may be restricted to Cloudflare IP ranges only
- Found server might be staging/development, not production
- Site admins can fix the vulnerability at any time, breaking your scraper
To validate the effectiveness of this bypass method, we tested whether we could find and access origin servers for our test domains.
Here are the performance results across the 20 domains:
| Domain | Status |
|---|---|
| indeed.com | FAIL |
| zillow.com | FAIL |
| realtor.com | FAIL |
| redfin.com | FAIL |
| glassdoor.com | FAIL |
| nike.com | FAIL |
| adidas.com | FAIL |
| bestbuy.com | FAIL |
| wayfair.com | FAIL |
| etsy.com | FAIL |
| Domain | Status |
|---|---|
| newegg.com | FAIL |
| skechers.com | FAIL |
| sneakersnstuff.com | FAIL |
| coinmarketcap.com | FAIL |
| coingecko.com | FAIL |
| investing.com | FAIL |
| etf.com | FAIL |
| mediamarkt.de | FAIL |
| pccomponentes.com | FAIL |
| controller.com | FAIL |
In our benchmark, none of the 20 test domains (0%) yielded a working origin bypass—every domain either hid the origin IP or rejected direct access. Most major websites properly configure their infrastructure to prevent direct origin access. When this method does work on a misconfigured site, it provides the easiest and most reliable bypass available.
To use the Origin Server Bypass Method, you need to find the IP address of the origin server and configure your scraper to send requests directly to it.
How to Find the Origin IP Address
There are several methods to find the origin IP address of a website's server:
Method 1: SSL Certificates
If the target website is using SSL certificates (most sites are), those SSL certificates are registered in the Censys database.
Although websites have deployed their website onto the Cloudflare CDN, sometimes their current or old SSL certificates are registered to the original server. You can look up the website in the Censys database and see if any of these servers host the origin website.
Method 2: DNS Records Of Other Services
Sometimes other subdomains, mail exchanger (MX) servers, FTP/SCP services or hostnames are hosted on the same server as the main website but haven't been protected by the Cloudflare network.
Check the DNS records for other subdomains or A, AAAA, CNAME, and MX DNS records that reveal the IP address of the main server using Censys or Shodan.
One trick: send an email to a non-existing email address at your target website (fakeemail@targetwebsite.com). Assuming the delivery fails, you should receive a notification from the email server which will contain the IP address (provided the website isn't using a 3rd party email provider).
Method 3: Old DNS Records
The DNS history of every server is available on the internet. Sometimes the website is still hosted on the same server as it was before they deployed it to the Cloudflare CDN. Tools like CrimeFlare maintain databases of likely origin servers derived from current and old DNS records.
Useful Tools
The following tools can help you find the original IP address of the server:
Example: Accessing the Origin Server
For example, the origin IP address of PetsAtHome.com, a Cloudflare protected site, is publicly accessible:
Origin IP Address --> 'http://88.211.26.45/'Step 1: Send requests to the origin IP
import requests
# Instead of requesting through Cloudflare# response = requests.get('https://www.petsathome.com/')
# Request directly to the origin serverresponse = requests.get('http://88.211.26.45/', headers={ 'Host': 'www.petsathome.com' # Important: Set the Host header})
print(response.text)Step 2: Handle Host Headers
Sometimes accessing the website via the origin IP address by inserting it in your browser's address bar won't work, as the server may be expecting an HTTP Host header. When this is the case, you can query the origin server with a tool like curl or Postman which allows you to set Host headers, or add a static mapping to your hosts file.
# Using curl with Host headercurl -H "Host: www.targetsite.com" http://ORIGIN_IP_ADDRESS/This section answers some frequently asked questions about the Origin Server Bypass Method.
For more information about finding the IP addresses of origin servers, check out these guides:
- Bypassing Cloudflare WAF with the origin server IP address
- Introducing CFire: Evading CloudFlare Security Protections
- CloudFlair: Bypassing Cloudflare using Internet-wide scan data
This change log tracks any updates and revisions made to the Origin Server Bypass Method over time.
How To Bypass Cloudflare: Reverse Engineer Cloudflare Anti-Bot Protection
Option #8: Reverse Engineer Cloudflare Anti-Bot Protection
Reverse engineering means studying Cloudflare’s WAF, Bot Management, and challenge scripts, then implementing a minimal client that passes TLS, HTTP/2, header, and JS checks yourself—no hosted proxy or full browser farm unless you choose to add one.
This approach involves deeply analyzing Cloudflare's Web Application Firewall (WAF) and Bot Manager to understand exactly how they detect bots, then building a custom bypass that passes all their checks without relying on resource-heavy headless browsers.
The goal is to create the most resource-efficient Cloudflare bypass possible—one solely designed to pass Cloudflare's TLS, HTTP/2, browser header, and JavaScript fingerprint tests using lightweight HTTP requests.
This is what many smart proxy solutions do internally. They've invested heavily in reverse engineering Cloudflare's detection systems so their customers don't have to.
Cloudflare's bot detection can be split into two categories:
| Category | Description | Techniques |
|---|---|---|
| Backend Detection | Server-side fingerprinting before the page loads | IP reputation, HTTP headers, TLS/HTTP2 fingerprints |
| Client-Side Detection | Browser-based challenges after the page loads | JavaScript challenges, canvas fingerprinting, event tracking, CAPTCHAs |
To fully bypass Cloudflare, you must pass both sets of verification tests.
This method is not recommended for most developers. It's an extreme approach reserved for very specific situations where the engineering investment makes economic sense.
Ideal Use Cases
This method works best when:
- Massive Scale Operations: Companies scraping 500M+ pages per month where browser instance costs become prohibitive.
- Building Proxy Infrastructure: Smart proxy providers who need cost-effective bypasses as their core business.
- Intellectual Challenge: Researchers or developers genuinely interested in understanding sophisticated anti-bot systems.
- Maximum Resource Efficiency: When you need the absolute lowest resource footprint per request.
When NOT to Use This Method
Avoid reverse engineering when:
- Any Other Option Works: If smart proxies, fortified browsers, or solvers meet your needs, use them instead.
- Time-Sensitive Projects: This approach can take weeks or months to implement successfully.
- Limited Engineering Resources: You need dedicated, skilled engineers to build and maintain the bypass.
- Small to Medium Scale: The cost savings don't justify the engineering investment below enterprise scale.
Why Most People Shouldn't Do This
For most developers, you are better off using one of the other six Cloudflare bypassing methods. The engineering effort required is substantial:
- You must dive deep into an anti-bot system that has been purposefully obfuscated
- You need to continuously split test different techniques to find what works
- You must maintain the system as Cloudflare evolves their protection (which they do regularly)
The economic returns from having a more cost-effective Cloudflare bypass must warrant the days or weeks of engineering time you'll devote to building and maintaining it.
- Most resource-efficient bypass possible (no browser overhead)
- Lowest cost per request at extreme scale
- Full control over every aspect of the bypass
- Deep understanding of anti-bot systems
- Can be faster than browser-based approaches
- Extremely difficult to implement correctly
- Requires weeks or months of engineering effort
- Needs continuous maintenance as Cloudflare evolves
- Must understand TLS, HTTP/2, and JavaScript internals
- High risk of wasted effort if bypass stops working
- Not practical for most use cases
Unlike other methods in this guide, we did not performance test reverse engineering approaches across our test domains. The nature of this method makes standardized testing impractical:
- Each implementation is unique: Reverse engineered bypasses are custom-built, making comparison meaningless
- Labor intensive to replicate: Building even one working bypass would require significant engineering effort
- Constantly changing target: Any specific bypass technique may stop working as Cloudflare updates
What we know from the industry:
| Aspect | Reality |
|---|---|
| Success Rate | Highly variable—depends entirely on implementation quality |
| Domain Coverage | Can theoretically achieve near-100% if done correctly |
| Maintenance Burden | Requires ongoing updates as Cloudflare evolves |
| Cost Efficiency | Most efficient at scale, but high upfront investment |
Recommendation: Unless you're operating at massive scale or building proxy infrastructure, use Smart Proxies with Built-in Bypass instead—they've already done the reverse engineering for you. For lightweight bypass, try TLS Impersonation first.
For those who do want to take the plunge, here's a breakdown of Cloudflare's detection mechanisms and what you'll need to bypass.
Passing Backend Detection
These are the server-side fingerprinting techniques Cloudflare performs before your browser even loads:
#1: IP Reputation Scoring
Cloudflare computes a reputation score for every IP address, considering:
- Known bot network associations
- Geographic location and ISP
- Historical reputation data
- VPN/proxy detection
Solution: Use high-quality residential or mobile proxies. Datacenter proxies can work but need to be clean IPs with no bot history.
#2: HTTP Browser Headers
Cloudflare analyzes your headers against known browser patterns. Most HTTP clients send identifying headers by default.
Solution: Override all headers with a complete, consistent browser header set. Use our header optimization guide and Fake Browser Headers API to generate realistic headers.
#3: TLS & HTTP/2 Fingerprints
Every HTTP client generates unique TLS and HTTP/2 fingerprints. Cloudflare compares these against your claimed browser identity.
Solution: This is the hard part. You need:
- Libraries like CycleTLS, curl_cffi, or utls to spoof fingerprints
- Languages with low-level control (Go, Rust) or specialized Python/Node bindings
- Captured fingerprints from real browsers to impersonate
Key Resources:
Passing Client-Side Detection
These challenges occur on Cloudflare's "checking your browser" page:

#1: Browser Web APIs
Cloudflare queries hundreds of browser APIs to verify your environment:
| Check Type | Example | Detection |
|---|---|---|
| Browser-Specific | window.chrome | Must exist for Chrome user-agents |
| Automation Signals | navigator.webdriver | Must be false or undefined |
| Sandbox Detection | process object | Only exists in Node.js |
| Environment Mismatch | navigator.platform | Must match user-agent OS |
#2: Canvas Fingerprinting
Cloudflare uses Google's Picasso Fingerprinting to classify devices via HTML5 canvas rendering. Your canvas fingerprint must match your claimed browser/OS combination.
#3: Event Tracking
Cloudflare monitors mouse movements, clicks, and keypresses. Automated interactions without natural mouse movement are flagged.
#4: CAPTCHAs
When Cloudflare assigns a high risk score, it shows hCaptcha challenges. These require human solving services and make scraping slow and expensive.
Building A Low-Level Bypass
To build a bypass without a headless browser, you'll need to:
- Intercept network requests when Cloudflare loads the Waiting Room page
- Deobfuscate Cloudflare's code (heavily obfuscated JavaScript)
- Decrypt the JavaScript challenges contained in the code
- Understand the challenge logic and what responses are expected
- Build a solver that returns correct results
Example: Deobfuscated Browser Detection
Here's a snippet of Cloudflare's browser API checks after deobfuscation:
function _0x15ee4f(_0x4daef8) { return { /* .. */ wb: !(!_0x4daef8.navigator || !_0x4daef8.navigator.webdriver), wp: !(!_0x4daef8.callPhantom && !_0x4daef8._phantom), wn: !!_0x4daef8.__nightmare, ch: !!_0x4daef8.chrome, ws: !!( _0x4daef8.document.__selenium_unwrapped || _0x4daef8.document.__webdriver_evaluate || _0x4daef8.document.__driver_evaluate ), wd: !(!_0x4daef8.domAutomation && !_0x4daef8.domAutomationController), }; }This checks for Selenium (ws), PhantomJS (wp), Nightmare (wn), Chrome presence (ch), and webdriver flags (wb).
Implementation Approaches:
| Approach | Complexity | Use Case |
|---|---|---|
| Fortified Browser | Medium | Handles most challenges automatically |
| Sandbox Emulation (JSDOM) | High | Less resource-intensive than browser |
| Pure Algorithm | Extreme | Maximum efficiency, minimum resources |
For those wanting to dive deeper into reverse engineering anti-bot systems:
TLS & HTTP/2 Fingerprinting:
- Passive Fingerprinting of HTTP/2 Clients (Akamai, 2017)
- What happens in a TLS handshake? (Cloudflare)
- TLS Fingerprinting with JA3 and JA3S
Fingerprint Spoofing Libraries:
- curl_cffi - Python library with TLS fingerprint impersonation
- CycleTLS - Go/Node.js TLS fingerprint spoofing
- utls - Go library for TLS fingerprint customization
- got-scraping - Node.js HTTP client with fingerprint support
Browser Fingerprinting:
- BrowserLeaks - Test your browser's fingerprint
- CreepJS - Advanced fingerprinting demonstration
- Browser Fingerprinting Guide
This change log tracks any updates and revisions made to the Reverse Engineering Method over time.
More Web Scraping Guides
So when it comes to bypassing Cloudflare you have multiple options. Some are pretty quick and easy, others are a lot more complex. Each with their own tradeoffs.
If you would like to learn how to scrape some popular websites then check out our other How To Scrape Guides:
Or if you would like to learn more about web scraping in general, then be sure to check out The Web Scraping Playbook, or check out one of our more in-depth guides:
- How To Solve 403 Forbidden Errors When Web Scraping — the deeper-dive companion guide that covers fixing 403 responses across HTTP libraries, including the ones returned by Cloudflare.
- 7 Best AI Web Scraping Tools (2026) — LLM-powered extraction when traditional parsers are too brittle.
- How To Bypass DataDome — DataDome shares a lot of detection ideas with Cloudflare, but the practical bypasses are different.
- How to Scrape The Web Without Getting Blocked Guide
- The Ethics of Web Scraping
Then check out ScrapeOps, the complete toolkit for web scraping.