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_name | 0 |
| status_request | 5 |
| supported_groups | 10 |
| ec_point_formats | 11 |
| signature_algorithms | 13 |
| application_layer_protocol_negotiation | 16 |
| signed_certificate_timestamp | 18 |
| extended_master_secret | 23 |
| compress_certificate (brotli) | 27 |
| session_ticket | 35 |
| supported_versions | 43 |
| psk_key_exchange_modes | 45 |
| key_share | 51 |
| application_settings (ALPS) | 17613 |
| trust anchors | 51764 (0xca34) |
| encrypted_client_hello (GREASE) | 65037 |
| renegotiation_info | 65281 |
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.
| Client | JA4 | JA3 | HTTP/2 | Measured |
|---|---|---|---|---|
| Google Chrome154.0.8037.57, Windows 11 | t13d1517h2_8daaf6152771_cb7bf5808d99 | changes per connection | 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p | 2026-09-25 |
| Google Chrome154.0.8037.57, Linux x64 | t13d1517h2_8daaf6152771_cb7bf5808d99 | changes per connection | 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p | 2026-09-26 |
| Google Chrome153.0.8010.52, Linux x64 | t13d1517h2_8daaf6152771_cb7bf5808d99 | changes per connection | 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p | 2026-09-26 |
| Google Chrome152.0.7977.82, Linux x64 | t13d1517h2_8daaf6152771_cb7bf5808d99 | changes per connection | 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p | 2026-09-25 |
| Microsoft Edge153.0.4234.48, Windows 11One extension fewer than Chrome: no trust anchors (0xca34). | t13d1516h2_8daaf6152771_806a8c22fdea | changes per connection | 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p | 2026-09-25 |
| Brave154, Windows 11Same as Edge: no trust anchors (0xca34). | t13d1516h2_8daaf6152771_806a8c22fdea | changes per connection | 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p | 2026-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_4980c97edce0 | changes per connection | 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p | 2026-09-25 |
| curl7.81.0 (OpenSSL 3.0.2), Linux x64 | t13d3113h2_e8f1e7e78f70_ce5650b735ce | 4ea056e63b7910cbf543f0c095064dfe | 3:100;4:33554432;2:0|33488897|0|m,p,s,a | 2026-09-26 |
| Python requests2.25.1 (urllib3 1.26.5, Python 3.10.12), Linux x64 | t13d4312h1_c7886603b240_b26ce05bbdd6 | 07ff1e545ef8ab3fcf8a4dc9272221c2 | HTTP/1.1 only | 2026-09-26 |
| Python urllibPython 3.10.12, Linux x64 | t13d1813h1_85036bcba153_d339722ba4af | 331a436afb23d4e31134c11b301bdcb5 | HTTP/1.1 only | 2026-09-26 |
| Python httpx0.28.1 (Python 3.10.12), Linux x64 | t13d1812h1_85036bcba153_d41ae481755e | 304734bb1c086c3453b387400cf83f11 | HTTP/1.1 only | 2026-09-26 |
| Node.js fetchNode 20.18.1, Linux x64 | t13d5911h1_a33745022dd6_1f22a2ca17c4 | 1a28e69016765d92e3b381168d68922c | HTTP/1.1 only | 2026-09-26 |
| Node.js httpsNode 20.18.1, Linux x64No ALPN at all, hence 00 where browsers put h2. | t13d591000_a33745022dd6_1f22a2ca17c4 | 0cce74b0d9b7f8528fb2181588d23793 | HTTP/1.1 only | 2026-09-26 |
| Go net/httpgo1.18.1, Linux x64 | t13d1910h2_9dc949149365_97f8aa674fd9 | 3fed133de60c35724739b913924b6c24 | 2:0;4:4194304;6:10485760|1073741824|0|a,m,p,s | 2026-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.
Related free tools
What is my user agent?
Your User-Agent and Client Hints, and whether they agree with each other.
Chrome user agent strings
The latest Chrome user agents and Sec-CH-UA headers, and a generator for any version.
WebRTC leak test
Whether WebRTC reveals a different IP, and whether your time zone fits your IP.
Browser fingerprint test
A few hundred coherence checks on the browser you open it in.
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.