Skip to content
Fingerprint API

Integration guide

Fetch a fingerprint, then apply it to your automation browser. A few fields are native context options (UA, locale, timezone, viewport); the rest are patched with a pre-load script so they're in place before any page JavaScript runs.

Quickstart

# 1. Get a fingerprint (chromium format)
curl "https://api.capzy.ai/fingerprint/generate?key=YOUR_API_KEY\
&format=chromium&tags=Windows&country=us"

# Response (trimmed):
# {
#   "userAgent": { "userAgent": "Mozilla/5.0 ...", "platform": "Win32" },
#   "intl":      { "languages": ["en-US","en"], "timeZone": "America/New_York" },
#   "screen":    { "deviceScaleFactor": 1, "screenRect": { "width": 1920, "height": 1080 } },
#   "navigator": { "hardwareConcurrency": 8, "deviceMemory": 8 },
#   "webgl":     { "vendor": "Google Inc. (NVIDIA)", "renderer": "ANGLE (NVIDIA, ...)" }
# }

Apply it to your browser

import requests
from playwright.sync_api import sync_playwright

KEY = "YOUR_API_KEY"
fp = requests.get("https://api.capzy.ai/fingerprint/generate", params={
    "key": KEY, "format": "chromium", "tags": "Windows", "country": "us",
}).json()

ua, nav, scr = fp["userAgent"], fp["navigator"], fp["screen"]

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    # Native context options cover UA, locale, timezone, viewport, DPR.
    context = browser.new_context(
        user_agent=ua["userAgent"],
        locale=fp["intl"]["languages"][0],
        timezone_id=fp["intl"]["timeZone"],
        viewport={"width": scr["screenRect"]["width"], "height": scr["screenRect"]["height"]},
        device_scale_factor=scr["deviceScaleFactor"],
    )
    # Everything else is patched via an init script that runs before page JS.
    context.add_init_script(f'''
        Object.defineProperty(navigator, 'platform', {{ get: () => {ua["platform"]!r} }});
        Object.defineProperty(navigator, 'hardwareConcurrency', {{ get: () => {nav["hardwareConcurrency"]} }});
        Object.defineProperty(navigator, 'deviceMemory', {{ get: () => {nav["deviceMemory"]} }});
        Object.defineProperty(navigator, 'languages', {{ get: () => {fp["intl"]["languages"]!r} }});
    ''')
    page = context.new_page()
    page.goto("https://example.com")

Tip: for the best results pair the fingerprint with a matching proxy in the same country you requested, and reuse the same fingerprint for the lifetime of that browser profile (it's origin/identity-stable).

What each field maps to

Fingerprint fieldApplies to
userAgent.userAgentBrowser User-Agent string
userAgent.platformnavigator.platform (Win32 / MacIntel / Linux x86_64)
userAgent.secChUa*Sec-CH-UA client-hint headers (set on the request)
intl.languagesnavigator.languages + Accept-Language
intl.timeZoneIntl / Date timezone
screen.screenRect + deviceScaleFactorViewport size + devicePixelRatio
navigator.hardwareConcurrency / deviceMemoryCPU cores + RAM hints
webgl.vendor / rendererWebGL UNMASKED vendor + renderer (GPU)
speechSynthesis.voices / fontsTTS voices + installed fonts (locale-matched)
Get an API keyView pricing