Skip to main content

Presets

Every fingerprint preset that ships with httpcloak. This is the lookup table when you need to know which preset gives you which JA3, JA4, Akamai H2 hash, and User-Agent.

Below comes from the registry in fingerprint/presets.go. The newer Chrome versions (147, 148) live in the embedded JSON registry at fingerprint/embedded/*.json and inherit from older presets via based_on.

tip

Want to see what a real browser sends right now? Hit tls.peet.ws/api/all. DevTools won't show you header order, so peet is your only source of truth there.


Aliases

The -latest aliases follow the newest version we track. Not separate fingerprints, just pointers.

AliasResolves to
chrome-latestchrome-148 (auto-detects host OS)
chrome-latest-windowschrome-148-windows
chrome-latest-linuxchrome-148-linux
chrome-latest-macoschrome-148-macos
chrome-latest-ioschrome-148-ios
chrome-latest-androidchrome-148-android
firefox-latestfirefox-148
safari-latestsafari-18
safari-latest-iossafari-18-ios
ios-chrome-latestchrome-148-ios (back-compat naming)
ios-safari-latestsafari-18-ios (back-compat naming)
android-chrome-latestchrome-148-android (back-compat naming)

chrome-148 with no platform suffix sniffs the running OS and dispatches to chrome-148-windows, chrome-148-macos, or chrome-148-linux. Pick this if your binary should match the host OS. Pick the explicit suffix when you want, say, a Windows fingerprint from a Linux box. That's the common scraping case.


Captured hashes (verified against tls.peet.ws)

Captured from the Linux build host on 2026-05-10 via NewSession(preset).Get(ctx, "https://tls.peet.ws/api/all"). The protocol column is what tls.peet observed (H2, because peet doesn't advertise H3).

PresetProtocolJA3 hashJA4Akamai HTTP/2 hashPeetPrint
chrome-latest (resolves to chrome-148-linux)h251c8a5ff78d815668581664c5789d09ct13d1516h2_8daaf6152771_d8a2da3f94cd52d84b11737d980aef856699f885ca861d4ffe9b0e34acac0bd883fa7f79d7b5
chrome-148-windowsh2f592f2dfba4cdfc1b18ed1f29df8c8b7t13d1516h2_8daaf6152771_d8a2da3f94cd52d84b11737d980aef856699f885ca861d4ffe9b0e34acac0bd883fa7f79d7b5
firefox-148h26f7889b9fb1a62a9577e685c1fcfa919t13d1717h2_5b57614c22b0_3cbfd9057e0d6ea73faa8fc5aac76bded7bd238f643389d89662b21018947a9a46658c4f5ede
safari-18h2c8af4d593e65bd6ba927ef9a0bdef541t13d2013h2_a09f3c656075_7f0f34a4126d90d8353e47699c4c38ecd773e9b5a08962b834de729e78a9f0ebd1dd099314a7
safari-18-iosh2e7c59d91e34d9d83e510732edf732b83t13d2013h2_a09f3c656075_7f0f34a4126d90d8353e47699c4c38ecd773e9b5a08962b834de729e78a9f0ebd1dd099314a7

Notes:

  • chrome-latest and chrome-148-windows differ on ja3_hash because the cipher / extension order is platform-specific (Linux uses HelloChrome_148_Linux, Windows uses HelloChrome_148_Windows). JA4 collapses to the same value because JA4 is order-insensitive in the cipher / extension portions.
  • safari-18 and safari-18-ios share JA4 + Akamai because the H2 stack is identical. The JA3 differs because of platform-specific ClientHello extensions.

For other presets, capture them yourself the same way. Or read the JSON in fingerprint/embedded/<name>.json for the static parts (UA, sec-ch-ua, header order).


Chrome desktop

The Chrome desktop family. Versions 143-146 are Go-defined in fingerprint/presets.go. Versions 147 and 148 ship as JSON in fingerprint/embedded/, inheriting from 146 / 147 with just the User-Agent and sec-ch-ua brand list bumped.

PresetUAsec-ch-uaNotes
chrome-148-windowsMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36"Chromium";v="148", "Google Chrome";v="148", "Not/A)Brand";v="99"Inherits TLS from chrome-147-windows.
chrome-148-linuxMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36"Chromium";v="148", "Google Chrome";v="148", "Not/A)Brand";v="99"Inherits TLS from chrome-147-linux.
chrome-148-macosMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36"Chromium";v="148", "Google Chrome";v="148", "Not/A)Brand";v="99"Inherits TLS from chrome-147-macos.
chrome-147-windows...Chrome/147.0.0.0 Safari/537.36"Google Chrome";v="147", "Chromium";v="147", "Not.A/Brand";v="8"Inherits TLS from chrome-146-windows.
chrome-147-linux...Chrome/147.0.0.0 Safari/537.36"Google Chrome";v="147", "Chromium";v="147", "Not.A/Brand";v="8"Inherits TLS from chrome-146-linux.
chrome-147-macos...Chrome/147.0.0.0 Safari/537.36"Google Chrome";v="147", "Chromium";v="147", "Not.A/Brand";v="8"Inherits TLS from chrome-146-macos.
chrome-146-windows...Chrome/146.0.0.0 Safari/537.36"Google Chrome";v="146", "Chromium";v="146", "Not.A/Brand";v="8"Native Go preset. ClientHello: HelloChrome_146_Windows.
chrome-146-linux...Chrome/146.0.0.0 Safari/537.36"Google Chrome";v="146", "Chromium";v="146", "Not.A/Brand";v="8"Native Go preset. ClientHello: HelloChrome_146_Linux.
chrome-146-macos...Chrome/146.0.0.0 Safari/537.36"Google Chrome";v="146", "Chromium";v="146", "Not.A/Brand";v="8"Native Go preset. ClientHello: HelloChrome_146_macOS.
chrome-145-{windows,linux,macos}...Chrome/145.0.0.0...matching brand listNative Go preset, per-platform ClientHello.
chrome-144-{windows,linux,macos}...Chrome/144.0.0.0...matching brand listNative Go preset, per-platform ClientHello.
chrome-143-{windows,linux,macos}...Chrome/143.0.0.0...matching brand listNative Go preset, per-platform ClientHello.
chrome-141...Chrome/141.0.0.0...matching brand listAuto-detects platform.
chrome-133...Chrome/133.0.0.0...matching brand listAuto-detects platform.

The unsuffixed chrome-148 / chrome-147 / chrome-146 / chrome-145 / chrome-144 / chrome-143 resolve to whichever platform-suffixed variant matches the host OS at runtime. For consistent results across machines, pick the suffix.

All Chrome desktop presets:

  • Speak HTTP/3 via tls.HelloChrome_<v>_QUIC plus a PSK variant for resumption.
  • Use the Chrome H2 config (chromeH2Config): pseudo-header order m,a,s,p, settings order from real Chrome captures, RFC 7540 priorities on HEADERS.
  • Default Akamai: 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p.

Chrome iOS

iOS Chrome is a WebKit wrapper, so its TLS fingerprint matches Safari iOS, not desktop Chrome. Apple's rule, not ours.

PresetUATLSNotes
chrome-148-ios...CriOS/148.0.0.0 Mobile/15E148 Safari/604.1HelloIOS_18Inherits from chrome-146-ios.
chrome-147-ios...CriOS/147.0.0.0 Mobile/15E148 Safari/604.1HelloIOS_18Inherits from chrome-146-ios.
chrome-146-ios...CriOS/146.0.0.0 Mobile/15E148 Safari/604.1HelloIOS_18Native Go preset.
chrome-145-ios...CriOS/145.0.0.0...HelloIOS_18Native Go preset.
chrome-144-ios...CriOS/144.0.0.0...HelloIOS_18Native Go preset.
chrome-143-ios...CriOS/143.0.0.0...HelloIOS_18Native Go preset.

All iOS Chrome presets:

  • Use the iOS Safari H2 stack (safariH2Config): pseudo m,s,p,a, NO_RFC7540_PRIORITIES=1.
  • Speak HTTP/3 via HelloIOS_18_QUIC.
  • Default Akamai: 2:0;4:2097152;3:100;5:16384;9:1|10485760|0|m,s,p,a.

Chrome Android

Android Chrome ships its own native TLS stack. No WebKit lockdown like iOS.

PresetUATLSNotes
chrome-148-androidMozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Mobile Safari/537.36HelloChrome_<v>_LinuxInherits from chrome-147-android.
chrome-147-android...Chrome/147.0.0.0 Mobile Safari/537.36HelloChrome_<v>_LinuxInherits from chrome-146-android.
chrome-146-android...Chrome/146.0.0.0 Mobile Safari/537.36HelloChrome_146_LinuxNative Go preset.
chrome-145-android...Chrome/145.0.0.0...HelloChrome_145_LinuxNative Go preset.
chrome-144-android...Chrome/144.0.0.0...HelloChrome_144_LinuxNative Go preset.
chrome-143-android...Chrome/143.0.0.0...HelloChrome_143_LinuxNative Go preset.

sec-ch-ua-mobile becomes ?1 (vs ?0 on desktop). sec-ch-ua-platform is "Android". Default Akamai matches Chrome desktop because the H2 stack is the same.


Firefox

Firefox uses a totally different TLS extension order from Chrome. Compare the JA3s above and you'll see.

PresetUATLSNotes
firefox-148Mozilla/5.0 (...; rv:148.0) Gecko/20100101 Firefox/148.0JA3 mode (no native uTLS Firefox 148)H3 not supported (no Firefox QUIC fingerprint in uTLS).
firefox-133Mozilla/5.0 (...; rv:133.0) Gecko/20100101 Firefox/133.0uTLS HelloFirefox_133H3 not supported.

All Firefox presets:

  • Use the Firefox H2 stack (firefoxH2Config): pseudo m,p,a,s, ENABLE_PUSH=0, custom HPACK ordering.
  • Send TE: trailers. Chrome doesn't.
  • Default Akamai for firefox-148: 1:65536;2:0;4:131072;5:16384|12517377|0|m,p,a,s.
  • Skip sec-ch-ua headers entirely. Firefox doesn't implement Client Hints.

Safari (macOS)

PresetUATLSNotes
safari-18Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15HelloSafari_18H3 via HelloIOS_18_QUIC (Safari shares iOS QUIC).

Safari macOS:

  • Pseudo order m,s,p,a. Different from both Chrome and Firefox.
  • NO_RFC7540_PRIORITIES=1. Safari opts out of stream priorities.
  • No sec-ch-ua. Header order is shorter than Chrome's.
  • Default Akamai: 2:0;4:2097152;3:100;5:16384;9:1|10485760|0|m,s,p,a.

Safari iOS

PresetUATLSNotes
safari-18-iosMozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1HelloIOS_18H3 via HelloIOS_18_QUIC.
safari-17-ios...iPhone OS 17_0...Version/17.0 Mobile...HelloIOS_17Older variant.

iOS Safari shares the H2 fingerprint with macOS Safari but ships a slightly different TLS extension order. Visible in the JA3, identical in JA4.


Per-preset details

For the static parts of any preset (UA, sec-ch-ua, header order, H2 settings), the source of truth is either the JSON in fingerprint/embedded/ (v147+) or the Go function in fingerprint/presets.go (v146 and older).

To dump any preset as canonical JSON:

import "github.com/sardanioss/httpcloak/fingerprint"

j, err := fingerprint.Describe("chrome-148-windows")
// j is the round-trip-stable JSON form

That same JSON loads back via fingerprint.LoadPresetFromJSON and fingerprint.BuildPreset unmodified. So this is also how you snapshot a preset to disk for diffing across versions.


Picking a preset

Quick guide:

GoalUse
Just scrape something modernchrome-latest
Looking like a Windows desktop userchrome-latest-windows
Looking like a phonechrome-latest-android or safari-latest-ios
Sites that allowlist Firefox quirks (HPACK, TE: trailers)firefox-latest
Sites that block Chrome but pass Safarisafari-latest
Pinning to a specific version for reproducibilitychrome-148-windows (no -latest)

For sites that fingerprint the TCP/IP stack (rare, but a few bot-management products do), pair the preset with WithTCPFingerprint(...) to spoof TTL / window size / MSS.

For everything else: start with chrome-latest, capture against tls.peet.ws/api/all, compare against a real Chrome on the same OS, file an issue if JA3 / Akamai / JA4 doesn't match.