Back to blog
Web Scraping·July 21, 2026·14 min read

How to Reduce Browser Fingerprint Detection in 2026

Learn strategies for avoiding browser fingerprint detection with canvas/WebGL spoofing, TLS rotation, proxy-geo alignment, and when managed anti-bot infrastructure scales better than DIY.

A

Arun Singh

Anakin Team

Eight browser signal lines converging into one glowing fingerprint hash, illustrating how canvas, TLS, navigator, and other signals combine into a single identifying browser fingerprint

Reducing browser fingerprint detection comes down to consistency. Canvas and WebGL output, the TLS handshake, the proxy's country and the browser's timezone and locale all have to tell the same story, session after session. Anti-bot systems combine those signals into one fingerprint, so a single mismatch can flag a bot even when automation flags are hidden. This guide walks through each layer, from DIY stealth scripts to managed infrastructure, and where the cost of maintaining them tips the balance.

Key takeaways

  • Browser fingerprinting combines canvas hash, WebGL renderer, screen resolution, timezone, fonts, and navigator properties into persistent identifiers that reveal automation
  • Stealth plugins patch automation flags but require manual scripting for fingerprint consistency across sessions: canvas noise, TLS rotation, and proxy-geo alignment must be configured separately
  • Network-layer defenses validate that proxy IP geolocation matches browser timezone and locale before requests execute to prevent mismatches that expose spoofing
  • DIY fingerprint maintenance gets expensive past roughly 1,000 requests a day, because anti-bot vendors keep changing what they check
  • Session warming with organic navigation establishes cookies and localStorage state required for authenticated scraping workflows

How browser fingerprinting detects automation

Browser fingerprinting detects bots by combining signals (canvas hash, WebGL renderer, screen resolution, timezone, fonts, navigator properties) into a unique identifier that persists across sessions. Naive automation fails because it exposes a two-layer detection surface: automation flags (navigator.webdriver, missing plugins) combine with fingerprint inconsistencies (mismatched timezone/IP geo, identical canvas hashes) to isolate non-human traffic. Defense needs several layers at once: canvas/WebGL spoofing, TLS rotation, proxy-locale alignment, and behavioral simulation-alongside managed infrastructure for production volume.

What is browser fingerprinting?

Browser fingerprinting recognizes a browser by combining technical attributes the browser already exposes, canvas rendering, installed fonts, screen size, and timezone, into a distinctive signature without setting a cookie. The W3C's fingerprinting guidance explains how these exposed values add up to an identifier. A typical collection script reads canvas hash (pixel-level rendering differences from GPU and font stacks), WebGL renderer string, screen dimensions, installed fonts, navigator.userAgent, navigator.platform, timezone offset, language preferences, and hardware concurrency. Two laptops bought the same day render the same canvas test image with measurable pixel-level differences because their GPUs and fonts diverge.

Why headless automation triggers detection

Automation flags expose headless browsers: navigator.webdriver returns true, plugin arrays remain empty, and timezone/locale mismatches with IP geolocation reveal proxy routing. When these flags combine with fingerprint inconsistencies, identical canvas hashes across sessions, missing WebGL details, or TLS fingerprints inconsistent with the declared user-agent, detection systems isolate non-human traffic. Modern web applications face continuous automated abuse (credential stuffing, content scraping, inventory hoarding) that OWASP's Automated Threats project catalogues as distinct from DDoS.

The two-layer defense model

Small-scale workflows use stealth scripting (Puppeteer-extra, Playwright stealth) to spoof automation flags and randomize fingerprints. Production volume requires managed infrastructure: Anakin's URL Scraper handles JavaScript-heavy SPAs, anti-bot detection, and CAPTCHAs through Camoufox (stealth Firefox) backed by a Thompson-sampling proxy router, abstracting authentication and extraction flows into a catalog of pre-built actions. The choice depends on throughput: stealth plugins suffice for exploratory projects; API-first platforms handle structured data retrieval, async job patterns, and session management at scale.

Knowing the signals is half the job. The other half is spoofing them in a way that stays consistent from one session to the next.

Core fingerprint evasion techniques

Anti-bot systems hash device-level signals into a fingerprint, so evasion works on two fronts: inside the browser (canvas and WebGL signatures, human-like timing) and on the network (a TLS profile that matches the claimed browser, covered in the network-layer section below). Miss either one and the other stops helping.

