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.21

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.21
File Size Uploaded
utls-2026.9.21.tar.gz 122.6 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for utls 2026.9.21
File
utls-2026.9.21-cp314-cp314t-win_arm64.whl CPython 3.14 CPython 3.14 free-threading Windows ARM64 Details
utls-2026.9.21-cp314-cp314t-win_amd64.whl CPython 3.14 CPython 3.14 free-threading Windows x86-64 Details
utls-2026.9.21-cp314-cp314t-win32.whl CPython 3.14 CPython 3.14 free-threading Windows x86-32 Details
utls-2026.9.21-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.21-cp314-cp314t-musllinux_1_1_armv7l.whl CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARMv7l Details
utls-2026.9.21-cp314-cp314t-musllinux_1_1_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARM64 Details
utls-2026.9.21-cp314-cp314t-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64 Details
utls-2026.9.21-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.21-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 11.0+ ARM64, macOS 10.15+ universal2 (ARM64, x86-64) Details
utls-2026.9.21-cp313-cp313t-win_arm64.whl CPython 3.13 CPython 3.13 free-threading Windows ARM64 Details
utls-2026.9.21-cp313-cp313t-win_amd64.whl CPython 3.13 CPython 3.13 free-threading Windows x86-64 Details
utls-2026.9.21-cp313-cp313t-win32.whl CPython 3.13 CPython 3.13 free-threading Windows x86-32 Details
utls-2026.9.21-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.21-cp313-cp313t-musllinux_1_1_armv7l.whl CPython 3.13 CPython 3.13 free-threading Linux musl 1.1+ ARMv7l Details
utls-2026.9.21-cp313-cp313t-musllinux_1_1_aarch64.whl CPython 3.13 CPython 3.13 free-threading Linux musl 1.1+ ARM64 Details
utls-2026.9.21-cp313-cp313t-manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 free-threading Linux glibc 2.28+ ARM64 Details
utls-2026.9.21-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.21-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 11.0+ ARM64, macOS 10.15+ universal2 (ARM64, x86-64) Details
utls-2026.9.21-cp37-abi3-win_arm64.whl CPython 3.7 abi3 Windows ARM64 Details
utls-2026.9.21-cp37-abi3-win_amd64.whl CPython 3.7 abi3 Windows x86-64 Details
utls-2026.9.21-cp37-abi3-win32.whl CPython 3.7 abi3 Windows x86-32 Details
utls-2026.9.21-cp37-abi3-musllinux_1_1_x86_64.whl CPython 3.7 abi3 Linux musl 1.1+ x86-64 Details
utls-2026.9.21-cp37-abi3-musllinux_1_1_armv7l.whl CPython 3.7 abi3 Linux musl 1.1+ ARMv7l Details
utls-2026.9.21-cp37-abi3-musllinux_1_1_aarch64.whl CPython 3.7 abi3 Linux musl 1.1+ ARM64 Details
utls-2026.9.21-cp37-abi3-manylinux_2_28_aarch64.whl CPython 3.7 abi3 Linux glibc 2.28+ ARM64 Details
utls-2026.9.21-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.21-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.21.tar.gz

