🎯 A customizable, anti-detection cloud browser powered by self-developed Chromium designed for web crawlers and AI Agents.👉Try Now
Back to Blog

Custom Browser Fingerprints: Control the Signals Sites Read

Sophia Martinez
Sophia Martinez

Specialist in Anti-Bot Strategies

07-Jul-2026

TL;DR:

  • A browser fingerprint is the set of signals a site reads to identify your browser — user agent, platform, screen, timezone, language, canvas and WebGL. When they disagree with each other, automation gets flagged.
  • Scrapeless Scraping Browser lets you set the fingerprint explicitly. Pass a fingerprint object and the cloud browser reports exactly those values, kept internally consistent.
  • The override is real, not cosmetic. In a live run, navigator.userAgent, navigator.platform (Win32), the resolved timezone (Asia/Hong_Kong), and navigator.language all came back as the values set — verified below.
  • Consistency is the point. A US user agent with a Hong Kong timezone and a datacenter IP is the mismatch anti-bot systems look for; set the fingerprint and egress to tell one coherent story.
  • It rides on a standard Puppeteer connection. The fingerprint is a query parameter on the WebSocket endpoint; your navigation code is unchanged.
  • Free to start. New Scrapeless accounts include free Scraping Browser runtime — sign up at app.scrapeless.com.

Introduction: the browser is telling on you

Every page you load reads a set of signals to decide what kind of client you are: the user agent string, the platform, the screen size, the language and timezone, and deeper values like the canvas and WebGL fingerprint. A real browser reports these consistently — a US-configured Chrome on Windows has a US-ish timezone, a matching platform, and a normal screen. Automation tends to leak a different story: a headless default here, a mismatched timezone there, a navigator.webdriver flag that no human browser sets.

Scrapeless Scraping Browser lets you set that story on purpose. You pass a fingerprint object when you open the session, and the cloud browser reports exactly those values — coherently, so the signals agree with each other. This guide covers the fingerprint fields, how to set them over a standard Puppeteer connection, and a live check that the override actually takes effect.


What you can control

  • User agent — the full UA string the browser reports.
  • PlatformWindows, macOS, or Linux, reflected in navigator.platform.
  • Screen — the reported width and height.
  • Localization — the timezone and the ordered list of languages.
  • Launch args — Chromium flags such as window size.

The values are kept internally consistent, so the browser doesn't report a Windows platform with a macOS user agent.


Why Scrapeless Scraping Browser

Scrapeless Scraping Browser is a customizable, anti-detection cloud browser designed for web crawlers and AI agents. For fingerprint control specifically, it brings:

  • Explicit fingerprint fields — user agent, platform, screen, timezone, and languages set per session.
  • Internal consistency — no navigator.webdriver tell, and the values you set agree with each other.
  • Residential proxies in 195+ countries — pair the fingerprint's region with matching egress so the two signals line up.
  • A standard Puppeteer connectionpuppeteer.connect() returns an ordinary Browser; the fingerprint is set on the endpoint URL.

Get your API key on the free plan at app.scrapeless.com.


Prerequisites

  • Node.js 18 or newer
  • A Scrapeless account and API key — sign up at app.scrapeless.com
  • Basic familiarity with Puppeteer

Install

bash Copy
npm install puppeteer-core
bash Copy
export SCRAPELESS_API_KEY="your_api_token_here"

Setting a fingerprint

Build the fingerprint object, URL-encode it, and pass it as the fingerprint query parameter on the WebSocket endpoint. Everything else is a normal Puppeteer session:

javascript Copy
import puppeteer from 'puppeteer-core';

const fingerprint = {
  userAgent:
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
  platform: 'Windows',
  screen: { width: 1280, height: 1024 },
  localization: { languages: ['en-US', 'en'], timezone: 'Asia/Hong_Kong' },
  args: { '--window-size': '1280,1024' },
};

const params = new URLSearchParams({
  token: process.env.SCRAPELESS_API_KEY,
  sessionTTL: '180',
  proxyCountry: 'ANY',
  fingerprint: encodeURIComponent(JSON.stringify(fingerprint)),
});

const browser = await puppeteer.connect({
  browserWSEndpoint: `wss://browser.scrapeless.com/api/v2/browser?${params}`,
});
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
await browser.close();

