JA4+ TLS Fingerprinting: Why Your Proxies Are Getting Blocked in 2026
Your proxies aren’t the problem, your TLS handshake is. In 2026, anti-bot systems identify bots at the encrypted handshake layer using JA4+ fingerprinting, before a single HTTP header is read. Rotating IPs without fixing your TLS fingerprint is burning money.
Why Your Proxies Keep Failing (And It’s Not the IP)
Somewhere right now, a developer is staring at a wall of 403 errors and rotating through their fourth proxy provider this month. New IPs, same block. They’ll assume it’s the proxies. It’s not.
The detection isn’t happening at the IP layer anymore. It’s happening at the TLS layer, the encrypted handshake your client sends before a single byte of HTTP data is exchanged. JA4+ fingerprinting reads that handshake and identifies your scraper in milliseconds, regardless of what IP it’s coming from.
Every time your scraper connects to an HTTPS site, it sends a ClientHello packet before encryption kicks in. This plaintext packet contains the cipher suites, TLS extensions, elliptic curves, and protocol versions your client supports. Different software like Chrome’s BoringSSL, Firefox’s NSS and Python’s OpenSSL produces a distinctly different ClientHello. Anti-bot platforms read that difference and block you before your request reaches the application layer.
JA4+ turns this ClientHello into a structured, blockable fingerprint.
JA3 Is Dead. Here’s Why JA4+ Replaced It.
The original TLS fingerprinting standard, JA3 (Salesforce, 2017), hashed five ClientHello fields into a 32-character MD5 signature. It worked, until two evasion techniques killed it:
- GREASE values: Google injected random values into ClientHello packets to prevent ecosystem ossification. One Chrome version could now produce thousands of different JA3 hashes.
- Cipher shuffling: Bot developers randomized cipher suite order to produce a different hash. One-line fix, instant evasion.
By 2026, JA3 is brittle and largely obsolete as a primary detection signal.
JA4 fixes both problems with one architectural change: it sorts cipher suites and extensions before hashing. Randomize the order all you like, JA4 normalizes it back. GREASE values are filtered out before hashing. The fingerprint stays stable regardless of evasion attempts.
A JA4 fingerprint looks like: t13d1516h2_8daaf6152771_e5627906d626
Three structured segments, not an opaque hash:
| Segment | What It Captures |
|---|---|
| A (Metadata) | Protocol (TCP/QUIC), TLS version, SNI presence, cipher/extension counts |
| B (Ciphers) | SHA-256 hash of sorted cipher suite list |
| C (Extensions) | Hash of sorted extensions + signature algorithms, GREASE filtered out |
| Feature | JA3 | JA4+ |
|---|---|---|
| Stability vs GREASE | Fails | Resistant |
| Stability vs cipher shuffling | Fails | Resistant |
| Protocol coverage | TLS/TCP only | TLS, QUIC, HTTP, SSH |
| Evasion difficulty | Low | High |
The Full JA4+ Suite (Most Articles Miss This)
JA4 is just one module. Modern WAFs run the entire suite simultaneously:
- JA4: Core TLS/ClientHello fingerprint
- JA4T: TCP/IP stack fingerprint (Window Size, TTL, MSS), exposes OS mismatches
- JA4H: HTTP header fingerprint (ordering, casing, HTTP/2 pseudo-headers)
- JA4L: Light Distance / latency fingerprint, catches geographically misrepresented proxies
- JA4X: X.509 certificate fingerprint
This multi-layer correlation is why a single evasion fix rarely solves the problem. If your JA4 says “Chrome 134 on Windows” but your JA4T says “Linux TCP stack” and your JA4L RTT suggests Eastern European latency while claiming a California IP, you’re flagged instantly.
The Real Reasons Your Proxies Are Getting Blocked
1. TLS Library Mismatch
Python’s requests library uses OpenSSL. Its JA4 fingerprint is on every anti-bot blocklist. It gets flagged before your request is evaluated on any other signal. Your TLS fingerprint is set by your HTTP client library, not your proxy. Switching to residential IPs doesn’t change it.
2. HTTP Header Fingerprint (JA4H) Betrayal
Even with a correct TLS fingerprint, Chrome always uses HTTP/2. If you send a Chrome User-Agent over HTTP/1.1, JA4H exposes the contradiction. Wrong header ordering, missing Sec-Fetch-* headers, incorrect HTTP/2 pseudo-header order, any of these create a detectable mismatch.
3. TCP Stack Fingerprinting (JA4T)
Most proxy servers run Linux. If you claim to be Chrome on Windows, your JA4T (which reflects the server’s Linux TCP stack) contradicts your JA4. Akamai in particular is aggressive about catching this cross-layer inconsistency.
4. JA4L: The Latency Lie Detector
JA4L measures actual Round-Trip Time from the server’s perspective and cross-references it with your proxy’s claimed geolocation. High-quality residential IPs can still fail this check if the physical routing through proxy infrastructure creates latency inconsistent with the claimed location.
5. Collapsed Entropy
When thousands of requests share an identical JA4 fingerprint, because they all route through the same proxy infrastructure using the same TLS library, that statistical uniformity is itself a bot signal. In one documented DataDome case, 100,000+ IPs across 80 countries were identified as a single bot operation because they shared one JA4 fingerprint. IP diversity meant nothing.
What’s Actually Deploying JA4+ in 2026
- Cloudflare: JA4 signals feed an ML bot scoring model; combined with JS challenges and behavioral analysis
- Akamai Bot Manager: Correlates JA4, JA4T, and JA4H simultaneously; aggressive about cross-layer contradictions
- DataDome: JA4 + behavioral analysis + JS fingerprinting; ML models trained to catch TLS/browser mismatches
- Auth0: Officially integrated JA4 into Bot Detection ML engine in March 2026
- AWS WAF, VirusTotal, NetWitness: JA4+ now standard in security infrastructure beyond just scraping targets
What Actually Works: Bypass Strategies for 2026
1: Real Browser Automation
Playwright, Puppeteer, and Selenium control actual Chrome/Firefox binaries, you inherit BoringSSL’s genuine fingerprint. JA4, JA4H, HTTP/2 negotiation, all authentic.
What you need on top: stealth plugins to mask navigator.webdriver and headless signals, geographic IP consistency, and human-like behavioral patterns. Pair with Ziny residential proxies for genuine ISP-sourced IPs that complete the identity stack.
Best for: High-security targets, e-commerce, social media, financial sites. Resource-heavy but most reliable.
2: curl_cffi / curl-impersonate
curl_cffi reproduces the exact TLS handshake, JA4 fingerprint, cipher suite ordering, ALPN values, of specific Chrome versions. Significantly faster and lighter than full browser automation.
from curl_cffi import requests
response = requests.get(
“https://target-site.com”,
impersonate=”chrome124″,
proxies={“https”: “http://user:[email protected]:port”}
Keep profiles current, mimicking Chrome 95 in 2026 is immediately suspicious. Chrome updates every 4 weeks; update your impersonation target accordingly.
Best for: Large-scale scraping of TLS-aware targets without heavy JavaScript challenges.
3: uTLS (Go) / got-scraping (Node.js)
For Go environments, uTLS provides low-level control over every ClientHello parameter. For Node.js, got-scraping implements browser-matching TLS negotiation natively. Both approach the problem at the library level, no full browser required, fingerprint matches Chrome exactly.
What Doesn’t Work
- Rotating proxies without fixing TLS: Same Python OpenSSL fingerprint on every IP. Useless against JA4-aware targets.
- Randomizing cipher suites: JA4 sorts them. This killed JA3 evasion, not JA4 evasion.
- VPNs: Change your IP, zero effect on TLS fingerprint.
- Outdated impersonation profiles: Anti-bot databases track active Chrome versions.
- Privacy browsers / heavy TLS tweaks: Makes you more unique. The goal is blending into the Chrome crowd.
The Complete 2026-Ready Stack
Beating JA4+-based detection requires coherence across every layer simultaneously:
TLS (JA4): curl_cffi, uTLS, got-scraping, or real browser automation → Chrome-matching fingerprint, HTTP/2 ALPN, current version
HTTP Headers (JA4H): Chrome header ordering, Sec-Fetch-* headers present, HTTP/2 pseudo-header order correct, User-Agent matches your impersonated Chrome version
IP + Latency (JA4L + Reputation): Residential ISP proxies, not datacenter, not datacenter-masquerading-as-residential. Geographic location must match your configured locale and timezone. Ziny’s residential proxy network routes through genuine ISP-assigned addresses across 195 countries with realistic latency characteristics that pass JA4L checks. For long sessions, static residential proxies provide IP stability without re-routing overhead.
Behavior: Variable request timing, maintained session state (cookies, referrer chains), not hammering the same endpoint in a tight loop.
JavaScript (browser automation only): navigator.webdriver masked, WebGL/Canvas fingerprints realistic, fonts consistent with declared OS.
Quick Pre-Deploy Checklist
Before running at scale against JA4+-protected targets:
- TLS client produces Chrome-matching JA4 (verify at tls.peet.ws)
- HTTP/2 negotiated (not HTTP/1.1)
- Impersonation profile = current Chrome version
- Sec-Fetch-* headers present and correctly ordered
- Proxy is residential ISP-sourced (not datacenter)
- Proxy geographic location matches client locale + timezone
- Request timing is variable and human-paced
- Session state maintained across requests
The Bigger Picture
The shift from IP-based to fingerprint-based detection isn’t slowing down. Encrypted Client Hello (ECH) in TLS 1.3 will obscure SNI data, pushing detection further toward behavioral analysis. Post-quantum cryptography is creating new fingerprinting dimensions. ML models are replacing static hash matching.
The response isn’t a new magic trick, it’s building a stack that’s genuinely coherent at every layer. Real browser identity. Clean residential IP. Real geographic consistency. Real human-like behavior.
Teams that understand this are the ones whose pipelines are still running six months from now.
Related Ziny Guides:
- Playwright & Headless Proxies at Scale
- Web Scraping Proxies
- Is Web Scraping Legal in 2026?
- 25 Proxy Errors + Fixes
- Residential Proxy Explained
- SOCKS5 Proxy
Questions about your setup? Contact Ziny support or view pricing.



