Skip to content
Free tool · Runs in your browser

JA4 fingerprint checker

Your browser's JA4 and JA3 TLS fingerprints and its HTTP/2 fingerprint, read from a real handshake, and compared part by part with Chrome and with the HTTP clients we measured.

Opens fresh connections to our own TLS server (tls.clearcotelabs.com, ports 8443, 8444 and 8446), which reads the handshake your browser sends and returns its fingerprint. Nothing is stored.

Chrome's TLS fingerprint

t13d1517h2_8daaf6152771_cb7bf5808d99 reads as: t TCP, 13 TLS 1.3, d a domain name in the handshake, 15 cipher suites, 17 extensions, h2 HTTP/2 offered first; then 8daaf6152771, the hash of the sorted cipher suites, and cb7bf5808d99, the hash of the sorted extensions and signature algorithms. The prefix t13d1517h2 alone already separates Chrome from most HTTP libraries.

The 17 extensions, in numeric order (Chrome also adds two GREASE entries and shuffles the rest on every connection). Key-share groups are X25519MLKEM768 (post-quantum, first), X25519, P-256 and P-384; the certificate compression is brotli; its sorted JA3 (JA3N) is bd4930bd9b000ee684830e44bab76fdf.

server_name0
status_request5
supported_groups10
ec_point_formats11
signature_algorithms13
application_layer_protocol_negotiation16
signed_certificate_timestamp18
extended_master_secret23
compress_certificate (brotli)27
session_ticket35
supported_versions43
psk_key_exchange_modes45
key_share51
application_settings (ALPS)17613
trust anchors51764 (0xca34)
encrypted_client_hello (GREASE)65037
renegotiation_info65281

Microsoft Edge 153 and Brave 154 on Windows leave out one of them, trust anchors (0xca34), so their JA4 reads t13d1516h2. Chrome for Testing, the build made for automation, adds one (0x12e0) unless it is started with --disable-field-trial-config: Playwright passes that flag by default (checked in 1.62), Puppeteer's default arguments do not include it (checked in 25.12).

JA4 of browsers and HTTP clients, as measured

Every row was measured against two independent TLS echo services and repeated; library rows depend on the library version and the TLS library underneath (OpenSSL 3.0.2 here), so a different version may send something else.

ClientJA4JA3HTTP/2Measured
Google Chrome154.0.8037.57, Windows 11t13d1517h2_8daaf6152771_cb7bf5808d99changes per connection1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p2026-09-25
Google Chrome154.0.8037.57, Linux x64t13d1517h2_8daaf6152771_cb7bf5808d99changes per connection1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p2026-09-26
Google Chrome153.0.8010.52, Linux x64t13d1517h2_8daaf6152771_cb7bf5808d99changes per connection1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p2026-09-26
Google Chrome152.0.7977.82, Linux x64t13d1517h2_8daaf6152771_cb7bf5808d99changes per connection1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p2026-09-25
Microsoft Edge153.0.4234.48, Windows 11One extension fewer than Chrome: no trust anchors (0xca34).t13d1516h2_8daaf6152771_806a8c22fdeachanges per connection1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p2026-09-25
Brave154, Windows 11Same as Edge: no trust anchors (0xca34).t13d1516h2_8daaf6152771_806a8c22fdeachanges per connection1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p2026-09-25
Chrome for Testing152.0.7977.82 and 153.0.8010.52, Linux x64Started without --disable-field-trial-config. Its built-in testing configuration adds one extension (0x12e0); with the flag it matches Chrome exactly.t13d1518h2_8daaf6152771_4980c97edce0changes per connection1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p2026-09-25
curl7.81.0 (OpenSSL 3.0.2), Linux x64t13d3113h2_e8f1e7e78f70_ce5650b735ce4ea056e63b7910cbf543f0c095064dfe3:100;4:33554432;2:0|33488897|0|m,p,s,a2026-09-26
Python requests2.25.1 (urllib3 1.26.5, Python 3.10.12), Linux x64t13d4312h1_c7886603b240_b26ce05bbdd607ff1e545ef8ab3fcf8a4dc9272221c2HTTP/1.1 only2026-09-26
Python urllibPython 3.10.12, Linux x64t13d1813h1_85036bcba153_d339722ba4af331a436afb23d4e31134c11b301bdcb5HTTP/1.1 only2026-09-26
Python httpx0.28.1 (Python 3.10.12), Linux x64t13d1812h1_85036bcba153_d41ae481755e304734bb1c086c3453b387400cf83f11HTTP/1.1 only2026-09-26
Node.js fetchNode 20.18.1, Linux x64t13d5911h1_a33745022dd6_1f22a2ca17c41a28e69016765d92e3b381168d68922cHTTP/1.1 only2026-09-26
Node.js httpsNode 20.18.1, Linux x64No ALPN at all, hence 00 where browsers put h2.t13d591000_a33745022dd6_1f22a2ca17c40cce74b0d9b7f8528fb2181588d23793HTTP/1.1 only2026-09-26
Go net/httpgo1.18.1, Linux x64t13d1910h2_9dc949149365_97f8aa674fd93fed133de60c35724739b913924b6c242:0;4:4194304;6:10485760|1073741824|0|a,m,p,s2026-09-26