Canvas and WebGL fingerprint spoofing

Canvas fingerprints are generated from pixel-level rendering output, uniquely identifying the GPU/driver combination. Brave's fingerprinting protection randomizes canvas values from a seed that changes per session and per site, injecting imperceivable noise that poisons hash-based tracking while maintaining visual consistency within a session. WebGL fingerprints expose UNMASKED_RENDERER_WEBGL and UNMASKED_VENDOR_WEBGL strings. Effective spoofing changes these strings but keeps they match plausible hardware configurations, since a laptop GPU paired with a server-class renderer string is its own red flag.

Production challenge: fingerprint drift. GPU driver updates or OS patches change canvas hashes mid-workflow, breaking session continuity. Vastel's USENIX research demonstrates that altered fingerprints introduce inconsistencies that detection systems exploit to identify countermeasures. Platforms like Anakin handle anti-bot detection and headless browser execution by managing browser sessions at the infrastructure layer, isolating drift from user workflows.

// Inject per-session canvas noise before page navigation (Playwright example)
await page.addInitScript(() => {
  // One seed per session: the same drawing hashes the same way all session,
  // and a new session gets a different hash (the approach Brave describes).
  const seed = Math.floor(Math.random() * 0xffffffff);
  const noise = (i) => {
    let x = (i ^ seed) >>> 0;
    x = Math.imul(x ^ (x >>> 16), 0x45d9f3b) >>> 0;
    x = Math.imul(x ^ (x >>> 16), 0x45d9f3b) >>> 0;
    return ((x ^ (x >>> 16)) % 3) - 1; // -1, 0 or +1
  };

  // Add noise to a copy, so the page's own canvas is never modified
  const noisyCopy = (src) => {
    const ctx = src.getContext('2d');
    if (!ctx || !src.width || !src.height) return src; // skip WebGL/empty canvases
    const img = ctx.getImageData(0, 0, src.width, src.height);
    for (let i = 0; i < img.data.length; i += 4) {
      img.data[i]     += noise(i);     // R
      img.data[i + 1] += noise(i + 1); // G
      img.data[i + 2] += noise(i + 2); // B
    }
    const copy = document.createElement('canvas');
    copy.width = src.width;
    copy.height = src.height;
    copy.getContext('2d').putImageData(img, 0, 0);
    return copy;
  };

  const origToDataURL = HTMLCanvasElement.prototype.toDataURL;
  HTMLCanvasElement.prototype.toDataURL = function (...args) {
    return origToDataURL.apply(noisyCopy(this), args);
  };
  const origToBlob = HTMLCanvasElement.prototype.toBlob;
  HTMLCanvasElement.prototype.toBlob = function (...args) {
    return origToBlob.apply(noisyCopy(this), args);
  };
});
Diagram comparing four identical canvas fingerprint renders producing the same hash against four noise-injected renders each producing a different hash

Behavioral simulation: timing and mouse movement

Behavioral fingerprinting analyzes mouse movement variance, scroll timing, and request pacing. Straight-line cursor paths, fixed scroll intervals, and uniform request timing all signal automation. ScraperAPI's bot detection guide recommends simulating real behavior: random reading pauses, scrolling in small steps with random delays, and randomized gaps between requests. Curved (Bézier) mouse paths take the same idea to the cursor. Paired with canvas/WebGL spoofing and a matching TLS profile, behavioral simulation closes the last gap that static fingerprint checks leave open.

Doing all of this by hand takes tooling. Most teams start with a stealth framework.

Stealth browser automation: Puppeteer, Playwright, and anti-detect tools

Puppeteer-stealth and Playwright stealth mode

Stealth plugins for Puppeteer and Playwright work by patching browser automation flags that anti-bot systems commonly check. Browserless stealth routes apply fingerprint mitigations and entropy injection at the connection level, masking signals like `navigator.webdriver` and missing Chrome runtime objects. These patches handle the basic detection vectors, which is enough for low-volume workflows scraping sites with older bot-detection logic.

The limitation: stealth plugins don't automatically maintain fingerprint consistency across sessions. Canvas noise, WebGL renderer strings, TLS cipher order, and timezone-IP geo alignment must be scripted manually. When sites update detection logic to validate these parameters, stealth-plugin workflows break until developers patch the inconsistency, a reactive maintenance burden the plugin documentation rarely surfaces.

