If you scrape with Node.js using undici, axios, or node-fetch, anti-bot systems can often block you even when your User-Agent looks exactly like Chrome. The reason is not the header: it is the TLS and HTTP/2 fingerprint emitted during the handshake.
What leaks in a typical Node client
Capture a real Chrome session on tls.peet.ws and compare it to Node's default stack. Chrome on macOS often shows values like:
- JA4 like
t13d1516h2_8daaf6152771_d8a2da3f94cd(see JA4+ spec) - HTTP/2 Akamai settings in Chrome order with
WINDOW_UPDATE +15663105 - ALPS, GREASE, and hybrid
X25519MLKEM768key shares
Node's native TLS stack orders ciphers for OpenSSL defaults, skips GREASE, and sends HTTP/2 SETTINGS in a different shape. Bot managers (Cloudflare, Akamai, DataDome, PerimeterX) fingerprint this before your first HTTP byte.
hellojs: Chrome-shaped TLS from Node
@unreleased/hellojs is a Node HTTP client that rebuilds the on-the-wire handshake to match Chrome 147 on macOS: JA4, Akamai H2, ALPN, and default header ordering. It also supports:
- Cloning captures from tls.peet.ws via
profiles.registerFromPeet() - HTTP/3 via Alt-Svc upgrade
- SOCKS5 and HTTP CONNECT proxies
It does not run in the browser: use it in your scraper runtime, not in front-end code.
For TLS impersonation in other runtimes, see curl-impersonate (Python/C) or uTLS (Go).
Inspect fingerprints without guessing
Use these free Piloterr toolbox tools (browser-only):
- TLS Capture Analyzer: paste JSON from tls.peet.ws
/api/all - JA4 Decoder: split a JA4 string into TLS version, ALPN, and hash parts
- HTTP/2 Akamai Decoder: decode Akamai H2 fingerprint strings
- Fingerprinting Resources: test sites, libraries, and Piloterr toolbox tools
When TLS mimicry is not enough
TLS fingerprinting is one layer. Sites also check browser runtime signals (canvas, WebGL, navigator.webdriver), IP reputation, and behavior. For production scraping at scale, combine:
- Realistic TLS/H2: dedicated impersonation clients (curl-impersonate, uTLS, reqwest-impersonate, etc.), or Piloterr articles on hellojs and wreq
- Consistent headers: Chrome Request Headers Builder
- Managed proxies and browser automation when needed: Piloterr Web Scraping API