---
title: Fingerprinting
description: Generate realistic browser fingerprints to avoid detection across sessions.
section: Guides
---

# 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:

1. Selects a realistic device profile (OS, screen size, GPU)
2. Generates consistent values for all fingerprinting vectors
3. Applies the fingerprint before any page loads
4. Maintains consistency across navigations within the session

## Fingerprint Modes

### Auto Mode (Recommended)

```typescript
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:

```typescript
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:

```typescript
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.userAgent` returns the same value on every call
- Canvas renders identically every time
- WebGL produces the same hash
- Timezone matches the proxy's geographic location

```typescript
// 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 `auto` mode handle consistency, or ensure your custom values are coherent.
