Use Cases

Headless Browser CAPTCHA Issues and Solutions

Headless browsers trigger CAPTCHAs more often than regular browsers. Sites detect headless Chrome, Firefox, and WebKit through JavaScript fingerprinting and serve challenges to block automation. Here's how to handle each issue.

Why Headless Browsers Get More CAPTCHAs

Detection Method What Sites Check
navigator.webdriver Set to true in headless mode
Window dimensions Headless often uses 800x600 default
WebGL renderer Headless returns "SwiftShader"
Chrome DevTools Protocol CDP port open
Missing plugins No PDF viewer, Flash, etc.
Permissions API Different responses in headless
User-Agent string "HeadlessChrome" substring

When these signals combine, anti-bot systems (reCAPTCHA, Cloudflare, DataDome) assign lower trust scores and show CAPTCHAs.

Solution 1: Solve CAPTCHAs via API

Instead of trying to avoid CAPTCHAs entirely, solve them when they appear. CaptchaAI works with any headless browser because it solves CAPTCHAs server-side.

Selenium (Python)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
import time

API_KEY = "YOUR_API_KEY"

options = Options()
options.add_argument("--headless=new")
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)

driver.get("https://example.com/login")

# Check for CAPTCHA
recaptcha = driver.find_elements("class name", "g-recaptcha")
if recaptcha:
    site_key = recaptcha[0].get_attribute("data-sitekey")

    # Solve via CaptchaAI
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY, "method": "userrecaptcha",
        "googlekey": site_key, "pageurl": driver.current_url
    })
    task_id = resp.text.split("|")[1]

    while True:
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY": continue
        token = result.text.split("|")[1]
        break

    # Inject token
    driver.execute_script(
        f"document.getElementById('g-recaptcha-response').innerHTML = '{token}';"
    )
    driver.find_element("css selector", "form").submit()

Puppeteer (Node.js)

const puppeteer = require("puppeteer");
const axios = require("axios");

const API_KEY = "YOUR_API_KEY";

const browser = await puppeteer.launch({ headless: "new" });
const page = await browser.newPage();
await page.goto("https://example.com/login");

// Check for CAPTCHA
const siteKey = await page
  .$eval(".g-recaptcha", (el) => el.getAttribute("data-sitekey"))
  .catch(() => null);

if (siteKey) {
  const submit = await axios.get("https://ocr.captchaai.com/in.php", {
    params: {
      key: API_KEY,
      method: "userrecaptcha",
      googlekey: siteKey,
      pageurl: page.url(),
    },
  });
  const taskId = submit.data.split("|")[1];

  let token;
  while (true) {
    await new Promise((r) => setTimeout(r, 5000));
    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: taskId },
    });
    if (result.data === "CAPCHA_NOT_READY") continue;
    token = result.data.split("|")[1];
    break;
  }

  await page.evaluate((t) => {
    document.getElementById("g-recaptcha-response").innerHTML = t;
  }, token);
  await page.click('button[type="submit"]');
}

Solution 2: Reduce CAPTCHA Frequency

While you can always solve CAPTCHAs via API, reducing how often they appear saves time and cost.

Patch navigator.webdriver

# Selenium
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
// Puppeteer
await page.evaluateOnNewDocument(() => {
  Object.defineProperty(navigator, "webdriver", { get: () => false });
});

Set Realistic Window Size

# Selenium
driver.set_window_size(1920, 1080)
// Puppeteer
await page.setViewport({ width: 1920, height: 1080 });

Use Stealth Plugins

# Puppeteer
npm install puppeteer-extra puppeteer-extra-plugin-stealth
const puppeteer = require("puppeteer-extra");
const StealthPlugin = require("puppeteer-extra-plugin-stealth");
puppeteer.use(StealthPlugin());
# Selenium
pip install undetected-chromedriver
import undetected_chromedriver as uc
driver = uc.Chrome(headless=True)

Solution 3: Cloudflare Challenge Handling

Cloudflare challenge pages require more than a token — you need the cf_clearance cookie:

# CaptchaAI handles full Cloudflare challenges
resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "cloudflare_challenge",
    "pageurl": "https://example.com",
    "proxy": "http://user:pass@proxy:port",
    "proxytype": "HTTP"
})
task_id = resp.text.split("|")[1]

# Result includes cf_clearance cookie and user_agent
# Use both to make subsequent requests

Common Issues by Browser

Browser Issue Fix
Headless Chrome navigator.webdriver = true Use --disable-blink-features flag
Puppeteer Missing browser plugins Use puppeteer-extra-plugin-stealth
Selenium enable-automation switch excludeSwitches: ["enable-automation"]
Playwright WebKit fingerprint Use Chromium channel with stealth patches
All Consistent viewport size Set to 1920x1080 or randomize

FAQ

Is headless mode always detected?

Not always. With proper stealth configuration, many sites won't flag your headless browser. But sophisticated anti-bot systems (Cloudflare, PerimeterX) can still detect headless mode through advanced fingerprinting.

Should I use headed mode instead?

