Profiles
Create, read, update, and delete browser profiles, duplicate them, or generate a fresh randomized fingerprint over the API.
Endpoints
| Method | Path | Purpose |
|---|---|---|
| GET | /api/profiles | List all profiles |
| POST | /api/profiles | Create a profile |
| POST | /api/profiles/generate | Create a profile with a random fingerprint |
| GET | /api/profiles/{id} | Fetch one profile |
| PUT | /api/profiles/{id} | Update a profile |
| DELETE | /api/profiles/{id} | Delete a profile |
| POST | /api/profiles/{id}/duplicate | Copy a profile |
| POST | /api/profiles/{id}/stop | Stop a running profile |
| GET | /api/profiles/{id}/status | Report whether a profile is running |
Common fields
A create body sets the identity the profile presents. Only name is required. Anything you omit is generated or inherited from the profile template, so a minimal create is just a name plus a proxy. These shorthand fields cover most profiles.
| Field | Type | Description |
|---|---|---|
| name | string | Display name. The only required field. |
| platform | "windows" | "macos" | "linux" | Operating system the profile presents. Defaults to windows. |
| proxy | string | Proxy URL in scheme://user:pass@host:port form. See Proxies. |
| timezone | string | IANA timezone, for example Europe/Berlin. |
| locale | string | BCP 47 locale, for example de-DE. |
| user_agent | string | Override the User-Agent string. Omit to derive it from the platform and browser version. |
| screen_width | number | Screen width in pixels. Defaults to 1920. |
| screen_height | number | Screen height in pixels. Defaults to 1080. |
| gpu_vendor | string | Unmasked WebGL vendor, for example Google Inc. (Intel). |
| gpu_renderer | string | Unmasked WebGL renderer string. |
| hardware_concurrency | number | Reported CPU core count (navigator.hardwareConcurrency). |
| headless | boolean | Default headless mode for this profile. |
| geoip | boolean | Derive timezone, locale, and geolocation from the proxy egress IP. |
| launch_args | string[] | Extra Chrome flags saved on the profile. |
| tags | string[] | Labels for organizing profiles. |
| notes | string | Free text notes. |
POST /api/profiles/generate when you want a coherent random fingerprint without choosing every field by hand.Fingerprint configuration
Beyond the shorthand fields, a profile carries a full fingerprint configuration. Every field below is optional and accepted on both create (POST /api/profiles) and update (PUT /api/profiles/{id}). Leave a group untouched to keep the generated defaults.
Display and hardware. What the device reports about its screen and machine.
| Field | Type | Description |
|---|---|---|
| display_width | number | Inner display width in pixels. |
| display_height | number | Inner display height in pixels. |
| display_device_pixel_ratio | number | devicePixelRatio, for example 1, 1.5, or 2. |
| display_color_depth | number | screen.colorDepth, typically 24. |
| display_color_scheme | "light" | "dark" | "no-preference" | Value reported to prefers-color-scheme. |
| hardware_cpu_cores | number | navigator.hardwareConcurrency. |
| hardware_device_memory_gb | number | navigator.deviceMemory in GB, for example 8. |
| hardware_device_name | string | Device model name where the platform exposes one. |
GPU and WebGL. How the WebGL and WebGPU surfaces present the graphics adapter.
| Field | Type | Description |
|---|---|---|
| gpu_metadata_mode | "ua_based" | "real" | "custom" | How the WebGL vendor and renderer are chosen. |
| gpu_vendor | string | Unmasked WebGL vendor when the mode is custom. |
| gpu_renderer | string | Unmasked WebGL renderer when the mode is custom. |
| gpu_webgpu_mode | "from_webgl" | "real" | "disabled" | WebGPU adapter strategy. |
| gpu_hardware_acceleration | boolean | Toggle hardware accelerated rendering. |
Locale and timezone. Language and clock the page sees. Set these explicitly or derive them from the proxy IP.
| Field | Type | Description |
|---|---|---|
| locale_timezone_mode | "ip" | "custom" | Derive the timezone from the proxy IP or set it explicitly. |
| locale_timezone | string | IANA timezone when the mode is custom. |
| locale_accept_language_mode | "ip" | "custom" | Derive Accept-Language from the IP or set it. |
| locale_accept_language | string | Accept-Language header value when custom. |
| locale_languages | string[] | navigator.languages list. |
| locale_display_language | string | Browser UI language. |
Geolocation. What the Geolocation API returns and how the permission prompt behaves.
| Field | Type | Description |
|---|---|---|
| geolocation_mode | "ip" | "custom" | "block" | Source of the reported position, or block the API entirely. |
| geolocation_latitude | number | Latitude when the mode is custom. |
| geolocation_longitude | number | Longitude when the mode is custom. |
| geolocation_accuracy_m | number | Reported accuracy in meters. |
| geolocation_permission_prompt | "ask" | "allow" | Default response to a site permission request. |
WebRTC. How WebRTC handles the local and public IP, which is the common leak that exposes a real address behind a proxy.
| Field | Type | Description |
|---|---|---|
| webrtc_mode | "disabled" | "real" | "replace" | "forward" | "proxy_udp" | IP handling strategy. proxy_udp routes media through the proxy so WebRTC matches the egress IP. |
| webrtc_public_ip_override | string | Force the public IP that WebRTC reports. |
Fingerprint noise. Per surface noise toggles. off leaves the surface untouched. seeded applies deterministic per profile noise, so the same profile renders the same value on every launch while differing from other profiles.
| Field | Values | Surface |
|---|---|---|
| noise_canvas | "off" | "seeded" | Canvas readback |
| noise_webgl_image | "off" | "seeded" | WebGL image data |
| noise_audio_context | "off" | "seeded" | AudioContext fingerprint |
| noise_client_rects | "off" | "seeded" | getClientRects geometry |
| noise_media_devices | "off" | "seeded" | enumerateDevices output |
| noise_speech_voices | "off" | "seeded" | speechSynthesis voice list |
Fonts and privacy. The font set the page can detect and a few privacy headers.
| Field | Type | Description |
|---|---|---|
| fonts_mode | "default" | "custom" | Use the OS typical font set or a custom allow list. |
| fonts_allowed_families | string[] | Allowed font families when the mode is custom. |
| fonts_inject_os_pack | boolean | Inject the font pack typical for the chosen OS. |
| privacy_do_not_track | boolean | Send the DNT header. |
| privacy_port_scan_protection | boolean | Block scripts from scanning localhost ports. |
| privacy_block_third_party_cookies | boolean | Block third party cookies. |
platform, proxy, timezone, and locale and let generate fill in a coherent fingerprint for the rest.Generate a fingerprint
POST /api/profiles/generate creates a profile with a coherent, randomized fingerprint, so you do not have to pick each field by hand. Pass a partial body to pin some values, for example the platform and proxy, and let the rest be generated around them. Set fingerprint_seed to make a generated profile reproducible.
POST /api/profiles/generate HTTP/1.1Authorization: Bearer <token>Content-Type: application/json { "name": "de-store-02", "platform": "windows", "proxy": "http://user:pass@gateway.example.com:8000", "geoip": true}geoip on, the timezone, locale, and geolocation are derived from the proxy egress IP so the profile stays coherent with where it appears to connect from.Examples
POST /api/profiles HTTP/1.1Authorization: Bearer <token>Content-Type: application/json { "name": "de-store-01", "platform": "windows", "timezone": "Europe/Berlin", "locale": "de-DE", "screen_width": 1920, "screen_height": 1080, "proxy": "http://user:pass@gateway.example.com:8000", "webrtc_mode": "proxy_udp"}