Bypass DataDome with BrowserQL

Introducing a dedicated scraping language and infrastructure, with minimal automation fingerprints

Bypass Datadome and other bot detectors
Click CAPTCHAs, even when nested in iframes and shadow DOMs
Reuse browsers to avoid repeated bot checks
Auto-humanized clicking, scrolling and typing
Success message
You have exceeded the request limit. Sign Up to continue.
You’ll see a screenshot of your page above
Pink Light

None of the usual automation fingerprints

Libraries like Puppeteer and Playwright are great, but Datadome can spot their mess of obvious fingerprints.

BrowserQL is a streamlined library, designed to leave as little trace as possible. Combined with premium hardware and proxies, it can even validate captchas within nested iframes.

No Need to Piece Together Various Stealth Techniques

You no longer have to experiment with various libraries and tactics to code your way around the bot detectors. Unlike testing libraries, we don't leave fingerprints all over the place that need clearing up.

Tell us the actions you want to perform and we'll do the rest. Below are just some of the ways we hide traces of automation compared to the same code in Playwright.

Let us bypass Datadome for you

# enter a URL and waitUntil, and we'll launch a stealth browser
# with all the typical techniques like rotating user agents,
# plus many subtle tactics you've never even heard of
mutation Cloudflare {
  goto(
    url: "https://dash.cloudflare.com/login"
    waitUntil: firstContentfulPaint
    ) {status}
 
  # BrowserQL will then look for and click any CAPTCHAs
  # you can also add humanized actions like clicking and typing
  typeEmail: type(
    selector: "form [data-testid='login-input-email']"
    text: "test@browserless.io"
    ) {selector}
  
  # You can generate a WebSocket endpoint with the reconnect command
  # and we'll keep the browser running until it hits the timeout
    returnEndpoint: reconnect(
    timeout: 5000
  ) {browserWSEndpoint}
}


Or, keep throwing together stealth tactics

// Load stealth plugins that are rarely updated
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
const { v4: uuidv4 } = require('uuid');
const randomUseragent = require('random-useragent');

puppeteer.use(StealthPlugin());

(async () => {
  // Manually configure a bunch of settings
  const browser = await puppeteer.launch({
    headless: false, // Set to true for headless mode
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-web-security',
      `--proxy-server=YOUR_PROXY_HERE`,
    ],
    defaultViewport: null,
  });

  const page = await browser.newPage();

  // Setup bot avoidance tactics such as rotating user agents
  const userAgent = randomUseragent.getRandom();
  await page.setUserAgent(userAgent || 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');

  await page.goto('https://dash.cloudflare.com/login', { waitUntil: 'networkidle2' });

  // Code some humanized interactions
  await page.mouse.move(100, 100);
  await page.waitForTimeout(500);
  await page.mouse.move(150, 200, { steps: 10 });

  const emailFieldSelector = "form [data-testid='login-input-email']";
  await page.waitForSelector(emailFieldSelector);

  const email = 'test@browserless.io';
  for (const char of email) {
    await page.type(emailFieldSelector, char);
    await page.waitForTimeout(100 + Math.random() * 100); // Random delay between keystrokes
  }

  await page.waitForTimeout(5000);
  await browser.close();
})();


Avoid the repeat bot checks while cutting proxy usage by 90%

BrowserQL can easily generate an endpoint, so you can use the same browser instance for multiple pages.
That let's you keep the cache and cookies, to avoid downloading excessive data like styles, while also being let straight through by detectors.
The WebSocket endpoint also means you can control an approved browser session with a library such as Playwright or Puppeteer.
See the Reconnect Docs

mutation reconnectExample {
  goto(
    url: "https://example.com", 
    waitUntil: networkIdle
  ) {
    status
  }

  # return either an endpoint for BrowserQL to reuse
  # or a WebSocket for other libraries or AIs
	returnEndpoint: reconnect(
    timeout: 5000
  ) {
  	browserQLEndpoint
  	browserWSEndpoint
  }
    
}

 

Write a simple query and we'll handle the details

Write the set of actions you want to perform, such as clicking, typing or extracting elements, with the relevant arguments and responses.
We'll handle all the details like waiting for elements, scrolling so it's visible, moving the mouse and searching through iframes.

# Name your script, give it a URL and define a wait condition if wanted
mutation exampleScript {
  goto(url: "https://www.example.com/", 
    waitUntil: firstContentfulPaint) {
    status
    time
  }
  
  # Name each function and choose an action such as typing, 
  # clicking or querying a selector, then define a response.
  
  itemPrice: text(
		selector: "[id='product-price']"){
    text
  }

  # We handle details such as waiting for the element, scrolling so
  # it's visible, mousing over to and clicking it, typing 
  # organically and interacting with iframes.

  customFunction: type(
  	selector: "form [data-testid='login-input-email']"
  	text: "test@browserless.io") {
    selector
  }
 

A specialized scraping IDE with live browser view

Sending requests to an API and crossing your fingers it works isn’t an ideal experience. Our scraping IDE gives you:
A live view of the browser running in our cloud, so no more “but it worked on my machine” feeling.
Bundled documentation and Chrome DevTools, to save you from window hopping.
An option to toggle interactivity with the browser you’re viewing
Copy-as-cURL for when you want to deploy the query in your stack.
That way with BrowserQL, you won’t get left with a 200 response but my mysteriously missing HTML.
Quote icon

Customer Stories

"Creating Puppeteer scripts was straightforward, but Chrome was annoying to manage with the container needing regular reboots. We found Browserless and within a few hours, everything was running smoothly. Years later, it's still happily running our HTML and PDF exports with minimal maintenance required."

Sebastien Rogier
Tech Lead, Semji

"Browserless helped us focus on the problem we were trying to solve, and less on scaling an automation infrastructure. Browserless's developer focused approach has been a key to us bringing our product to market at the speed we were able to do so. Joel and team are some of the most customer-centric partners I've worked with."

Scott Weinert
Co-Founder & CTO, Atomic
Arrow pointed left
Arrow pointed right

Ready to try the benefits of Browserless?