Headed mode reduces detection but requires a display server (Xvfb on Linux). CaptchaAI's API approach works regardless of headed/headless mode, making it the more reliable solution.

Can I avoid CAPTCHAs entirely?

Not reliably. Even well-configured headless browsers eventually trigger CAPTCHAs at scale. Using CaptchaAI as a CAPTCHA handling layer ensures your automation continues when challenges appear.

Discussions (0)

No comments yet.

Related Posts

Comparisons ScrapingBee vs Building with CaptchaAI: When to Use Which
Compare Scraping Bee's -in-one scraping API with building your own solution using Captcha AI.

Compare Scraping Bee's all-in-one scraping API with building your own solution using Captcha AI. Cost, flexibi...

Python All CAPTCHA Types Web Scraping
Mar 16, 2026
Reference CAPTCHA Types Comparison Matrix 2025
Complete side-by-side comparison of every major CAPTCHA type in 2025 — re CAPTCHA, Turnstile, Gee Test, BLS, h Captcha, and image CAPTCHAs.

Complete side-by-side comparison of every major CAPTCHA type in 2025 — re CAPTCHA, Turnstile, Gee Test, BLS, h...

All CAPTCHA Types Web Scraping
Mar 31, 2026
Use Cases Proxy Rotation for CAPTCHA Scraping
How to combine proxy rotation with Captcha AI to reduce CAPTCHA frequency and maintain scraping reliability.

How to combine proxy rotation with Captcha AI to reduce CAPTCHA frequency and maintain scraping reliability.

All CAPTCHA Types Web Scraping Proxies
Feb 28, 2026
Explainers Rate Limiting CAPTCHA Solving Workflows
Sending too many requests too fast triggers blocks, bans, and wasted CAPTCHA solves.

Sending too many requests too fast triggers blocks, bans, and wasted CAPTCHA solves. Smart rate limiting keeps...

Automation Python All CAPTCHA Types
Apr 04, 2026
Tutorials Dynamic CAPTCHA Loading: Detecting Lazy-Loaded CAPTCHAs
Detect and solve CAPTCHAs that load dynamically after user interaction — Mutation Observer, scroll triggers, and event-based rendering.

Detect and solve CAPTCHAs that load dynamically after user interaction — Mutation Observer, scroll triggers, a...

Python All CAPTCHA Types Web Scraping
Apr 03, 2026
Reference Complete Guide: CAPTCHA Solving from Basics to Production
End-to-end guide covering CAPTCHA fundamentals, solving approaches, API integration, error handling, scaling, and production deployment with Captcha AI.

End-to-end guide covering CAPTCHA fundamentals, solving approaches, API integration, error handling, scaling,...

Python All CAPTCHA Types Web Scraping
Jan 13, 2026
Explainers IP Reputation and CAPTCHA Solving: Best Practices
Manage IP reputation for CAPTCHA solving workflows.

Manage IP reputation for CAPTCHA solving workflows. Understand IP scoring, proxy rotation, and how IP quality...

Python All CAPTCHA Types Web Scraping
Mar 23, 2026
API Tutorials Building a Custom Scraping Framework with CaptchaAI
Build a modular scraping framework with built-in Captcha AI CAPTCHA solving.

Build a modular scraping framework with built-in Captcha AI CAPTCHA solving. Queue management, middleware pipe...

Python All CAPTCHA Types Web Scraping
Feb 27, 2026
Use Cases Real Estate Data Scraping with CAPTCHA Handling
Automate real estate listing data collection from CAPTCHA-protected property sites using Captcha AI.

Automate real estate listing data collection from CAPTCHA-protected property sites using Captcha AI.

All CAPTCHA Types Web Scraping
Mar 28, 2026
Reference CAPTCHA Glossary: Complete Developer Reference
Complete glossary of CAPTCHA terms, concepts, and acronyms for developers.

Complete glossary of CAPTCHA terms, concepts, and acronyms for developers. From API keys to zero-click challen...

All CAPTCHA Types Web Scraping
Mar 12, 2026
Use Cases Retail Site Data Collection with CAPTCHA Handling
Amazon uses image CAPTCHAs to block automated access.

Amazon uses image CAPTCHAs to block automated access. When you hit their anti-bot threshold, you'll see a page...

Web Scraping Image OCR
Apr 07, 2026
Use Cases CAPTCHA Solving in Ticket Purchase Automation
How to handle CAPTCHAs on ticketing platforms Ticketmaster, AXS, and event sites using Captcha AI for automated purchasing workflows.

How to handle CAPTCHAs on ticketing platforms Ticketmaster, AXS, and event sites using Captcha AI for automate...

Automation Python reCAPTCHA v2
Feb 25, 2026
Use Cases Event Ticket Monitoring with CAPTCHA Handling
Build an event ticket availability monitor that handles CAPTCHAs using Captcha AI.

Build an event ticket availability monitor that handles CAPTCHAs using Captcha AI. Python workflow for checkin...

Automation Python reCAPTCHA v2
Jan 17, 2026