known client
Python requests
Python 3.10–3.13, standalone OpenSSL 3 — Alpine (musl), uv, or macOS-arm; the OS never enters the ClientHello
Matches Python requests in the ground-truth catalogue.
- JA4
- JA4_r
- JA3
- several builds share this JA4 under different JA3s — no single value is canonical.
- JA3_raw
- —
Read
Spread measures reach, not intent: it can’t tell one scraper visiting 500 domains from 500 people visiting one each. Stability is a claim about software — whether the stack is deterministic — nothing about who runs it.
Footprint
ClientHello anatomy
The underscore groups of JA4_r are the raw cipher suites · extensions · signature algorithms behind the hash.
The post-quantum key share is a structural fact about the hello, not a verdict — GREASE values are flagged the same neutral way.
- 00x1302TLS_AES_256_GCM_SHA384
- 10x1303TLS_CHACHA20_POLY1305_SHA256
- 20x1301TLS_AES_128_GCM_SHA256
- 30xc02cTLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- 40xc030TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- 50xc02bTLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- 60xc02fTLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- 70xcca9TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
- 80xcca8TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
- 90xc024TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
- 100xc028TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
- 110xc023TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
- 120xc027TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
- 130x009fTLS_DHE_RSA_WITH_AES_256_GCM_SHA384
- 140x009eTLS_DHE_RSA_WITH_AES_128_GCM_SHA256
- 150x006bTLS_DHE_RSA_WITH_AES_256_CBC_SHA256
- 160x0067TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
- 00x0000server_name (SNI)
- 10x000asupported_groups
- 20x000bec_point_formats
- 30x000dsignature_algorithms
- 40x0010application_layer_protocol_negotiation (ALPN)
- 50x0016encrypt_then_mac
- 60x0017extended_master_secret
- 70x002bsupported_versions
- 80x002dpsk_key_exchange_modes
- 90x0031post_handshake_auth
- 100x0033key_share
- 110xff01renegotiation_info
Stored sorted — under one JA4 the wire order varies by construction, so no single order is “the” order.
- 00x11ecX25519MLKEM768 PQ
- 10x001dx25519
- 20x0017secp256r1 (P-256)
- 30x001ex448
- 40x0018secp384r1 (P-384)
- 50x0019secp521r1 (P-521)
- 60x0100ffdhe2048
- 70x0101ffdhe3072
- 00x0905unknown (0x0905)
- 10x0906unknown (0x0906)
- 20x0904unknown (0x0904)
- 30x0403ecdsa_secp256r1_sha256
- 40x0503ecdsa_secp384r1_sha384
- 50x0603ecdsa_secp521r1_sha512
- 60x0807ed25519
- 70x0808ed448
- 80x081aunknown (0x081a)
- 90x081bunknown (0x081b)
- 100x081cunknown (0x081c)
- 110x0809rsa_pss_pss_sha256
- 120x080arsa_pss_pss_sha384
- 130x080brsa_pss_pss_sha512
- 140x0804rsa_pss_rsae_sha256
- 150x0805rsa_pss_rsae_sha384
- 160x0806rsa_pss_rsae_sha512
- 170x0401rsa_pkcs1_sha256
- 180x0501rsa_pkcs1_sha384
- 190x0601rsa_pkcs1_sha512
- 200x0303rsa_pkcs1_sha512 (legacy)
- 210x0301rsa_pkcs1_sha256 (legacy)
- 220x0302rsa_pkcs1_sha384 (legacy)
- 230x0402rsa_pkcs1_sha384
- 240x0502ecdsa_secp384r1_sha384
- 250x0602ecdsa_secp521r1_sha512
JA3 variants
2 distinct JA3 hashes collapse into this one JA4.
| # | JA3 | JA3_raw | obs | share |
|---|---|---|---|---|
| 0 | 771,4866-4867-4865-491…-257,0-1-2 | 608 | 97% | |
| 1 | 771,4866-4867-4865-491…-256-257,0 | 20 | 3.2% |
JA3 hashes preserve wire order, so a permuting client mints a new one per connection; JA4 sorts the same set, which is why they share one JA4. Every hash here belongs to this fingerprint — there is no per-JA3 page.
Reach — domains contacted
- 64%
- 4.9%
- 4.5%
- 4.1%
- 2.7%
- 2.4%
- 2.2%
- 1.6%
- 1.1%
- 1.1%
- 1.1%
- 1.0%
- 1.0%
- 0.8%
- 0.5%
Top 15 of 42. Share is the fraction of this fingerprint’s observations reaching each name.