# Install
npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealth

# For Playwright
npm install playwright playwright-extra puppeteer-extra-plugin-stealth
// Puppeteer
const puppeteer = require('puppeteer-extra')
const StealthPlugin = require('puppeteer-extra-plugin-stealth')
puppeteer.use(StealthPlugin())

;(async () => {
  const browser = await puppeteer.launch({ headless: true })
  const page = await browser.newPage()
  await page.goto('https://target-site.com')
  await browser.close()
})()

// -------------------------------------------------

// Playwright (same stealth plugin, different import; run as a separate file)
const { chromium } = require('playwright-extra')
const stealth = require('puppeteer-extra-plugin-stealth')()
chromium.use(stealth)

;(async () => {
  const browser = await chromium.launch({ headless: true })
  const page = await browser.newPage()
  await page.goto('https://target-site.com')
  await browser.close()
})()
Illustration showing seven exposed browser automation signals dropping to zero after installing the puppeteer-extra-plugin-stealth plugin

Anti-detect browsers vs. stealth plugins

Anti-detect browsers, such as the open-source VeilBrowse profile manager for Linux, provide isolated profiles with per-profile fingerprint spoofing, proxy pools, and GUI-based session monitoring. These tools suit manual work (QA, account testing, ad verification) where human operators interact with the browser UI. Headless scripting workflows gain little from the GUI layer; stealth plugins are lighter when the goal is programmatic data extraction at scale.

Maintenance cost: keeping every parameter aligned

DIY fingerprint evasion requires continuous alignment across device emulation, geolocation, timezone, and locale settings. Four maintenance tasks keep coming back:

  1. Monitor site detection updates: track when target sites deploy new bot-detection vendors or add fingerprint validation rules.
  2. Patch canvas and WebGL spoofing logic: update noise-injection code when detection systems fingerprint the noise pattern itself.
  3. Refresh TLS profiles: keep the handshake matched to current browser releases as sites start blocking outdated signatures.
  4. Validate proxy-fingerprint alignment before each workflow run: confirm timezone, locale, and IP geolocation match the spoofed device profile.

Anakin handles JavaScript rendering, proxy routing, geo selection, retries, and anti-bot handling at the infrastructure layer. Workflows call the URL Scraper endpoint with `useBrowser: true` when client-side rendering is required, and the platform manages fingerprint consistency, session rotation, and proxy-geo alignment. Browser Sessions extend this to authenticated pages, storing session state without credentials. The maintenance tasks above shift from developer code to platform responsibility, eliminating the recurring engineering cost of keeping spoofing parameters aligned. Teams that already own Playwright or Puppeteer scripts can keep them and point them at Anakin's Browser API instead: one WebSocket URL connects the existing code to a stealth browser with aligned fingerprint, locale and timezone signals.

# 1. Submit the job (returns {"jobId": "...", "status": "pending"})
curl -X POST https://api.anakin.io/v1/url-scraper \
  -H "X-API-Key: $ANAKIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://bot.sannysoft.com/",
    "useBrowser": true,
    "country": "gb",
    "formats": ["markdown"]
  }'

# 2. Poll until "status" is "completed"; the page is in the "markdown" field
curl https://api.anakin.io/v1/url-scraper/JOB_ID \
  -H "X-API-Key: $ANAKIN_API_KEY"
# Excerpt of the returned markdown, run on 25 Oct 2026 (country: gb)
WebDriver (New)       missing (passed)
WebDriver Advanced    passed
Languages             en-GB
WebGL Vendor          Google Inc. (Intel)
SELENIUM_DRIVER       ok
Canvas1 to Canvas5    Hash: -87736590 (same value in all five)

Browser-level spoofing still fails when the network tells a different story, which is where proxies and TLS come in.

Network-layer defenses: proxies, geo-routing, and TLS fingerprint rotation

Detection often starts at the network layer, before JavaScript executes or canvas rendering begins. Anti-bot systems validate proxy IP geolocation against browser timezone and locale settings, analyze TLS handshake patterns, and track request pacing to identify automated traffic. Misalignment at any layer triggers detection even when browser-level spoofing is perfect.

Residential proxies and geo-fingerprint alignment

