Read this before anything else: JA4 is Enterprise only.

Cloudflare states that JA3 and JA4 fingerprints are available only to Enterprise customers who have purchased Bot Management. They are not exposed on Free, Pro or Business, and neither Bot Fight Mode nor Super Bot Fight Mode surfaces the field. If that is not your plan, no amount of rule syntax will help, and the last section of this page covers what to do instead.

The field

cf.bot_management.ja4 is a rules-language field of type String. Cloudflare documents it as providing "an SSL/TLS fingerprint to help you identify potential bot requests".

The value is computed from the TLS ClientHello, the first message a client sends when opening an HTTPS connection. That makes it a property of the software connecting to you rather than something the client chooses to declare, which is the whole reason it is useful: a scraper can rewrite its User-Agent in a second, but changing its JA4 means rebuilding on a different TLS library.

Where it is exposed

SurfaceAccessorNotes
WAF custom rulescf.bot_management.ja4Match on the full fingerprint string
Workersthe request cf objectExposed under bot management on the Cloudflare Object
LogpushHTTP requests datasetFor building a fingerprint corpus over time
Bot & Security Analyticsdashboard filtersFilter and group traffic by fingerprint

Cloudflare's own documentation is the authority on the exact Workers accessor, which it describes as reachable through the Cloudflare Object rather than spelling out a property path. Take that one from their docs rather than from any blog post, including this one.

Reading the value

A JA4 looks like this:

t13d1516h2_8daaf6152771_806a8c22fdea

The first ten characters are readable without any lookup: transport (t for TCP, q for QUIC), TLS version, whether SNI was present, the cipher count, the extension count, and the first ALPN value. The two hashes that follow are truncated SHA-256 digests of the sorted cipher and extension lists, and cannot be reversed.

To decode a specific fingerprint field by field, paste it into the JA4 lookup tool, which runs entirely in your browser. For the full character-by-character specification, including the GREASE and empty-list rules and the raw JA4_r variant, the same page is the complete format reference.

Fingerprints you will see in Cloudflare

JA4 prefixLikely clientNotes
t13d1516h2Chrome (desktop)15 ciphers, 16 extensions, HTTP/2
t13d1517h2Browserbase / modified ChromiumOne extra extension versus stock Chrome
t13d1411h2Node.js (undici)14 ciphers, 11 extensions
t13d1310h2Go net/http13 ciphers, 10 extensions
t12d1307h1Python requestsTLS 1.2, no HTTP/2
t12d1309h1curlTLS 1.2, 13 ciphers, 9 extensions
q13d1516h3Chrome over QUICSame as Chrome, HTTP/3 transport

Prefixes only. Two clients can share a prefix and differ in the hashes, which is exactly how Playwright gives itself away against stock Chrome: same cipher hash, different extension hash.

Firewall rule syntax

Block a single tool fingerprint:

(cf.bot_management.ja4 eq "t12d1309h1_a3b4c5d6e7f8_1a2b3c4d5e6f")

Challenge anything matching a set of known scraper fingerprints on your API paths only:

(http.request.uri.path contains "/api/"
 and cf.bot_management.ja4 in {
   "t13d1310h2_aaaaaaaaaaaa_bbbbbbbbbbbb"
   "t12d1307h1_cccccccccccc_dddddddddddd"
 })

Scope by path or method wherever you can. A fingerprint that looks purely automated against your login endpoint may be a legitimate integration against a public one.

Your pinned rules have an expiry date

A JA4 describes a specific build of a TLS stack, and builds change. RFC 10015, published in July 2026, forbids clients from offering RSA key exchange, and current Chrome still offers four such suites. When browsers comply, the cipher count and the cipher hash both change, and every rule pinned to a literal fingerprint quietly stops matching. Rules that describe properties, such as an unusually low cipher count or a missing ALPN value, survive that transition. Literals do not.

What not to do

