JA3 and JA4 are TLS client fingerprints derived from the ClientHello message sent at the start of a TLS handshakeâbefore HTTP headers (and before encryption fully kicks in). That matters for web scraping and automation: you can rotate IPs and tweak cookies, but if your TLS stack stays the same, you often leave a stable signature that CDNs/WAFs can correlate and score. This guide breaks down how JA3/JA4 are built, what detection teams typically look for in production, and the kinds of âmismatchesâ that frequently expose automated clients. JA3 is a TLS client fingerprinting method proposed in 2017 by researchers at Salesforce. When a client starts a TLS connection, it sends a ClientHello before encrypted application traffic begins. The combination of values in that ClientHelloâsuch as the offered TLS version, cipher suites, extensions, supported groups (elliptic curves / named groups), and point formatsâtends to vary by implementation (browser, TLS library, OS build). JA3 extracts those numeric lists, serializes them into a canonical string, and hashes it with MD5 to produce a compact identifier. Salesforceâs documentation also spells out the field order and delimiter rules (commas between fields, hyphens between values) and notes how to ignore GREASE values to keep fingerprints stable. JA4 (often referred to as âJA4+â as part of a broader family) is a successor set of fingerprints designed to address practical limitations of JA3âespecially in modern TLS 1.3 environments where implementations can look less distinct or where over-uniqueness creates noise. FoxIO describes JA4 as a human- and machine-readable fingerprint derived from ClientHello, and Cloudflare notes that JA4 reduces the explosion of unique fingerprints in modern browsers by normalizing certain elements (for example, sorting ClientHello extensions). Important: JA3/JA4 are observed at the TLS layerâearlier than HTTP headers and the User-Agent string. So even if you make your headers look âChrome-like,â a Python/Go/OpenSSL-looking TLS fingerprint can still conflict with your claimed client identity. The ClientHello is the first major message in a TLS handshake. It contains the clientâs proposed parameters: cipher suite list, extensions, supported groups for key exchange, and more. TLS 1.3 (RFC 8446) explicitly defines that clients send supported groups in order of preference, and that ordering becomes part of the observable âshapeâ of the client. In practice, what you send, in what order, and with which values is the fingerprint. Conceptually, JA3 builds a string from these ClientHello elements: The resulting string is MD5-hashed to produce the well-known JA3 hash. The original Salesforce write-up also highlights an important implementation detail: ignoring GREASE values (randomized placeholders used to keep TLS extensible) so that modern clients still map to a stable JA3. JA4 still starts from ClientHello, but it aims to produce a more structured, operationally friendly fingerprint (often described as an The most common red flag is simple inconsistency: your HTTP layer claims âChrome,â but your TLS fingerprint looks like a default requests/OpenSSL stack (or some other non-browser library). Edge systems (CDNs/WAFs) can treat that mismatch as a high-confidence automation signal. Cloudflare explicitly documents JA3/JA4 fingerprints as bot profiling inputs and shows that they can be integrated into analytics and enforcement. JA4 makes ALPN (Application-Layer Protocol Negotiation) more visible as a feature. ALPN indicates what protocol the client wants to speak after TLS completesâe.g., JA3 is (by design) sensitive to ordering. That means fingerprints can drift with library upgrades, OS changes, or different build flags. It also means defenders and attackers end up playing a tuning game around order-sensitive fields. One of the motivations behind JA4âs normalization (such as sorting extensions) is to reduce brittleness and noise from âincidentalâ ordering differences. In real deployments, a concentration of older TLS versions or unusual cipher suite preferences often correlates with automation tooling. Not every legacy client is malicious, but if your TLS characteristics look nothing like a siteâs normal user base, risk scores tend to rise. Note: This article explains detection so you can design legitimate automation (rate control, compliance with terms, authentication flows, and operational safety). If your goal is to bypass access controls, you may violate terms of service and could trigger legal or policy risks depending on your jurisdiction and target environment. Defenders rarely treat JA3/JA4 as a single âblocklist value.â Instead, they combine it with other signals: request velocity, endpoint mix, login failure clusters, and behavioral features. Cloudflare documents that JA3/JA4 can feed both analysis (analytics/logs) and controls (custom WAF rules and Workers logic). In practice that enables correlations like: âhigh-volume bursts from a single JA4,â or âcredential stuffing attempts concentrated in a small set of fingerprints.â Fingerprints arenât only for blocking. You can sometimes use them to quickly remediate false positives by allowing known-good clients. Cloudflare also gives an example use case where mobile app traffic tends to share the same JA3 fingerprint, enabling teams to identify and allow app traffic while challenging other sources. Operationally, the goal usually isnât âforge a specific value.â Itâs to keep your whole client story consistent: TLS fingerprint, HTTP headers, HTTP/2 usage, cookies/sessions, redirect behavior, and whether JavaScript is executed. Detection often triggers on contradictions across layers. There are two common directions: For the second approach, some teams use In production, improvements usually start with observability: This is why âjust rotate IPsâ often fails: JA3/JA4 are far more tied to the client implementation than to the IP address. This minimal snippet helps you create a TLS connection and inspect negotiated results. Itâs mainly a companion to packet capture (for example, using Wireshark) so you can understand whatâs being sent in ClientHello. This code itself does not produce a browser-equivalent fingerprint.TLS Fingerprinting (JA3/JA4): How Detection Works and What Gives You Away
What are JA3 and JA4?
The big picture: how the fingerprint is created
ClientHello is the key
What JA3 captures
What JA4 is trying to improve
a_b_c style format). It also makes certain signals easier to work withâALPN (for example, whether the client advertises HTTP/2 or HTTP/1.1) is a good example. FoxIO also emphasizes that JA4-style fingerprints can cover both classic TLS over TCP and QUIC (the transport used by HTTP/3), which matters if youâre trying to profile modern browser traffic.What gives automated clients away
TLS fingerprint vs. User-Agent mismatch
Suspicious ALPN
h2 for HTTP/2 or h1 for HTTP/1.1. FoxIOâs documentation also notes that 00 denotes no ALPN. If youâre trying to look like a browser but you donât advertise ALPN at all, or you only ever negotiate HTTP/1.1 when a real browser would typically negotiate HTTP/2 (depending on the origin and network path), you create an easy-to-score discrepancy.Extension sets and ordering
Forcing TLS 1.2 or offering dated ciphers
How defenders use JA3/JA4 in practice
Use in WAF/CDN pipelines
Itâs also useful for allow-listing
Practical mitigation for web scraping
Aim for consistency, not âspoofingâ
Choosing an implementation approach
curl_cffi-style clients that can approximate specific browser TLS signatures. Treat this as an engineering trade-off: validate that your use case is legitimate, and review the target siteâs terms and operational constraints before adopting any approach.Measure, compare, and verify
Minimal code example
import ssl
import socket
host = "example.com"
ctx = ssl.create_default_context()
with socket.create_connection((host, 443)) as sock:
with ctx.wrap_socket(sock, server_hostname=host) as ssock:
print("TLS version:", ssock.version())
print("Cipher:", ssock.cipher())Important: JA3/JA4 are not based on the negotiated cipher you print here. Theyâre derived from the ClientHello offerâthe candidate cipher suite list, extensions, their ordering, and related fields. For accurate measurement, capture the raw ClientHello packet or use trusted edge logs. For specifications and official documentation, start here: Reference links
Need help validating TLS fingerprints?
If your scraper works locally but gets challenged in production, we can help you measure JA3/JA4, audit cross-layer consistency (TLS/HTTP/2/headers), and design a compliant collection plan.
Summary
- JA3/JA4 are fingerprints derived from the TLS ClientHello (observable before full encryption), and they tend to remain stable even if you rotate IPs.
- Common detection triggers include TLS vs. UA/HTTP behavior mismatches, suspicious ALPN/HTTP2 signals, odd extension patterns, and legacy TLS characteristics.
- For legitimate automation, the practical playbook is consistency and observability: measure â diff â validate against edge logs â iterate.