Fingerprinting
Every SessionKit session gets a unique, consistent browser fingerprint that makes it indistinguishable from a real user's browser.
How It Works
When you set fingerprint: 'auto', SessionKit's fingerprint engine:
- Selects a realistic device profile (OS, screen size, GPU)
- Generates consistent values for all fingerprinting vectors
- Applies the fingerprint before any page loads
- Maintains consistency across navigations within the session
Fingerprint Modes
Auto Mode (Recommended)
const session = await sk.sessions.create({
fingerprint: 'auto',
})
Generates a random but realistic fingerprint. Best for most use cases.
Custom Fingerprint
Override specific fingerprint values:
const session = await sk.sessions.create({
fingerprint: {
platform: 'MacIntel',
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
locale: 'en-US',
timezone: 'America/New_York',
viewport: { width: 1440, height: 900 },
screen: { width: 2560, height: 1600 },
colorDepth: 30,
hardwareConcurrency: 10,
deviceMemory: 16,
webgl: {
vendor: 'Apple',
renderer: 'Apple M1 Pro',
},
},
})
Profile-Based Fingerprint
Reuse a fingerprint from a saved profile:
const session = await sk.sessions.create({
profileId: 'prof_abc123', // Loads fingerprint from profile
fingerprint: 'profile', // Explicitly use profile's fingerprint
})
Fingerprint Vectors
SessionKit covers all major fingerprinting vectors:
| Vector | What It Does | Consistency |
|---|---|---|
| User Agent | Browser + OS identification | Per-session |
| Platform | navigator.platform value |
Per-session |
| Screen | Resolution and color depth | Per-session |
| WebGL | GPU vendor/renderer + hash | Per-session |
| Canvas | 2D canvas rendering hash | Per-session |
| Audio | AudioContext fingerprint | Per-session |
| Fonts | Installed font detection | Per-session |
| Plugins | Navigator plugins list | Per-session |
| Hardware | CPU cores, memory, battery | Per-session |
| Timezone | Matches proxy geo-location | Per-session |
Fingerprint Consistency
Within a session, all fingerprint values remain constant. This means:
navigator.userAgentreturns the same value on every call- Canvas renders identically every time
- WebGL produces the same hash
- Timezone matches the proxy's geographic location
// These will all return consistent values within a session
await page.evaluate(() => navigator.userAgent) // Same every time
await page.evaluate(() => navigator.platform) // Same every time
await page.evaluate(() => navigator.languages) // Same every time
Anti-Fingerprint Detection
Some sites check for inconsistencies rather than specific values. SessionKit ensures:
- Timezone ↔ Proxy location match (US proxy = US timezone)
- Language ↔ Locale match (en-US locale = English language)
- Screen ↔ Viewport consistency (viewport ≤ screen size)
- GPU ↔ Platform match (Apple GPU only on Mac/iOS)
Warning: Mixing a US residential proxy with a Japanese timezone will trigger detection. Always let
automode handle consistency, or ensure your custom values are coherent.