> ## Documentation Index
> Fetch the complete documentation index at: https://docs.surfsky.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Fingerprints

> How Surfsky builds a profile fingerprint, what it handles automatically, and when to override it.

A fingerprint is the set of browser and device properties a website can observe. Surfsky generates each profile's fingerprint from data collected on real devices: GPU and WebGL parameters, OS-specific screens and fonts, and compatible CPU and memory combinations. Selection is weighted toward common hardware.

Use the defaults unless the task requires a specific device or setting. A one-time profile can omit `fingerprint` entirely; the default OS is Windows. A persistent profile needs `fingerprint.os`.

## When to override

Set the OS or device required by your task:

```json theme={null}
{"fingerprint": {"os": "mac"}}
```

Setting one field does not adjust the others. A user agent alone does not change the GPU, screen, or Client Hints. If you set several fields, make sure the OS, hardware, screen, and user agent describe the same kind of device. An inconsistent set can fail validation or browser startup.

## Chrome version

Surfsky updates its browser build on Chrome's release schedule. Generated user agents, Client Hints, and other version-dependent fingerprint fields update with the browser for both one-time and persistent profiles.

The generated user agent uses Chrome's reduced form, `Chrome/<major>.0.0.0`. A custom `user_agent` stays fixed across browser updates. If you set one, keep its major version aligned with the engine; Client Hints use the version from that value.

## Fields

| Field           | Value                   | Purpose                                                                                          |
| --------------- | ----------------------- | ------------------------------------------------------------------------------------------------ |
| `os`            | `win`, `mac`, `android` | Operating system; required for persistent profile creation                                       |
| `os_version`    | String                  | Operating system version                                                                         |
| `os_arch`       | String                  | Architecture, such as `x86` or `arm`                                                             |
| `user_agent`    | String                  | User agent reported by the browser                                                               |
| `screen`        | String                  | Screen geometry from the screens endpoint                                                        |
| `renderer`      | String                  | GPU renderer from the renderers endpoint                                                         |
| `device_model`  | String                  | Android device model                                                                             |
| `device_type`   | String                  | Android device type, such as `phone` or `tablet`                                                 |
| `languages`     | Array of strings        | Browser language preferences; derived from the IP when unset                                     |
| `timezone`      | String                  | IANA timezone name, such as `Europe/Berlin`; derived from the IP when unset                      |
| `geolocation`   | Object                  | Latitude, longitude, and accuracy exposed by the geolocation API; derived from the IP when unset |
| `cpu`, `ram`    | Integers                | Reported CPU cores and memory                                                                    |
| `noise`         | Object                  | Per-API noise switches, see [Noise](#noise)                                                      |
| `media_devices` | Object                  | Reported media device counts                                                                     |
| `webrtc`        | Object                  | WebRTC configuration                                                                             |
| `dns`           | String                  | DNS resolver setting                                                                             |

The OS and Android device fields are selected at creation; the profile update endpoint accepts a smaller set of fingerprint fields.

## Accepted values

Look up renderer, screen, and Android model values before supplying them:

```bash theme={null}
curl --fail-with-body "$SURFSKY_API_BASE_URL/fingerprint/renderers" \
  -H "X-Cloud-Api-Token: $SURFSKY_API_TOKEN"

curl --fail-with-body "$SURFSKY_API_BASE_URL/fingerprint/screens" \
  -H "X-Cloud-Api-Token: $SURFSKY_API_TOKEN"

curl --fail-with-body "$SURFSKY_API_BASE_URL/fingerprint/device_models" \
  -H "X-Cloud-Api-Token: $SURFSKY_API_TOKEN"
```

The [fingerprint reference](/api-reference/fingerprints/list-renderers) describes query filters for these lists.

<span id="consistency-is-the-hard-part" />

<span id="matching-the-proxy" />

## Fields that follow the IP

When unset, `timezone`, `languages`, and `geolocation` are derived from the exit IP at each start. The IP lookup supplies the timezone and coordinates, and the country determines the languages. These values update when a persistent profile changes proxy location.

Explicit values remain fixed when the proxy changes. For example, `timezone: "Europe/Berlin"` still reports Berlin with a US exit IP. Use overrides when your task requires that difference.

```json theme={null}
{
  "proxy": {"tier": "premium", "country": "de"},
  "fingerprint": {
    "os": "win",
    "timezone": "Europe/Berlin",
    "languages": ["de-DE", "de", "en"]
  }
}
```

## Canvas and WebGL

Canvas and WebGL fingerprinting scripts render an image and hash its pixels. The result depends on the GPU and driver, so devices with the same hardware can share a hash. Sites can also compare it with the reported renderer.

For the fingerprinting scripts used by Akamai, ThreatMetrix, Cloudflare, Google, and similar services, Surfsky returns canvas and WebGL images recorded on a real machine with the profile's GPU. The images match the reported renderer and remain the same across sessions. No configuration is required. Canvases outside those scripts render as in stock Chrome.

WebGPU is enabled, and its adapter information describes the same GPU as WebGL. You can check it on the [browserleaks WebGPU page](https://browserleaks.com/webgpu).

## Noise

Noise applies a per-profile adjustment to an API's output, changing the resulting fingerprint hash. The adjustment is generated once and reused on every start. Different profiles can still produce the same hash, as can real devices.

`noise` is off by default on desktop profiles. Android profiles use a fixed preset; a `noise` object sent for Android is ignored. Leave noise off unless a site links your profiles by one of these hashes. Test the target site before changing it on an existing profile, since a changed hash can affect device recognition.

Disabling a noise setting discards its adjustment. Enabling it again generates a new adjustment and hash for that API without recreating the profile.

```json theme={null}
{"fingerprint": {"noise": {"canvas": false, "webgl": false, "audio": true, "client_rects": true}}}
```

| Key            | What it changes             | Notes                                                                                                                                                                                        |
| -------------- | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `canvas`       | 2D canvas pixels            | Applies an adjustment to the recorded canvas image. Keep it off for Google accounts. For Amazon accounts, use one persistent profile per account to preserve the canvas hash between logins. |
| `webgl`        | WebGL image hash            | Most services do not score it.                                                                                                                                                               |
| `audio`        | AudioContext output         | The sine wave a site renders through the audio stack and hashes.                                                                                                                             |
| `client_rects` | `getClientRects` dimensions | Adjusts element dimensions used in fingerprinting. Disable it if it causes layout problems.                                                                                                  |

## Persistent profiles

A persistent profile keeps its fingerprint between starts. Update it while it is stopped if you need to change its settings. `os`, `os_arch`, and `os_version` are fixed for the life of the profile; create a new one for a different OS.

On a desktop profile you can change `user_agent`, `screen`, `cpu`, `ram`, `renderer`, `media_devices`, `noise`, and the connection fields (`languages`, `timezone`, `geolocation`, `dns`, `webrtc`). On an Android profile only the connection fields and `user_agent` take effect; hardware fields are ignored.

Changing hardware fields changes the device fingerprint even when cookies are restored. Updating `renderer` also changes the WebGL preset and recorded canvas images. Keep it stable unless the account needs a different device.

See [Sessions](/sessions#persistent-profiles) for profile creation and [Cookies](/cookies) for login persistence.

## Mobile

Use `os: "android"` for an Android profile:

```json theme={null}
{"fingerprint": {"os": "android"}}
```

To specify a model, choose one from `GET /fingerprint/device_models`. `device_model` and `device_type` are accepted only with Android. Use a matching device type and screen instead of combining a phone model with desktop settings.

An Android profile always reports one microphone, one speaker, and front and back cameras. `media_devices` is ignored for it.
