Skip to main content

BoringSSL-backed TLS for CPython, with Chrome impersonation

Drop-in replacement for the ssl stdlib with a Fingerprint API for Chrome impersonation. Built on stock BoringSSL through boring-sys - no curl-impersonate, no Go runtime at import time. Use it with any known Python http client you like or used to.

Supports CPython 3.7 onward, including freethreaded builds.

Why this exists

We sat on this for a long time, kept it private as we needed to think longer about whether the world really needed one more TLS library.

The initial thinking was: why do I have to install yet whole another http client just because we need to look like a real browser? The Python ecosystem already ships perfectly fine http clients - urllib3, niquests, httpx, aiohttp - and all of them ride on top of ssl. If the impersonation lives one layer down, in the SSL layer itself, every one of them gets it for free. No fork of curl, no Go runtime imported at module load, no second http client to teach your codebase, no patched BoringSSL to maintain across CVE cycles.

That is what utls is: the ClientHello machinery, plugged in exactly where the rest of Python already plugs in.

It was private until now. Enjoy it, but with care - browser impersonation has legitimate uses (interop testing, anti-bot researches, making sure your own service still answers a real Chrome correctly) and it has illegitimate ones. The license forbids nothing; your judgment does.

Contributions are welcome. New Chrome versions are one profile module plus one registry line; platform fixes, bug reports and CI cleanups are read and merged.

Getting Started

Install from PyPI (pre-built wheels for Linux, macOS, and Windows):

pip install utls

Then swap ssl for utls anywhere in your code:

import utls as ssl

ctx = ssl.create_default_context()

Or use it alongside the stdlib:

from utls import SSLContext, PROTOCOL_TLS_CLIENT

ctx = SSLContext(PROTOCOL_TLS_CLIENT)
ctx.load_default_certs()

import socket
sock = socket.create_connection(("example.com", 443))
ssock = ctx.wrap_socket(sock, server_hostname="example.com")
ssock.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
print(ssock.recv(4096).decode())

It works with asyncio out of the box:

import asyncio
import utls as ssl