Download URL utls-2026.9.21.tar.gz
Size 122.6 kB
Tags Source
SHA-256 checksum
How to use checksums
f8f2ad4cba3092229f787f9ad231e27732e7890d73154891ad6154efc45bb639
BLAKE2b-256 checksum
How to use checksums
9631e5a6f17074e7eff9a4c5c4db8b40817025e56d2b299d023425c1ef4cfae9
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
852549559c6abea5becf123ca20f784a14fce5c356f463fbc19982349df011aa
BLAKE2b-256 checksum
How to use checksums
8ce2252e64a30af4e4248356c7708ff2b3d3c9cf04e052ec59653a86e757ee07
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
4486c4875e3827ce11c2fc7ac1e916b0085662a1ac0ad38b5f45552c6c893f63
BLAKE2b-256 checksum
How to use checksums
5afd630f71888cd76970376a069c6687282462f4157eeee7c1378bf15c300261
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
dc0e3f952aeef3c12e4f9cdbd6bee176e4eeb3684b09ab6b3d1509de5ef37fba
BLAKE2b-256 checksum
How to use checksums
cb32796ca15bb11641528d41f7f74a9bfebd3234ece8fdd6a504fc718460c9aa
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
b3769858a5ebeb221b2ea6d0672269d61f737c47d020ce0e5f6cf179c2e4b1d5
BLAKE2b-256 checksum
How to use checksums
2e481eff0d69e5aa6863594bae3c5847d3374c8c6995eca07a02be90a819ac1f
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
d455f9d02dcdabb980669056287a4c54cd23a8f0722d1293687c77d74229f689
BLAKE2b-256 checksum
How to use checksums
d5a0db0dcf698276b21af25932cfee45ad067efb92fe6769651cd01651d94b36
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
1b77dd3faa0081dbb483b0b20f5f17a26c8f5a4035d09c7bf34b56c07e670c66
BLAKE2b-256 checksum
How to use checksums
9689f81fb3c21befb78a0f478b5740164792a90e8039b08982431f0d38b83578
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
5d40bdead22cba908ddc403f9f757a6c551ad4416e1173d425ac9a9f38e9f6ad
BLAKE2b-256 checksum
How to use checksums
a6f82bee2584b69d381aa16c000ed77c4d4f1867c9f9f19abe7b1f31aa4c4926
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
4bab551e820c736eb6b9b4ee5d93088f2accaf0797f4deb35cc9c63de802f4ef
BLAKE2b-256 checksum
How to use checksums
68cfdeda778eaf04fd99d8c879179a5299e8d3d3e58924a6b2236956d6a1aab2
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
93654e0fc90ed3ac0acdf69ca8ef20111d5f062b28c96bbd87d335e8667edd9a
BLAKE2b-256 checksum
How to use checksums
398686c9e5c2b38e5df23165fc07157b0700bb16a7a7d736a513b3980e6c529d
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
0c00d36f4c766bbba7e3565916cf5d5f4ff4db7abfd8d031b0b0dea13f8048a7
BLAKE2b-256 checksum
How to use checksums
432c177f1417c626f9c1f0d61a2cfb3813faa82f874619fce7f16e9beb19f341
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
d4ea710f263ec51b017dee078abc49bef069e99aac7c77796246540c0f975c46
BLAKE2b-256 checksum
How to use checksums
dcd72e47cd477744ad6bd5d023f0dddfa2a794f05f35f50b3c42566917aaf8d6
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
c32268e959fb20dcb30ac0177ffcf794414e8b8c85690b0bcaf7e3e9e27a0f90
BLAKE2b-256 checksum
How to use checksums
2d00be480e1242a757190e8a37158ed33f55d3cffa9597e2d96d85b3a3911458
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
517c24ffca3649f7f1d94165c0267f203e577a280da54ecf16b28a777423a2c1
BLAKE2b-256 checksum
How to use checksums
244ce7e59e4cff92e6b3a06104f5009a57a9be2b111def9aa0f796b10ca634b7
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
b4004f5beb5e122ca453415401e9f687cc382469ce7358419870e4b0042a392c
BLAKE2b-256 checksum
How to use checksums
d79d5a1b5933a7005b191a32cf66b71855b5c473138a87fd904cc8de44502cbc
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
7f5a5a21b2cf7c4cc6788aea2ea8f48bc40b4f1ac5069e094a99b467381f5f71
BLAKE2b-256 checksum
How to use checksums
cedeb523775e44d72037b2060c57798c899a0d20936d9c540371639a8b67409c
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
2a210428c54415253f328ef83e832ea300c10d2b5e3bc53f2a354bae21e618b2
BLAKE2b-256 checksum
How to use checksums
840d0ce060453bf2bae3372fe59f2030878487490c8e8b5e7f276ac11b5192f4
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
09c72934b7a306a2869e70295499373a163c04e249ddd62d8035a04c5a3a1ec0
BLAKE2b-256 checksum
How to use checksums
c7e2cf14412cd12d2406459a272782b06234be692d9adc74ecbd1802a468fb07
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
ba2e5918e65dbcee93b44b87adfac5ebc641ce66fe9468ecd3219118abadd0a4
BLAKE2b-256 checksum
How to use checksums
0c2c311007807395d4fcd76b4bf60d50a91ceff166237a26fe3a687d2789a29b
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-cp37-abi3-win_arm64.whl
Size 1.2 MB
Tags CPython 3.7 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
e2b23f6a8d181934b81781d5a40aeaaa794ab725e9e4157017f5dcb182da250c
BLAKE2b-256 checksum
How to use checksums
363e62ca4972bb0f4109fd79089f8bd25b04e5e9f2d0d8a992ed77184fdf6fe2
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-cp37-abi3-win_amd64.whl
Size 1.4 MB
Tags CPython 3.7 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
aa831746f88fed1f04c24befffd68fe2e06f7e196d71e3ec31c2ad8255479e49
BLAKE2b-256 checksum
How to use checksums
b3363a9d6fadc8e05f169cd7b446fde5a37ed687649c0bce0cb4593d7b9e01ff
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-cp37-abi3-win32.whl
Size 1.1 MB
Tags CPython 3.7 Windows x86-32 abi3
SHA-256 checksum
How to use checksums
f6d3cde8995a2821dea5eb1f130ac03495f14d57404aecde0d77a629d4695bb8
BLAKE2b-256 checksum
How to use checksums
263549f270d9f0357b7065c3bf7adb434edf72c3f3b2498bcc60df9f944e1101
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
e0c72ecd9cd5a955eb82f235331d235e45241eb5ef818aeb3990b799b17eddaf
BLAKE2b-256 checksum
How to use checksums
1fbbf3efeebc82fc104be59cf8ebb50876ef0be86ffb1523ca4b7bd05c502c9d
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
7c71ff4e6bf619fd8bf70205fc197aabe3e64ed6d42489d055adb071afebfaf0
BLAKE2b-256 checksum
How to use checksums
f7d3862f47ffa99133ac4ab6d1ef7dc741487e301ca1e4f9aa5b8cb5470fa4db
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
1b7e4081636b2c3e442c0059e0fcfa4aae416d2b785c5a471e9fadc11bb13eff
BLAKE2b-256 checksum
How to use checksums
8ce30cb9ad9b69a2054a152243a2b3292b776a812eab5c4b84fdee10dc1f0344
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
6c8d1f744c2b5038592763e18725a87cb2704fbf8d5ed0680e01df28def72de8
BLAKE2b-256 checksum
How to use checksums
82480184a6dfc1c8109016d2295c145a5ca3592ffe0180f096a2d6fc75542447
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
3df8ab7f9253312a37f4c652608d94cc0cab9d3464585d08482d9d7ce514b9f7
BLAKE2b-256 checksum
How to use checksums
f797362a0e9f59946140a36335bb91a200e4c331c2c9d0bed37a36c97490554b
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 21, 2026.

Transparency log

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

Download URL utls-2026.9.21-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
56997a388039d3775f9bb71222b544f09fcea8e72b9ab872a110bc9da3735570
BLAKE2b-256 checksum
How to use checksums
877b6ccb65094a66f2307668eb8126d56b891275173e3a8f148126b3885ffbe3
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 21, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2026.9.21 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