Datacenter IPs with mismatched geolocation create detection signals that spoofed browser fingerprints cannot mask. An AWS us-east-1 IP paired with `navigator.language = 'hi-IN'` and `Intl.DateTimeFormat.resolvedOptions.timeZone = 'Asia/Kolkata'` exposes the mismatch instantly. Residential proxies with aligned timezone and locale settings reduce this detection vector by ensuring IP geolocation matches browser-reported location attributes.

Production scraping infrastructure validates alignment before submitting requests. Browser sessions routed through residential proxies in specific countries must set `navigator.language` and timezone to match the proxy's country code. Anakin's URL Scraper routes requests through 207 countries and territories. Its Browser API goes one step further: with ?country=GB, the timezone, locale, navigator.language and Accept-Language all match the UK exit IP (Europe/London and en-GB), so there is no geo-fingerprint config to maintain by hand.

// Pass the check into the page, so it runs in the browser context
const result = await page.evaluate(([expectedTZ, expectedLocale]) => {
  const tz     = Intl.DateTimeFormat().resolvedOptions().timeZone;
  const locale = navigator.language;

  if (!tz.startsWith(expectedTZ) || !locale.startsWith(expectedLocale)) {
    throw new Error(
      `Geo mismatch - tz: ${tz} (expected: ${expectedTZ}), ` +
      `locale: ${locale} (expected: ${expectedLocale})`
    );
  }
  return { tz, locale, aligned: true };
}, ['Europe/London', 'en-GB']); // UK residential proxy example

// { tz: 'Europe/London', locale: 'en-GB', aligned: true }
Three status cards showing IP country, timezone, and locale alignment checks, with a geo-mismatched session returning an HTTP 403 response

TLS fingerprint rotation at the transport layer

TLS fingerprinting (JA3/JA4) analyzes cipher suite order and extension combinations during the SSL handshake, before HTTP headers arrive. Bot-management products read it directly: Cloudflare, for example, exposes JA3 and JA4 fingerprints to its bot rules. Reusing the same TLS fingerprint across sessions creates a persistent tracking vector independent of IP rotation or cookie clearing. Rotating cipher suites and extension patterns per session breaks this linkability, but naive rotation that produces non-browser-like fingerprints gets flagged fast, and so does a JA3 that doesn't match the browser named in the User-Agent. Tools that impersonate real browser TLS handshakes (current Chrome and Firefox releases) reduce this vector by mirroring production browser configurations rather than generating synthetic patterns.

Rate limiting and IP rotation strategy

Request pacing patterns distinguish human browsing from automated scraping. Fixed one-second delays between requests create detectable rhythms; randomized intervals with exponential backoff on 429 errors match organic traffic patterns. IP rotation cadence matters: rotating proxies per request signals automation, while keeping the same IP for a whole session looks like ordinary browsing. Production infrastructure combines randomized request pacing with sticky-IP proxy pools to avoid rate-limit triggers and IP blocking.

Keeping all of these parameters aligned as detection systems change is real engineering work, and at some volume it costs more than paying for managed infrastructure.

When platform-managed anti-bot infrastructure scales better than DIY

At low volumes, custom fingerprint scripts are economical: a single engineer can keep canvas, WebGL and TLS spoofing current for a handful of target sites. Past roughly 1,000 requests a day across many sites, the burden shifts. Each anti-bot vendor checks its own mix of signals, session state must be warmed and persisted across login flows, and proxy-geo alignment needs IP diversity. At that point a URL Scraper request at 1 credit (the Pro plan is $19 a month for 5,000 credits) usually costs less than the engineering hours spent keeping spoofing current.

The maintenance cost tipping point

DIY fingerprint maintenance at 1,000+ req/day demands ongoing adjustments: anti-bot vendors change detection logic regularly, requiring engineers to reverse new checks, update spoofing libraries, and regression-test against 3-5 major vendors. In a 2020 study, more than 75% of protected sites defended against basic bots, forcing teams to maintain browser automation that passes JavaScript environment probes, and every vendor update means another round of fixes. When session reuse is required, teams must also build cookie/localStorage persistence, session-warming navigation, and expiry-handling logic. At scale, platform-managed infrastructure absorbs these updates automatically, eliminating the recurring maintenance window.