The HTTP/2 fingerprint

A client that speaks HTTP/2 opens the connection with settings of its own choosing, and the common format (Akamai's) writes them as four parts separated by |: the SETTINGS values in the order sent, the WINDOW_UPDATE increment, the priority information, and the order of the pseudo-headers. Chrome's is 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p; curl and Go send different settings, window sizes and header orders (table above).

Services disagree about the third part: some record only separate PRIORITY frames (0 for Chrome), ours also records the priority Chrome sends inside its first HEADERS frame (1:1:0:256). The checker above compares the other three parts, which every service reads the same way.

Why it matters

A server sees the handshake before it sees a single header, and it cannot be changed from inside a page or by an HTTP header. So the question it answers is not who you are but what software is talking: a request that claims to be Chrome in its User-Agent and opens with a Python or Node handshake says two different things at once. Browsers built on Chromium's own network stack send Chrome's handshake because it is Chrome's code, which is the approach Clearcote takes (how).

FAQ

What is a JA4 fingerprint?

A short, readable summary of the TLS ClientHello, the first message a client sends when it opens an HTTPS connection. The first part says the protocol, TLS version, whether a domain name was sent, how many cipher suites and extensions were offered, and the first ALPN value; the two hashes cover the sorted cipher suites and the sorted extensions with the signature algorithms. It was published by FoxIO in 2023 as the successor to JA3.

What is the difference between JA3 and JA4?

JA3 (Salesforce, 2017) is an MD5 hash of the TLS version, cipher suites, extensions, groups and point formats in the order the client sent them. JA4 sorts them first, adds the counts and ALPN in readable form, and splits the hash in two, so it survives clients that shuffle their extensions and says more at a glance.

Why does my JA3 change every time?

Because Chrome, and every browser built on Chromium since version 110, randomizes the order of its TLS extensions on each connection (TLS ClientHello extension permutation). JA3 hashes that order, so a Chrome JA3 is different almost every time: twelve connections from Chrome 152, 153 and 154 gave twelve different JA3 hashes. JA4, and the sorted variant JA3N, stay the same.

What is Chrome's JA4?

t13d1517h2_8daaf6152771_cb7bf5808d99, measured on Google Chrome 152, 153 and 154 on Linux and Chrome 154 on Windows 11, headless and with a window. The HTTP/2 fingerprint is 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p. Neither changed between those versions.

Does changing the User-Agent change the JA4?

No. The ClientHello is written by the TLS library before any HTTP header exists, so a Python or Node client that sends a Chrome User-Agent still has its own library's JA4, and a server can see both. That mismatch is one of the oldest ways to spot an HTTP client pretending to be a browser.

Is my JA4 unique to me?

No. It describes the TLS software, not the person: everyone on the same browser version and platform sends the same one. That is why it is useful for telling a real Chrome from something that only claims to be Chrome, and useless for telling two Chrome users apart.

Clearcote puts this into practice

An open-source Chromium with fingerprint control compiled into the engine. A drop-in for Playwright & Puppeteer.

Free for one browser with GitHub. No card.