async def main():
    ctx = ssl.create_default_context()
    reader, writer = await asyncio.open_connection("example.com", 443, ssl=ctx)
    writer.write(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
    await writer.drain()
    print((await reader.read(4096)).decode())
    writer.close()

asyncio.run(main())

Browser impersonation

import utls, socket

ctx = utls.create_default_context()
ctx.set_fingerprint("chrome:stable")

with socket.create_connection(("www.google.com", 443)) as raw:
    with ctx.wrap_socket(raw, server_hostname="www.google.com") as s:
        s.sendall(b"GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n")
        print(s.recv(4096))

The bundled profile registry can be inspected at runtime:

from utls import Fingerprint, presets

print(presets())
# ['chrome:131', 'chrome:142', 'chrome:146', 'chrome:148', 'chrome:150', 'chrome:152', 'chrome:stable']

fp = Fingerprint.from_preset("chrome:stable")
print(fp.ja3_hash, fp.ja4_hash)

Profiles ship as plain Python modules under utls.profiles.*. utls is Chrome-only by design. Adding a new Chrome version is one .py file plus one registry line.

What impersonation actually rewrites

set_fingerprint controls the TLS ClientHello bytes: cipher suite list and order, extension list and order, named groups, key shares, signature algorithms, ALPN/ALPS payloads, GREASE placement, certificate compression, explicit ECH GREASE or real config, and so on. Everything that goes into a JA3 or JA4 hash, utls drives.

What it does not rewrite, because they live above TLS:

  • The HTTP request line, method, path, and body.
  • HTTP/2 SETTINGS frames, WINDOW_UPDATE values, HEADERS frame priority flags, and the Akamai HTTP/2 fingerprint that some bot-detection vendors track. Those belong to your HTTP client; pair utls with niquests or urllib3-future if you need them honored end-to-end.

Carrying the canonical Chrome header set

Each profile also publishes the exact HTTP request-header set Chrome sends on a top-level navigation, in the on-the-wire insertion order. The HTTP layer is yours to drive, but the headers are right there if you want matched cosmetics:

from utls import Fingerprint

fp = Fingerprint.from_preset("chrome:stable")
for name, value in fp.http_headers.items():
    print(f"{name}: {value}")
# sec-ch-ua: "Chromium";v="148", "Google Chrome";v="148", "Not/A)Brand";v="99"
# sec-ch-ua-mobile: ?0
# sec-ch-ua-platform: "Linux"
# User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 ...
# Accept: text/html,application/xhtml+xml,...
# ...

Request- or session-dependent headers (Host, Cookie, Referer, Content-Length, Content-Type) are deliberately omitted from the dict; the HTTP client is responsible for emitting those. For HTTP/1.1, prepend Host at position 0 to preserve Chrome's wire order.

Choosing a profile

  • chrome:stable always tracks the newest Chrome major shipped in a utls release. Use this if you want to drift with Chrome without code changes.
  • chrome:152, chrome:150, chrome:148, chrome:146, chrome:142, chrome:131 pin to specific Chrome majors. Use these when reproducibility matters - e.g. a long-running scraper that should not silently change shape when utls is upgraded.

The JA4 hash is the fingerprint identity that bot-detection vendors and TLS observatories actually index on. chrome:142 / chrome:146 / chrome:148 share the same JA4 because they share the same TLS-layer ClientHello (the deltas are HTTP-layer); chrome:131 differs because it uses the legacy ALPS codepoint (0x4469 vs 0x44cd). chrome:150 also differs: it is the first stable major to advertise post-quantum ML-DSA (FIPS 204) signature algorithms, which changes the signature_algorithms bytes and therefore the JA4. chrome:152 adds the trust_anchors extension (0xCA34), taking the JA4 extension count from 16 to 17.

Why JA3 varies but JA4 stays put

Chrome 110+ permutes its TLS extension order on every connection to defeat order-based fingerprinting. utls mirrors that behavior. As a result:

  • JA3 hashes the wire order verbatim, so fp.ja3_hash (and the hash you'd compute from a live capture) shifts per connection. Use the JA3 string for diffing the extension set, not the hash for equality.
  • JA4 sorts extension codepoints before hashing, so fp.ja4_hash is stable and the value that matches your live capture.

Capturing a fingerprint from a live ClientHello

If you have raw ClientHello bytes (e.g. captured via tcpdump, mitmproxy, or a custom TLS trap), you can rebuild a Fingerprint from them and feed it back into a context:

from utls import Fingerprint, SSLContext

raw = open("clienthello.bin", "rb").read()
fp = Fingerprint.from_capture(raw)
print(fp.ja4_hash)

ctx = SSLContext()
ctx.set_fingerprint(fp)

Captured fingerprints carry no HTTP headers (fp.http_headers == {}); they only encode the TLS layer. To round-trip a full profile, use fp.to_dict() + Fingerprint.from_dict(...) and add http_headers manually.

Server-side and impersonation

set_fingerprint on a server-side context raises at the Rust level. The ClientHello is, by definition, the client's choice; a server-side fingerprint would be meaningless on the wire. Server contexts can still inspect the peer ClientHello for diagnostics (see the Server-side section below).

Encrypted Client Hello (ECH)

Chrome profiles ship with ECH GREASE enabled by default, matching real Chrome. To offer real ECH - encrypting the inner ClientHello (including the real SNI) under the server's published HPKE config - fork a per-peer context carrying the wire-format ECHConfigList bytes:

import utls, socket

base = utls.SSLContext()
base.load_default_certs()
base.set_fingerprint("chrome:stable")

# ECH configs are peer-specific* - each origin publishes its own in a DNS
# HTTPS RR. `set_ech_configs` is non-mutating: it returns a NEW SSLContext
# that shares the underlying SSL_CTX (and CA store) with `base` via
# SSL_CTX_up_ref, so the fork is cheap. `base` is untouched and can be
# re-forked for other peers.
ech_bytes = ...  # you are responsible to get it yourself!
ctx = base.set_ech_configs(ech_bytes)

with socket.create_connection(("example.com", 443)) as raw:
    ssl_sock = ctx.wrap_socket(raw, server_hostname="example.com")
    ssl_sock.do_handshake()

utls does not perform the DNS HTTPS RR lookup; the caller fetches the ech= bytes (e.g. via dnspython's HTTPS rdata). Pass None to clear the ECH override in the fork.

Niquests or urllib3-future does ECH transparently via a custom resolver (E.g. DNS over HTTPS) No effort required.

Feature parity with stdlib

utls re-exports the public names of the ssl module that matter for client and server code paths. The Python facade is a real subclass of ssl.SSLContext, so isinstance(ctx, ssl.SSLContext) is true and most downstream libraries (urllib3-future, niquests, httpx with custom transports) accept a utls context directly.

What's different from ssl:

  • TLS 1.2 is the minimum version. SSLv2, SSLv3, TLS 1.0 and TLS 1.1 are not available - BoringSSL refuses to negotiate them (No decent client out there should try < TLS 1.2).
  • Hostname verification uses SAN only, never the Common Name.
  • compression() always returns None (TLS compression is disabled, as it should be - BoringSSL doesn't ship it - as anyone should).
  • PSK callbacks are not available - BoringSSL deleted them upstream.
  • A Fingerprint API exists and is honored on the client side. Server-side set_fingerprint rejects at the Rust level: the ClientHello is the client's choice, not the server's.

Server-side

Server-side TLS is supported for everything BoringSSL still exposes:

  • mTLS (client certificate auth via verify_mode=CERT_REQUIRED),
  • ALPN selection from a server preference list,
  • SNI dispatch via set_servername_callback,
  • ECDH curve restriction (set_ecdh_curve),
  • Session ticket count (set_num_tickets),
  • set_session_id_context,
  • Server-side ClientHello fingerprinting (read-only diagnostics).

Things you can't have on the server side because BoringSSL doesn't have them: DTLS, FFDHE parameters, SSLv2/SSLv3, TLS compression, PSK.

urllib3-future / niquests

utls is automatically picked up if installed. enjoy.

Disclaimer

Early/Beta project. The public API is stable; we do not plan to diverge from stdlib for the ssl-compatible subset. Not pure Python - you need either a pre-built wheel or a build environment (Rust + cmake + ninja + Go for BoringSSL).

MIT-licensed (see LICENSE). BoringSSL is permissively licensed; boring-sys is Apache-2.0 - bundled into the wheel.

  • FIPS mode is not on the roadmap.
  • Chrome only. Firefox / Safari / Edge are unlikely. Thus, contribution are welcomed.
  • PyPy is not supported.

Throughput is on par with stdlib ssl: ~343 MiB/s for bulk recv vs. stdlib's 340 MiB/s on a loopback TLS 1.3 / AES-256-GCM connection. (yes, it is faster than rtls!)

Contributions, bug reports and feedback are welcome.

Versioning

This project uses CalVer (YYYY.0M.0D). It aims to be a drop-in replacement for stdlib ssl, so semantic versioning would be misleading - pin a lower bound, not an upper bound.

Prior art

  • rtls - same drop-in approach over rustls. utls's MemoryBIO-first design and read-batching pass are directly inspired by it; many of the compatibility tests were ported from there.
  • uTLS - the reference Go-language TLS fingerprinting library. The spec data encoded in our Chrome profiles is checked against uTLS's published ClientHellos.
  • curl-impersonate - the original "browser-on-the-wire" project. utls aims to give Python the same capability without a non-native Python http client or a patched BoringSSL.

JA4 pinning

The JA4 fingerprint algorithm is pinned to FoxIO-LLC/ja4 spec revision 0.18.8. The constant is duplicated in python/utls/_fingerprint.py (JA4_SPEC_VERSION) and crates/utls-core/src/fingerprint/ja4.rs, and a dedicated CI job asserts they agree.

Documentation

For the ssl-compatible surface, the stdlib documentation at https://docs.python.org/3/library/ssl.html applies almost verbatim - the notable exceptions are listed under Feature parity with stdlib.

Metadata

Release files for utls 2026.9.10

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

Source distribution (sdist)

Source distribution for utls 2026.9.10
File Size Uploaded
utls-2026.9.10.tar.gz 122.5 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for utls 2026.9.10
File
utls-2026.9.10-cp314-cp314t-win_arm64.whl CPython 3.14 CPython 3.14 free-threading Windows ARM64 Details
utls-2026.9.10-cp314-cp314t-win_amd64.whl CPython 3.14 CPython 3.14 free-threading Windows x86-64 Details
utls-2026.9.10-cp314-cp314t-win32.whl CPython 3.14 CPython 3.14 free-threading Windows x86-32 Details
utls-2026.9.10-cp314-cp314t-musllinux_1_1_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ x86-64 Details
utls-2026.9.10-cp314-cp314t-musllinux_1_1_armv7l.whl CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARMv7l Details
utls-2026.9.10-cp314-cp314t-musllinux_1_1_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARM64 Details
utls-2026.9.10-cp314-cp314t-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64 Details
utls-2026.9.10-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64 Details
utls-2026.9.10-cp314-cp314t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl CPython 3.14 CPython 3.14 free-threading macOS 10.15+ x86-64, macOS 10.15+ universal2 (ARM64, x86-64), macOS 11.0+ ARM64 Details
utls-2026.9.10-cp313-cp313t-win_arm64.whl CPython 3.13 CPython 3.13 free-threading Windows ARM64 Details
utls-2026.9.10-cp313-cp313t-win_amd64.whl CPython 3.13 CPython 3.13 free-threading Windows x86-64 Details
utls-2026.9.10-cp313-cp313t-win32.whl CPython 3.13 CPython 3.13 free-threading Windows x86-32 Details
utls-2026.9.10-cp313-cp313t-musllinux_1_1_x86_64.whl CPython 3.13 CPython 3.13 free-threading Linux musl 1.1+ x86-64 Details
utls-2026.9.10-cp313-cp313t-musllinux_1_1_armv7l.whl CPython 3.13 CPython 3.13 free-threading Linux musl 1.1+ ARMv7l Details
utls-2026.9.10-cp313-cp313t-musllinux_1_1_aarch64.whl CPython 3.13 CPython 3.13 free-threading Linux musl 1.1+ ARM64 Details
utls-2026.9.10-cp313-cp313t-manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 free-threading Linux glibc 2.28+ ARM64 Details
utls-2026.9.10-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.13 CPython 3.13 free-threading Linux glibc 2.17+ x86-64 Details
utls-2026.9.10-cp313-cp313t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl CPython 3.13 CPython 3.13 free-threading macOS 10.15+ x86-64, macOS 10.15+ universal2 (ARM64, x86-64), macOS 11.0+ ARM64 Details
utls-2026.9.10-cp37-abi3-win_arm64.whl CPython 3.7 abi3 Windows ARM64 Details
utls-2026.9.10-cp37-abi3-win_amd64.whl CPython 3.7 abi3 Windows x86-64 Details
utls-2026.9.10-cp37-abi3-win32.whl CPython 3.7 abi3 Windows x86-32 Details
utls-2026.9.10-cp37-abi3-musllinux_1_1_x86_64.whl CPython 3.7 abi3 Linux musl 1.1+ x86-64 Details
utls-2026.9.10-cp37-abi3-musllinux_1_1_armv7l.whl CPython 3.7 abi3 Linux musl 1.1+ ARMv7l Details
utls-2026.9.10-cp37-abi3-musllinux_1_1_aarch64.whl CPython 3.7 abi3 Linux musl 1.1+ ARM64 Details
utls-2026.9.10-cp37-abi3-manylinux_2_28_aarch64.whl CPython 3.7 abi3 Linux glibc 2.28+ ARM64 Details
utls-2026.9.10-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.7 abi3 Linux glibc 2.17+ x86-64 Details
utls-2026.9.10-cp37-abi3-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl CPython 3.7 abi3 macOS 11.0+ ARM64, macOS 10.15+ universal2 (ARM64, x86-64), macOS 10.15+ x86-64 Details

Total release size: 96.1 MB

Release files / utls-2026.9.10.tar.gz

Download URL utls-2026.9.10.tar.gz
Size 122.5 kB
Tags Source
SHA-256 checksum
How to use checksums
66831c946d66fb04ce3144614899bcd1f6935e584773d41b9e8252473cdb5bc4
BLAKE2b-256 checksum
How to use checksums
53e5087c5f81ee7a23d1dc2e192b0053beb1da33e85f9a34a5a2a4e441563c91
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp314-cp314t-win_arm64.whl

Download URL utls-2026.9.10-cp314-cp314t-win_arm64.whl
Size 1.2 MB
Tags CPython 3.14 CPython 3.14 free-threading Windows ARM64
SHA-256 checksum
How to use checksums
c300ec52b2d12cd419dfe25566190087891ad8bb1e367d1410837c33a559717f
BLAKE2b-256 checksum
How to use checksums
dc0844ef4c9296f1e250728d5e857c2ce475f84f905caa86269c6704a0478536
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp314-cp314t-win_amd64.whl

Download URL utls-2026.9.10-cp314-cp314t-win_amd64.whl
Size 1.4 MB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
5f16c00b8e8d38f5f20757bc99dad511aa2952d420d992b681dc18199c846298
BLAKE2b-256 checksum
How to use checksums
97934417ac83e1d5169e7814809e065f3ac481a1517f89d5913ed1178bafee33
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp314-cp314t-win32.whl

Download URL utls-2026.9.10-cp314-cp314t-win32.whl
Size 1.1 MB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-32
SHA-256 checksum
How to use checksums
72ad555ac121802a0790f4a9b1c59300130e25dc847c07e19670e9d7a7b5fb72
BLAKE2b-256 checksum
How to use checksums
54dafffb139cb7b562fcd41c77dac3f52a9a4eaae2524ece9719133e95e4970d
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp314-cp314t-musllinux_1_1_x86_64.whl

Download URL utls-2026.9.10-cp314-cp314t-musllinux_1_1_x86_64.whl
Size 8.0 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
7c87bcd80d1224afc064b66095189836733e9dbd171de6b610e2207b9995b548
BLAKE2b-256 checksum
How to use checksums
02870e82cbbb427cef2a996558ce7146bcd624faf7348e3135a0dead1481bb90
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp314-cp314t-musllinux_1_1_armv7l.whl

Download URL utls-2026.9.10-cp314-cp314t-musllinux_1_1_armv7l.whl
Size 7.5 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
5e5181cd25682fd16f029ddd57037083b073425102f365b60b626f2d32e8f1bf
BLAKE2b-256 checksum
How to use checksums
1f39c508a05ff09e1c974f559151a2798ee2dcc81b8fc30e4ccbaf78eee55cd9
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp314-cp314t-musllinux_1_1_aarch64.whl

Download URL utls-2026.9.10-cp314-cp314t-musllinux_1_1_aarch64.whl
Size 7.7 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
7664e9e91ba8fcd3ddbb0a59c580c20c0d38bb48d843397278d8b0d8e59a2b37
BLAKE2b-256 checksum
How to use checksums
e03bbf5180c748295445c717f695d654c03abe874c18fe7e88185d1beffed67f
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp314-cp314t-manylinux_2_28_aarch64.whl

Download URL utls-2026.9.10-cp314-cp314t-manylinux_2_28_aarch64.whl
Size 1.2 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
0bf462b04717323b84f8c4d3376d18a735b1c8cb95d29cc6600fe4f3ec5709ad
BLAKE2b-256 checksum
How to use checksums
5545504dc66a0c7fd091c1bedf0efd25f36e68ba27699d7d093d62e631a6c5c5
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL utls-2026.9.10-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.3 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
76f7fb08c2b08129cd1ce1268bc11e9f5f8dd2c49722e173f8c8dd17bca0bfe9
BLAKE2b-256 checksum
How to use checksums
8b36ec9780bce78af6b56a9b26b2856314e7aa53b73ef3497e27f9847dd7cf44
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp314-cp314t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl

Download URL utls-2026.9.10-cp314-cp314t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
Size 2.4 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 10.15+ universal2 (ARM64, x86-64) macOS 10.15+ x86-64 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
2d1b398491a5bed40637085b7a6eab96805bfd9c1360849dae7165a20cc2184e
BLAKE2b-256 checksum
How to use checksums
7f13fc90cde80b5523f025ba196b19767411690460d96f84d91b419c8fc403bd
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp313-cp313t-win_arm64.whl

Download URL utls-2026.9.10-cp313-cp313t-win_arm64.whl
Size 1.2 MB
Tags CPython 3.13 CPython 3.13 free-threading Windows ARM64
SHA-256 checksum
How to use checksums
9303e3c619a7c809a3f98bf3f75423286ea7c7ec69c2d1939c50383853f40140
BLAKE2b-256 checksum
How to use checksums
8b338ed8f91e322c961a04e5ba7d99f621e7d22cc8119567b532f83a26416a09
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp313-cp313t-win_amd64.whl

Download URL utls-2026.9.10-cp313-cp313t-win_amd64.whl
Size 1.4 MB
Tags CPython 3.13 CPython 3.13 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
0b6f4b7a2ec9827f8d98541941b152dfda21baf5280f53fd7e671a58d91f70f9
BLAKE2b-256 checksum
How to use checksums
720f03fa87f1ca0e33cab6585f272c78f69f28d318356433fbfa289f82536904
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp313-cp313t-win32.whl

Download URL utls-2026.9.10-cp313-cp313t-win32.whl
Size 1.1 MB
Tags CPython 3.13 CPython 3.13 free-threading Windows x86-32
SHA-256 checksum
How to use checksums
58678fcb79ecfbf0b83c3712ab06b40b4acb1e2c6615799366c75c8ac44d1586
BLAKE2b-256 checksum
How to use checksums
24529f228742318802b8df5c34cb9421ee27237dea84195d4126c78fb5d76e5e
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp313-cp313t-musllinux_1_1_x86_64.whl

Download URL utls-2026.9.10-cp313-cp313t-musllinux_1_1_x86_64.whl
Size 8.0 MB
Tags CPython 3.13 CPython 3.13 free-threading Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
449ee9c38ef983af7d9756a2461f7b990b5c783657bc02a333b5e1f77b05979a
BLAKE2b-256 checksum
How to use checksums
9ecdab02be1ff318ffcd6dd0f26c60a319d3f1721ecff9d4aba9f5a00d101c25
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp313-cp313t-musllinux_1_1_armv7l.whl

Download URL utls-2026.9.10-cp313-cp313t-musllinux_1_1_armv7l.whl
Size 7.5 MB
Tags CPython 3.13 CPython 3.13 free-threading Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
e6cb98dc9faf72fdeb8bbbbb659c3aeec0e82f34363f4ed1c65c3bcbc856a9da
BLAKE2b-256 checksum
How to use checksums
1d6f6e61234ff6052d2530aed88af5a6f9983b30c1db5a9e5d76cbff3ec904fd
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp313-cp313t-musllinux_1_1_aarch64.whl

Download URL utls-2026.9.10-cp313-cp313t-musllinux_1_1_aarch64.whl
Size 7.7 MB
Tags CPython 3.13 CPython 3.13 free-threading Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
122c55e4ca26237a913fe663750cc82b56252366137ade43e0f044c6d1f82529
BLAKE2b-256 checksum
How to use checksums
8143861d78922491d564dd8553b07b2f5bff71613f4812ecd0676c829b79352a
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp313-cp313t-manylinux_2_28_aarch64.whl

Download URL utls-2026.9.10-cp313-cp313t-manylinux_2_28_aarch64.whl
Size 1.2 MB
Tags CPython 3.13 CPython 3.13 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
e7121a435c288abf589b24dca13d356c70c39ff858a40ee467607d0232a5e1d7
BLAKE2b-256 checksum
How to use checksums
0e5c3d5bed854dd8f653f50000c34c035bec2ea6963f70642214f5f35b31e280
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL utls-2026.9.10-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.3 MB
Tags CPython 3.13 CPython 3.13 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
2e5aa33450abe47262cdb38be688fb0284a92cc4ce59a7f63e9768b36ab3fcdc
BLAKE2b-256 checksum
How to use checksums
3cc66b106a314c039b8bfc47fa9489d816a81e2c47274483170da88f657794bf
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp313-cp313t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl

Download URL utls-2026.9.10-cp313-cp313t-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
Size 2.4 MB
Tags CPython 3.13 CPython 3.13 free-threading macOS 10.15+ universal2 (ARM64, x86-64) macOS 10.15+ x86-64 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
67e528af30497140c547f2b094c5f56e4109992e6ba224d19986f8611e51263b
BLAKE2b-256 checksum
How to use checksums
6bb88c77de98f894e305ceeef6f1930402643e8fd0ab887653a35ce6138194cf
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp37-abi3-win_arm64.whl

Download URL utls-2026.9.10-cp37-abi3-win_arm64.whl
Size 1.2 MB
Tags CPython 3.7 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
8eb129deb9669a889e2972f23e38052c9a6f8d59a21aa75163e37afd5a1b1334
BLAKE2b-256 checksum
How to use checksums
c6510a48c641c62225462adb68ac55713f24a8c2e0acfa58c482ebf90feb94d7
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp37-abi3-win_amd64.whl

Download URL utls-2026.9.10-cp37-abi3-win_amd64.whl
Size 1.4 MB
Tags CPython 3.7 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
47952450323bb8871e65d77270281b45ca5eddcaa142594309b133b1aebeecc1
BLAKE2b-256 checksum
How to use checksums
3e22e0fb62f86ea733aed06e604d7e9ded8314fc437dc91b1250595d003978e1
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp37-abi3-win32.whl

Download URL utls-2026.9.10-cp37-abi3-win32.whl
Size 1.1 MB
Tags CPython 3.7 Windows x86-32 abi3
SHA-256 checksum
How to use checksums
39d56f026fb62fb5e02b35641a0afbdc7b3ae54ac5a73ae5f2cb6c90d66fdb76
BLAKE2b-256 checksum
How to use checksums
70428f0611d3cc2000ccd9615dbd9c7763ded262978848c74fee67ebc691fb76
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp37-abi3-musllinux_1_1_x86_64.whl

Download URL utls-2026.9.10-cp37-abi3-musllinux_1_1_x86_64.whl
Size 8.0 MB
Tags CPython 3.7 Linux musl 1.1+ x86-64 abi3
SHA-256 checksum
How to use checksums
293378f3bd20fafffa7d6da2242947326cb7b4c9133d1cf90e712775275aefd5
BLAKE2b-256 checksum
How to use checksums
4a48bc90df329036f78e9251fc0feda05019315d86fe2300e18c808410d53c30
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp37-abi3-musllinux_1_1_armv7l.whl

Download URL utls-2026.9.10-cp37-abi3-musllinux_1_1_armv7l.whl
Size 7.5 MB
Tags CPython 3.7 Linux musl 1.1+ ARMv7l abi3
SHA-256 checksum
How to use checksums
92b0ff45d19bc55b3343a8b83a1f62e75f7334d8935d2dd572efd78cd0e7f801
BLAKE2b-256 checksum
How to use checksums
5f0beaae2deffd36840c317ad858edd9e664980a0ee54a763eb354d1a774b448
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp37-abi3-musllinux_1_1_aarch64.whl

Download URL utls-2026.9.10-cp37-abi3-musllinux_1_1_aarch64.whl
Size 7.7 MB
Tags CPython 3.7 Linux musl 1.1+ ARM64 abi3
SHA-256 checksum
How to use checksums
5f6d16e25d777c0cf5dbe124a9fc3b8efb883f86841653dab7596be686a82b0d
BLAKE2b-256 checksum
How to use checksums
83089cbc20d45d1eaf594f3918b1a5750e780cb51a4813a29fc3e7418800d4bd
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp37-abi3-manylinux_2_28_aarch64.whl

Download URL utls-2026.9.10-cp37-abi3-manylinux_2_28_aarch64.whl
Size 1.2 MB
Tags CPython 3.7 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
11543ff9b43827dae237666b5b9231697bba7a53de30e58cf79576dc84c413a9
BLAKE2b-256 checksum
How to use checksums
326d2b78fc8a6946f71133f43ca24a57a5fb63325ea891d05dc6803603da7e4e
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL utls-2026.9.10-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.4 MB
Tags CPython 3.7 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
4b6e51f33b4b6c583737f7bb55668b07bf4c7dfd35f9396892743548eaf4e692
BLAKE2b-256 checksum
How to use checksums
7c062eddeaf2af140f9666e13354448e6a2dd70369b961c2feb042e5f9d384c7
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 10, 2026.

Transparency log

Release files / utls-2026.9.10-cp37-abi3-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl

Download URL utls-2026.9.10-cp37-abi3-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl
Size 2.4 MB
Tags CPython 3.7 abi3 macOS 10.15+ universal2 (ARM64, x86-64) macOS 10.15+ x86-64 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
e02f1445ffd853cad2c4eda3ffac2b2c7996b9336e2e2be4cc583c71ca90f929
BLAKE2b-256 checksum
How to use checksums
069a154d39fae6fa9ffdf1a8955b8024a0fcb5aedeea3381efff6198d17f3652
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 10, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2026.9.10 This release

28 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