Session warming and cookie/localStorage state management

Authenticated scraping workflows require session warming, organic navigation through login flows to establish cookies and localStorage state before target-page requests. Anakin persists encrypted session cookies and localStorage server-side, retaining sessions for 90 days so subsequent requests reuse authenticated state without re-login. Warming means multi-step navigation (home → login form → POST credentials → dashboard → target page) to mimic human behavior; platforms automate this pattern, while DIY setups require custom Puppeteer scripts per site.

Comparison of a DIY browser session losing all state after one request against an Anakin browser session retaining six fingerprint-consistency layers

Comparing Anakin, Browserless, ScraperAPI, and Bright Data

Platform Pricing model Browser automation Anti-bot handling Residential proxies Session persistence
Anakin Credit-based URL Scraper browser mode; Browser API for Playwright/Puppeteer over CDP Stealth browser, geo-aligned fingerprint Routing in 207 countries; residential exits in 20+ (Browser API) Encrypted session persistence
Browserless Unit-based plans, free tier Puppeteer/Playwright API Stealth routes, automatic CAPTCHA solving Built-in residential and datacenter Persisted sessions
ScraperAPI Credit-based tiers JS rendering optional Auto retry + CAPTCHA solving Included Not disclosed
Bright Data Pay-as-you-go and plans Browser API Integrated with proxy network Residential + mobile Available
ZenRows Credit-based JS rendering, Browser product Auto anti-bot bypass Premium add-on Not disclosed
SOAX Monthly plans, free sandbox No browser API listed None (proxy-only) Residential IPs N/A

Values are editorial assessments based on each vendor's public pricing and docs as of 25 Oct 2026, not independently benchmarked figures.

Anakin fits teams running multi-session, geo-routed scraping where fingerprint consistency has to hold across long production workflows without manual scripting. Submit-a-URL jobs go through the URL Scraper; teams with existing Playwright or Puppeteer code connect it to the Browser API and keep their logic. Both handle session persistence and proxy-geo alignment, the parts DIY setups rebuild for every vendor change. Trade-off: for a few hundred requests a day against lightly protected sites, DIY can cost less. Browserless hosts Puppeteer/Playwright execution with its own stealth routes, and ScraperAPI suits teams who want a request-level API with optional JS rendering. Bright Data and ZenRows target workflows that need custom proxy configurations. SOAX serves proxy-first use cases. Reminder: fingerprint evasion can violate a site's Terms of Service, so verify compliance before implementation; Anakin does not provide legal advice.

Even a careful setup fails if parameters drift between sessions, so production workflows need a check that catches drift before a detector does.

Validating fingerprint consistency across sessions

Failure-mode taxonomy

What breaks first when fingerprint spoofing is incomplete:

  • Canvas hash leaks: inconsistent noise injection across sessions generates distinct canvas fingerprints that anti-bot systems flag as rotation patterns.
  • TLS mismatch: JA3 signature doesn't match the claimed browser User-Agent, exposing automation clients that spoof headers without matching TLS handshake.
  • Proxy-geo mismatch: IP geolocation doesn't align with browser timezone, locale, or language settings, signaling proxy use.
  • Behavioral timing anomalies: fixed request intervals, zero mouse movement, and deterministic event sequences reveal scripted automation rather than human interaction.

Testing fingerprint consistency

Validate fingerprint stability by running the same workflow 10+ times and checking that canvas hash, WebGL renderer, TLS fingerprint, and proxy-geo alignment remain consistent across sessions. Use the open-source antibot-detector tool to identify which fingerprinting technologies a target site deploys before implementing evasion techniques. A public test page such as bot.sannysoft.com shows the same checks from the detector's side (the run in the Anakin example above used it).

Only use browser mode when needed: standard scraping with Anakin is faster and cheaper. Reserve browser automation for JavaScript-heavy sites or workflows that require authenticated sessions.

Choosing between DIY stealth and managed infrastructure

DIY stealth scripting with Puppeteer-extra and anti-detect browsers offers maximum control over fingerprint parameters but requires continuous maintenance as sites update detection logic, which suits teams with engineering resources and low-volume workflows under 1,000 req/day. For production workflows above 1,000 requests a day, Anakin handles fingerprint consistency, session warming, and proxy rotation automatically, shifting the maintenance burden from your engineers to the platform.

