Skip to main content

ua-generator

A random user-agent generator for Python >= 3.9

Features

  • No dependency.
  • No external user-agent list, no downloads.
  • User-agent versions are hardcoded into the code.
  • Platform and browser versions are based on real releases.
  • Client Hints (Sec-CH-UA fields).
  • Easy to integrate into HTTP libraries.

Install & upgrade

pip install -U ua-generator

Note: Upgrade ua-generator periodically to keep user-agent versions up to date.

Basic usage

import ua_generator

ua = ua_generator.generate()
print(ua) # Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/15.2 Safari/604.1.38

Customization

It takes three different parameters to customize the user-agent.

device = ['desktop', 'mobile']
platform = ['windows', 'macos', 'ios', 'linux', 'android']
browser = ['chrome', 'edge', 'firefox', 'safari']

Note: All parameters are optional and multiple types can be specified using a list (or tuple).

Customized user-agent generation:

import ua_generator

# Example 1:
ua = ua_generator.generate(device='desktop', browser=['chrome', 'edge'])
print(ua.text) # Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
print(ua.platform) # windows
print(ua.browser) # chrome
print(ua.ch.brands) # "Not A(Brand";v="99", "Chromium";v="129", "Google Chrome";v="129"
print(ua.ch.brands_full_version_list) # "Not A(Brand";v="99.0.0.0", "Chromium";v="129.0.6668.116", "Google Chrome";v="129.0.6668.116"
print(ua.ch.mobile) # ?0
print(ua.ch.platform) # "Windows"
print(ua.ch.platform_version) # "13.0.0"
print(ua.ch.browser_version) # "129"
print(ua.ch.browser_full_version) # "129.0.6668.116"
print(ua.ch.bitness) # "64"
print(ua.ch.architecture) # "x86"
print(ua.ch.wow64) # "?1"

# Example 2:
ua = ua_generator.generate(platform=['ios', 'macos'], browser='edge')
print(ua.text) # Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) EdgiOS/117.0.2045.73 Version/18.0 Mobile/15E148 Safari/604.1
print(ua.platform) # ios
print(ua.browser) # edge
print(ua.ch.brands) # "Not A(Brand";v="99", "Chromium";v="117", "Microsoft Edge";v="117"
print(ua.ch.brands_full_version_list) # "Not A(Brand";v="99.0.0.0", "Chromium";v="117.0.2045.73", "Microsoft Edge";v="117.0.2045.73"
print(ua.ch.mobile) # ?1
print(ua.ch.platform) # "iOS"
print(ua.ch.platform_version) # "18.6.1"
print(ua.ch.browser_version) # "117"
print(ua.ch.browser_full_version) # "117.0.2045.73"
print(ua.ch.bitness) # "64"
print(ua.ch.architecture) # arm
print(ua.ch.wow64) # ?0

Headers

ua = ua_generator.generate(browser=['chrome', 'edge'])

# This will return a dictionary containing the generated user-agent:
print(ua.headers.get())
{
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.43 Safari/537.36',
    'sec-ch-ua': '"Not A(Brand";v="99", "Chromium";v="103", "Google Chrome";v="103"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"'
}

# Extending the "Client Hints" by a value of the "Accept-CH" header:
ua.headers.accept_ch('Sec-CH-UA-Platform-Version, Sec-CH-UA-Full-Version-List')
print(ua.headers.get())
{
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.94 Safari/537.36',
    'sec-ch-ua': '"Not A(Brand";v="99", "Chromium";v="122", "Google Chrome";v="122"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    'sec-ch-ua-platform-version': '"14.1.0"',
    'sec-ch-ua-full-version-list': '"Not A(Brand";v="99.0.0.0", "Chromium";v="122.0.6261.94", "Google Chrome";v="122.0.6261.94"'
}

Integrating into the requests:

import requests
import ua_generator

ua = ua_generator.generate(browser=['chrome', 'edge'])
r = requests.get('https://httpbin.org/get', headers=ua.headers.get())

Integrating into the httpx:

import httpx2
import ua_generator

ua = ua_generator.generate(browser=['chrome', 'edge'])
r = httpx.get('https://httpbin.org/get', headers=ua.headers.get())

Integrating into the urllib:

import urllib.request
import ua_generator

ua = ua_generator.generate(browser=['chrome', 'edge'])
request = urllib.request.Request('https://httpbin.org/get', headers=ua.headers.get())
handler = urllib.request.urlopen(request)
response = handler.read().decode('utf-8')

Integrating into the Selenium:

