Skip to main content

UAForge

Enterprise-grade, deterministic User Agent & Client Hint generator based on real-world browser statistics

Python Version License Auto-Updated


Most "random user-agent" libraries are broken. They generate outdated browser strings, mix incompatible OS combinations, or lack the modern headers that fingerprinting systems now check.

UAForge takes a different approach. Instead of picking random strings, it simulates real users based on statistical probability. If Chrome 143 on Android holds 40% global market share, UAForge generates that identity 40% of the time.

It also generates matching Client Hints (Sec-CH-UA) headers automatically—allowing your automation to pass modern fingerprinting checks that go beyond the legacy User-Agent string.

Key Features

  • Statistically Accurate — Weighted by real-world global usage data, updated weekly from caniuse.com
  • Smart Correlations — Enforces valid browser↔OS mappings (no Safari on Windows)
  • Real Hardware — Injects actual device models (Pixel 9, Galaxy S24, etc.) for mobile agents
  • Client Hints — Generates Sec-CH-UA, Sec-CH-UA-Mobile, Sec-CH-UA-Platform, and GREASE tokens
  • Deterministic — Seed support for consistent, reproducible identities across sessions

Installation

pip install git+https://github.com/sarperavci/uaforge.git

Note: The repo does not contain the market-share data files due to size constraints. They are automatically downloaded from the release assets while installing.

Quick Start

The API is designed to be simple. You generate an "Identity" object, which contains everything you need for your requests.

from uaforge.core.generator import UserAgentGenerator

# 1. Initialize the generator
agent = UserAgentGenerator()

# 2. Generate an identity
identity = agent.generate()

# 3. Get the headers (includes User-Agent AND Client Hints)
headers = identity.get_headers()
full_client_hints = identity.get_all_client_hints()

# Use with requests/httpx
# response = requests.get("https://httpbin.org/headers", headers=headers)

print(f"Browser: {identity.meta_browser.value}")
print(f"OS:      {identity.meta_os.value}")
print(headers)
print(full_client_hints)

Sample Output

Default Headers:

{
"User-Agent": "Mozilla/5.0 (Linux; Android 13; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36",
"Sec-CH-UA": "\"Not A Brand\";v=\"99\", \"Chromium\";v=\"144\", \"Google Chrome\";v=\"144\"",
"Sec-CH-UA-Mobile": "?1",
"Sec-CH-UA-Platform": "\"Android\""
}

Full Client Hints:

{
"Sec-CH-UA": "\"Not A Brand\";v=\"99\", \"Chromium\";v=\"144\", \"Google Chrome\";v=\"144\"",
"Sec-CH-UA-Mobile": "?1",
"Sec-CH-UA-Platform": "\"Android\"",
"Sec-CH-UA-Full-Version-List": "\"Not A Brand\";v=\"99.0.0.0\", \"Chromium\";v=\"144.0.7559.59\", \"Google Chrome\";v=\"144.0.7559.59\"",
"Sec-CH-UA-Platform-Version": "13.0.0",
"Sec-CH-UA-Model": "\"Pixel 9\"",
"Sec-CH-UA-Arch": "\"arm\"",
"Sec-CH-UA-Bitness": "\"64\"",
"Sec-CH-UA-Full-Version": "\"144.0.7559.59\"",
"Sec-CH-UA-Form-Factors": "\"Mobile\"",
"Sec-CH-UA-WoW64": "?0",
"Sec-CH-Prefers-Color-Scheme": "dark"
}

Advanced Usage

Deterministic Generation (Sessions)

If you are managing long-running sessions, you need the User Agent to stay consistent across restarts. Use a seed.

# The identity generated here will ALWAYS be the same for seed 42
user = UserAgentGenerator(seed=42).generate()

print(user.user_agent) 
# Useful for associating a UA with a specific database UserID

Accessing Granular Data

Sometimes you need just the OS version or just the device model for analytics.

identity = agent.generate()

if identity.meta_device == "mobile":
    print(f"Device Model: {identity.ch_model}")  # e.g. "Pixel 8 Pro"
    print(f"Architecture: {identity.ch_arch}")   # e.g. "arm"

How it works

The Data Sources

We don't guess. We utilize three distinct data layers:

  1. market_share.json: Global browser usage stats (Chrome, Safari, Edge, Firefox).
  2. os_distribution.json: The probability of an OS given a specific browser (e.g., Safari is 100% macOS/iOS, but Chrome is split between Windows, Mac, Linux, and Android).
  3. device_models.json: A curated list of ~500 real-world mobile device fingerprints.

Maintenance & Updates

The browser ecosystem moves fast. Market share data is automatically updated weekly via GitHub Actions by parsing the latest data from caniuse.com.

You can also trigger a manual update by running:

python scripts/parse_caniuse.py

Current Market Share Distribution

The table below shows the aggregated browser market share from the current dataset. Data is sourced from caniuse.com and updated automatically.

Browser Market Share
Chrome for Android 59.15%
Chrome (Desktop) 19.55%
iOS Safari 10.65%
Edge 4.06%
Firefox 1.67%
Safari (Desktop) 1.58%
Samsung Internet 1.02%
Opera Mobile 0.79%
UC Browser 0.55%
Opera 0.35%
Firefox for Android 0.33%
IE 0.19%
Android Browser 0.12%

Last updated: 01-08-2026

License

MIT License. Feel free to use this in your commercial scrapers, bots or testing suites.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

uaforger-0.1.15.tar.gz (67.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

uaforger-0.1.15-py3-none-any.whl (71.1 kB view details)

Uploaded Python 3

File details

Details for the file uaforger-0.1.15.tar.gz.

File metadata

  • Download URL: uaforger-0.1.15.tar.gz
  • Upload date:
  • Size: 67.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.10.20

File hashes

Hashes for uaforger-0.1.15.tar.gz
Algorithm Hash digest
SHA256 88a261c9eeaefb2c919d3fd16a764fe1f0f6b8dc7ff0b7a0d54e2db1e42bcba2
MD5 9245ee02c8b20be54a9051e4dea49108
BLAKE2b-256 fd68fef67aac5915b9faf26b67549e7aa759235869747eab3a0fead86a9ddf42

See more details on using hashes here.

File details

Details for the file uaforger-0.1.15-py3-none-any.whl.

File metadata

  • Download URL: uaforger-0.1.15-py3-none-any.whl
  • Upload date:
  • Size: 71.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.10.20

File hashes

Hashes for uaforger-0.1.15-py3-none-any.whl
Algorithm Hash digest
SHA256 4b72d88fba81d91762caea4da4bb3960a299c2afafdd389f5d8c0a44c303447b
MD5 e87ecb9ab3913768a04cf82a85e4ca50
BLAKE2b-256 55c4462489a86c475ea74495d429e99558f41cff87f238f6d31c3e3345db6377

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.17

2 files

0.1.16

2 files

This release

0.1.15 This release

2 files

0.1.14

2 files

0.1.13

2 files

0.1.12

2 files

0.1.11

2 files

0.1.10

2 files

0.1.9

2 files

0.1.8

2 files

0.1.7

2 files

0.1.6

2 files

0.1.5

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page