Detection is moving past static fingerprints toward behavior (scroll variance, keystroke timing, multi-page navigation sequences). Each of those adds another thing to maintain, which pushes the economics further toward managed infrastructure for all but the most specialized use cases.

Test your fingerprint consistency across 10+ sessions using Anakin's managed browser automation with built-in proxy-geo alignment and session persistence, or connect your own Playwright script to the Browser API. The free tier's 300 credits cover a first test.

Frequently asked questions

What is browser fingerprinting and how does it detect bots?

Browser fingerprinting combines signals (canvas hash, WebGL renderer, screen resolution, timezone, fonts, navigator properties) into an identifier that persists across sessions. Automation flags like navigator.webdriver, empty plugin arrays, and timezone/locale mismatches with IP geolocation expose automation when combined with fingerprint inconsistencies.

Do stealth plugins like Puppeteer-extra eliminate fingerprint detection?

Stealth plugins patch automation flags like navigator.webdriver and chrome.runtime but don't automatically maintain fingerprint consistency across sessions. Canvas noise, WebGL renderer strings, TLS cipher order, and timezone-IP geo alignment must be scripted manually; plugins handle only the automation flags layer.

How do you align proxy geolocation with a browser fingerprint?

Validate that proxy IP geolocation matches browser timezone (Intl.DateTimeFormat.resolvedOptions.timeZone) and locale (navigator.language) before submitting requests. Datacenter IPs with mismatched geolocation create detection signals: an AWS us-east-1 IP paired with Asia/Kolkata timezone exposes the mismatch instantly. Use residential proxies with aligned geo regions.

When should a team use managed anti-bot infrastructure instead of DIY scripting?

As a rule of thumb, past about 1,000 requests a day, maintaining fingerprint parameters (canvas, WebGL, TLS, proxy-geo alignment, behavioral timing) by hand costs more engineering time than platform pricing. Anti-bot vendors keep changing their detection logic, which means continuous reverse-engineering and script updates. Managed infrastructure handles this maintenance layer automatically.

What breaks first when fingerprint spoofing is incomplete?

Canvas hash leaks from inconsistent noise injection expose the same GPU signature across sessions. TLS mismatch occurs when JA3 signature doesn't match the claimed browser version. Proxy-geo mismatch reveals itself when IP location doesn't align with browser timezone/locale. Behavioral timing anomalies from fixed request intervals complete the detection surface.

Can browser sessions be reused for authenticated scraping?

Session warming with organic navigation establishes cookies and localStorage state before target-page requests. Persist session data across requests and handle expiry; browser sessions can be retained for 90 days with proper state management. This approach reduces login overhead for multi-session workflows requiring authenticated access.

Is fingerprint evasion legal?

Fingerprint evasion techniques can violate site Terms of Service, so verify compliance before implementation. Legal boundaries vary by jurisdiction and use case; scraping public data differs from bypassing paywalls or accessing authenticated content. Consult legal counsel for your specific workflow; platforms do not provide legal advice.

Sources

  1. Mitigating Browser Fingerprinting in Web Specifications - w3.org (2025)
  2. Bot Management and Anti-Automation - OWASP Cheat Sheet Series - cheatsheetseries.owasp.org
  3. What Is Browser Fingerprinting? Methods + Defenses - shieldlabs.ai
  4. GitHub - potionxyz/veilbrowse: Electron + Playwright-based browser profile manager for Linux - github.com
  5. Anti-Bot and Browser Fingerprinting: Modern Web Scraping Strategies - agentlist.top (2026)
  6. Detecting Bot Detection: Prevalence, Techniques, and Implications for Web Measurement Research - arxiv.org (2026)
  7. Web Runner 2049: Evaluating Third-Party Anti-bot Services - pmc.ncbi.nlm.nih.gov
  8. GitHub - mihneamanolache/antibot-detector: Detects the presence of anti-bot and fingerprinting technologies on websites - github.com
  9. Fp-Scanner: The Privacy Implications of Browser Fingerprint Inconsistencies - usenix.org (2018)
  10. Fingerprinting defenses 2.0 - brave.com
  11. JA3/JA4 fingerprint - developers.cloudflare.com
  12. How to Bypass Bot Detection - scraperapi.com
  13. Stealth routes - docs.browserless.io