Do not block browser-like fingerprints. Popular browsers share a very small number of JA4 values, so a single overly broad block can take out a large slice of real users at once. Restrict outright blocks to non-browser tool fingerprints, and pair them with a second signal wherever you can.

Do not treat a fingerprint as an identity. It identifies software, not an actor. Two unrelated visitors running the same Chrome build are indistinguishable by JA4 alone, which is why it works as a network-tier signal and fails as a user identifier.

Do not allowlist a crawler on its User-Agent. This is the failure JA4 is well placed to catch. Across our production detection corpus, roughly 46% of traffic claiming to be Googlebot and 55% claiming to be GPTBot did not come from those companies' published IP ranges. A User-Agent is a claim; the handshake is evidence.

If you are not on Enterprise

The field is gated, but the technique is not. JA4 is computed from the ClientHello, so anything terminating TLS can derive it: your own reverse proxy, an edge worker with raw handshake access, or a detection layer running alongside your application. WebDecoy computes spec-compliant JA4 from the raw ClientHello and correlates it into a persistent actor identity, then pushes rules into Cloudflare or AWS WAF on your behalf, which does not require you to have the field exposed in your own dashboard.

For the narrative version of all this, with worked examples of catching specific scrapers, see JA4 Fingerprinting: Detect AI Scrapers by TLS . For pushing rules automatically instead of maintaining them by hand, see Defeat IP Rotation: Block Bots by JA4 at the WAF.

Frequently Asked Questions

What is cf.bot_management.ja4? +

It is a Cloudflare rules-language field of type String, documented as providing "an SSL/TLS fingerprint to help you identify potential bot requests". The value is a JA4 fingerprint derived from the TLS ClientHello of the request, so it describes the client's TLS stack rather than anything the client declares in a header.

Do I need a specific Cloudflare plan to use JA4? +

Yes. Cloudflare states that JA3 and JA4 fingerprints are only available to Enterprise customers who have purchased Bot Management. They are not exposed on Free, Pro or Business plans, and Bot Fight Mode and Super Bot Fight Mode do not surface the field. If you are on another plan you cannot write a cf.bot_management.ja4 rule at all, and need to compute the fingerprint at your own origin or edge instead.

Should I block a JA4 fingerprint outright? +

Only for non-browser fingerprints. Popular browsers share a very small number of JA4 values, so blocking a browser-like fingerprint blocks a large slice of real users at once. Tool fingerprints such as curl, Python requests or Go net/http are far safer targets, and even then it is worth pairing the fingerprint with another signal like request rate or path before you block.

Will my JA4 firewall rules keep working? +

Not indefinitely. A JA4 describes a specific build of a TLS stack, and stacks change. RFC 10015, published in July 2026, forbids clients from offering RSA key exchange, and current Chrome still offers four such cipher suites. When browsers drop them, the cipher count and cipher hash both change, so any rule pinned to a literal JA4 stops matching. Rules that describe properties, such as a low cipher count or missing ALPN, survive that transition.

Is JA4 better than JA3 in Cloudflare? +

For stability, yes. JA3 hashes the cipher and extension lists in the order the client sent them, and browsers deliberately randomise that order, so a single browser can produce a different JA3 on every connection. JA4 sorts those lists before hashing and splits the fingerprint into readable components, so it stays stable across randomised handshakes and is harder for a scraper to churn on purpose.

Can an attacker fake a JA4 fingerprint? +

Changing a JA4 means changing the TLS stack itself, which is far more expensive than rotating IP addresses or editing a User-Agent header. Tools such as curl-impersonate do exactly this by replaying a byte-exact copy of a real browser ClientHello. Those copies are frozen snapshots, though, so they drift out of date as real browsers update, which is itself a detectable signal.

Maintain JA4 rules without the Enterprise add-on

WebDecoy computes JA4 from the raw ClientHello, tracks rotating scrapers as persistent actors, and pushes rules into your Cloudflare or AWS WAF account.

Start Free Trial