Confirming the override took effect

Read the signals back from inside the page to confirm they match what you set:

javascript Copy
const reported = await page.evaluate(() => ({
  userAgent: navigator.userAgent,
  platform: navigator.platform,
  timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
  language: navigator.language,
}));
console.log(reported);
// {
//   userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) … Chrome/134.0.0.0 Safari/537.36",
//   platform: "Win32",
//   timezone: "Asia/Hong_Kong",
//   language: "en-US"
// }

In a live run, all four came back as the fingerprint's values — the user agent verbatim, platform as Win32 (from platform: 'Windows'), the resolved timezone as Asia/Hong_Kong, and the language as en-US. The override reaches the JavaScript environment the page actually reads, not just the request header.

Get your API key on the free plan: app.scrapeless.com


Make the signals agree

A fingerprint helps only when its parts tell one story. The common mismatches that get a session flagged:

  • Timezone vs. IP — a Hong Kong timezone behind US egress reads as inconsistent. Set proxyCountry to a region that matches the timezone and languages, or set the timezone to match the egress. Timezone handling follows the IANA zones referenced by the Intl.DateTimeFormat API.
  • Platform vs. user agent — a Windows platform with a macOS UA string is a contradiction. Keep the platform field and the UA's OS token aligned; the UA grammar is defined in the HTTP semantics specification.
  • Language vs. region — order languages the way a user in that region would, with the primary locale first.
  • Screen vs. window — keep the screen dimensions and the --window-size arg sensible for the device you're impersonating.

These signals are exactly the kind of automated-client tells catalogued in the OWASP Automated Threats project — coherence across them is what a real browser has and a careless bot doesn't.


Advanced patterns

Rotate fingerprints across sessions, not within one. Keep a fingerprint stable for the life of a session so the story doesn't change mid-visit; vary it between sessions instead.

Pin egress to the fingerprint's region. Set proxyCountry (and proxyState/proxyCity when needed) to match the timezone and languages you chose.

Persist an identity with a profile. When you need the same identity across runs, pair the fingerprint with a browser profile so cookies and storage carry over.

Keep it plausible. A fingerprint that no real device would produce is as suspicious as a default one — use values that describe a browser that actually exists.


Conclusion: one coherent identity

A custom fingerprint is not a single trick — it's the difference between a browser that reports one consistent identity and one that contradicts itself. Set the user agent, platform, screen, timezone, and languages together, pin egress to match, and the values a site reads agree the way a real browser's do. Pair it with the Scraping Browser session controls and residential egress, read up on why IP reputation matters, and the docs cover every field.


Ready to Build Your AI-Powered Data Pipeline?

Join our community to claim a free plan and connect with developers building anti-detection workflows: Discord · Telegram.

Sign up at app.scrapeless.com for free Scraping Browser runtime, and see pricing for scale.


FAQ

Q: What is a browser fingerprint?
The set of signals a site reads to identify your browser — user agent, platform, screen size, timezone, language, and deeper values like canvas and WebGL. Sites combine them into an identifier and flag combinations that don't look like a real device.

Q: Does setting the fingerprint actually change what the page sees?
Yes. In a live run, navigator.userAgent, navigator.platform, the resolved timezone, and navigator.language all returned the values set on the session — the override reaches the JavaScript environment, not just the request header.

Q: Should the timezone match the proxy country?
Yes. A timezone that contradicts the exit IP's region is a common flag. Set proxyCountry to match the fingerprint's timezone and languages, or set the timezone to match the egress.

Q: Can I rotate fingerprints?
Rotate between sessions, not within one. A fingerprint that changes mid-session is itself a signal; keep it stable per session and vary it across sessions.

Q: Do I need an AI agent or SDK for this?
No. The fingerprint is a query parameter on the standard Puppeteer WebSocket endpoint — plain puppeteer.connect(), no agent required.

At Scrapeless, we only access publicly available data while strictly complying with applicable laws, regulations, and website privacy policies. The content in this blog is for demonstration purposes only and does not involve any illegal or infringing activities. We make no guarantees and disclaim all liability for the use of information from this blog or third-party links. Before engaging in any scraping activities, consult your legal advisor and review the target website's terms of service or obtain the necessary permissions.

Most Popular Articles

Catalogue