import time
from selenium import webdriver
import ua_generator

ua = ua_generator.generate(browser=['chrome', 'edge'], device=['desktop'])
driver = webdriver.Chrome()
driver.execute_cdp_cmd('Network.setExtraHTTPHeaders', {'headers': ua.headers.get()})
driver.execute_cdp_cmd('Network.setUserAgentOverride', {
    'userAgent': ua.text,
    'userAgentMetadata': ua.navigator.get()
})
driver.get('https://browserleaks.com/client-hints')
time.sleep(1000)

Options

You can define options using the "options" parameter for further customization.

weighted_versions

To increase the probability of the latest versions being chosen. Default is False.

import ua_generator
from ua_generator.options import Options

# Enabling weighted versions
options = Options()
options.weighted_versions = True
ua = ua_generator.generate(browser=['chrome', 'edge'], options=options)

version_ranges

To choose only versions within specified ranges. Default is None.

import ua_generator
from ua_generator.options import Options
from ua_generator.data.version import Version, VersionRange

# Choosing only versions within specified ranges
options = Options()
options.version_ranges = {
    'chrome': VersionRange(125, 129),  # Choose version between 125 and 129
    'edge': VersionRange(min_version=120),  # Choose version 120 minimum
    'macos': VersionRange(max_version=Version(10, 15, 7)),  # Choose macOS 10.15.7 maximum
}
ua = ua_generator.generate(browser='chrome', options=options)

Note: If there is no valid version within the range you set, the filter will just skip it and return a random valid version instead.

latest_versions

To choose only the latest version, or one of the latest N versions for specified browsers or platforms. Default is False.

import ua_generator
from ua_generator.options import Options

# Choose only the latest version for every browser and platform
options = Options()
options.latest_versions = True
ua = ua_generator.generate(options=options)

# Choose one of the latest N versions for specified browsers and platforms
options = Options()
options.latest_versions = {
    'chrome': 3,
    'firefox': 1,
    'ios': 3,
    'macos': 1,
}
ua = ua_generator.generate(browser='chrome', platform='ios', options=options)

tied_safari_version

To make Safari version tied to macOS/iOS version. Default is False.

Issues

You can create an issue from here if you are experiencing a problem.

Contributing

Pull requests are welcome. Don't forget to run tests.

Contributors

Ekin Karadeniz (@iamdual) and the GitHub community.

Metadata

Release files for ua-generator 2.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ua-generator 2.1.5
File Size Uploaded
ua_generator-2.1.5.tar.gz 29.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ua-generator 2.1.5
File Interpreter ABI Platform
ua_generator-2.1.5-py3-none-any.whl Python 3 none any Details

Total release size: 62.7 kB

Release files / ua_generator-2.1.5.tar.gz

Download URL ua_generator-2.1.5.tar.gz
Size 29.8 kB
Tags Source
SHA-256 checksum
How to use checksums
d2c7005e9972a51ad373350542d67a205b749b9f58beee6835f0b63fbe15bba3
BLAKE2b-256 checksum
How to use checksums
b1f982e8fa5c8ba85682cdc88330b48b025dc8b5d7ed736eee98846fc7a6dff9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 13, 2026.

Transparency log

Release files / ua_generator-2.1.5-py3-none-any.whl

Download URL ua_generator-2.1.5-py3-none-any.whl
Size 32.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2bb932bf1df8d806f33a65d87c5974e75e69106f147399aa4b17b1b11235009e
BLAKE2b-256 checksum
How to use checksums
96fe10d7cd9ac7ab27900b0f667f8635d0f1f365bd31f0843b9c2f6cff88c0ea
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 13, 2026.

Transparency log

Release history Release notifications | RSS feed

2.1.6

2 release files

This release

2.1.5 This release

2 release files

2.1.4

2 release files

2.1.3

2 release files

2.1.2

2 release files

2.1.1

2 release files

2.1.0

2 release files

2.0.26

2 release files

2.0.25

2 release files

2.0.24

2 release files

2.0.23

2 release files

2.0.20

2 release files

2.0.17

2 release files

2.0.16

2 release files

2.0.14

2 release files

2.0.13

2 release files

2.0.12

2 release files

2.0.11

2 release files

2.0.9

2 release files

2.0.8

2 release files

2.0.7

2 release files

2.0.6

2 release files

2.0.5

2 release files

2.0.4

2 release files

2.0.3

2 release files

2.0.2

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.0.7

2 release files

1.0.6

2 release files

1.0.5

2 release files

1.0.4

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.11

2 release files

0.1.10

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release 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