Open the ELLIO Platform

Get TCP, TLS and HTTP fingerprints

Every value below was computed from the request that fetched this page, and is shown beside the exact string it was hashed from, so it can be checked by hand.

Same document as JSON

Requesting GET /api/v1/fingerprint

This connection

Source address
Source port
Server name
HTTP version
User agent
Observed at

This service answers on TCP port 443 and, over QUIC, on UDP port 443, and it advertises HTTP/3 in Alt-Svc, so a browser that has been here before will usually upgrade to it by itself on a later visit. The two are different handshakes rather than one handshake over another transport: a QUIC ClientHello offers its own ciphers and extensions, carries quic_transport_parameters, and asks for h3 rather than h2, so the whole JA4 changes and not only its first character.

TCP

Read off the client SYN, the first packet of the connection, before any encryption exists.

MuonFP

MuonFP writes down four things the sender chose: the window it advertised, the TCP option kinds it listed and in what order, the largest segment it will accept, and its window scale. Nothing above TCP is involved, so it describes a client that speaks no TLS at all just as well as one that does.

Field by field

An empty field means the option was absent, never that its value was zero.

Each MuonFP field, the characters it contributed to the value, and what those characters say.
FieldCharactersReading
Window size How many bytes the sender says it can accept at once, read from the first packet it sends. The field cannot go above 65,535.
Option order The TCP option kinds the sender listed during the handshake, in the order it listed them.
MSS The biggest piece of data the sender will accept in one segment, in bytes. 1,460 is a common value.
Window scale A multiplier for the window size: the real window is the advertised window times 2 to this power. The standard allows 0 to 14.

TLS

Read off the ClientHello, the first message the client sends once the TCP connection is up.

JA4

JA4 packs six fields into its first ten characters with no separator at all between them: transport, TLS version, whether a host was named, how many ciphers, how many extensions, and which protocol the client asked to speak next. Two truncated SHA-256 hashes follow, one over the sorted cipher list and one over the sorted extension list with the signature algorithms appended.

Field by field

Colour is what says where each of the first six fields starts.

Each JA4 field, the characters it contributed to the value, and what those characters say.
FieldCharactersReading
Transport How the TLS handshake arrived: t means over a TCP connection (the way HTTPS starts), q means inside QUIC over UDP, d means DTLS, the UDP form of TLS.
TLS version The newest TLS version the client offered during TLS negotiation. This is the client's offer, not what the server chose.
SNI Whether the client asked for a site by name. Domain means it sent a hostname; IP means it connected straight to the address without naming one.
Cipher count How many encryption methods (cipher suites) the client offered. The field holds two digits, so 99 means 99 or more.
Extension count How many extensions the client's opening message carried. 99 means 99 or more.
ALPN The protocol the client asked to speak next, shortened to two characters: h2 is HTTP/2, h1 is HTTP/1.1, 00 means it named none.
Cipher hash (b) A SHA-256 of the client's full cipher list, truncated to 12 characters. Two clients share it only if their lists match exactly.
Extension hash (c) A SHA-256 of the client's extension list, truncated to 12 characters. The server name and protocol offer are left out first, so the same client gets the same hash wherever it connects.

Original-order variants

ja4_o and ja4_ro

GREASE stays excluded from both lists, and the extension list keeps SNI (0x0000) and ALPN (0x0010) that the sorted form removes.

Out of spec JA4 implementations

Many JA4 implementations in the wild do not follow the specification. If the value above is not the one you expected, one of the readings below probably produced yours: each is recomputed against this same ClientHello, so a match tells you which implementation a third-party value came from rather than leaving you to conclude the two describe different clients.

They diverge on two asymmetries. The a-section counts every non-GREASE extension, while the c-section hashes a sorted copy of that same list with SNI (0x0000) and ALPN (0x0010) removed; and the signature algorithms appended after that sorted list keep their wire order, unsorted. Each entry carries the sentence of the specification that settles it. One is not an error: stripping the ephemeral extensions is a deliberate convention, considered and declined by the specification's authors.

    JA3

    JA3 predates JA4. It joins five comma-separated decimal fields - version, ciphers, extensions, supported groups, EC point formats - into one string and publishes the MD5 of that string.

    Field by field

    The MD5 has no fields of its own, so these characters are cut from the raw string above.

    Each JA3 field, the characters it contributed to the pre-hash string, and what those characters say.
    FieldCharactersReading
    TLS version The version in the client's own version field. JA3 always reads that field, so a TLS 1.3 client that negotiates through supported_versions still shows 771 here.
    Cipher suites Every cipher suite the client offered, in decimal, in the order it sent them. GREASE placeholders are removed.
    Extensions Every extension the client sent, in decimal, in wire order. A client that shuffles its extension order gets a new JA3 on every connection. Unlike JA4, the server name and the protocol offer stay in the list.
    Supported groups The key exchange groups the client offered, in decimal, in wire order.
    EC point formats The point formats the client will accept for elliptic curve keys. 0, uncompressed, is what almost every client sends.

    JA3N

    JA3N is JA3 with the extension list sorted ascending before hashing, and that sort is the entire difference between the two values. It cancels the extension shuffling that Chromium-based clients perform on every ClientHello, so one client keeps one value.

    ja3n

    Field by field

    The MD5 has no fields of its own, so these characters are cut from the raw string above.

    Each JA3N field, the characters it contributed to the pre-hash string, and what those characters say.
    FieldCharactersReading
    TLS version The version in the client's own version field, exactly as JA3 reads it. Normalisation does not touch this field.
    Cipher suites Every cipher suite the client offered, in decimal, in the order it sent them. The cipher list is left in wire order here too.
    Extensions Every extension the client sent, in decimal, sorted ascending. This is the one field JA3N changes, and it is what holds the value steady when a client shuffles its extension order.
    Supported groups The key exchange groups the client offered, in decimal, in wire order.
    EC point formats The point formats the client will accept for elliptic curve keys. 0, uncompressed, is what almost every client sends.

    HTTP

    Read off the request headers and, on an HTTP/2 connection, the client half of the connection preface that precedes them.

    Akamai HTTP/2

    The Akamai fingerprint takes four things: the SETTINGS the client sent, the connection-level window it asked for, any standalone PRIORITY frames, and the order of the pseudo-headers in its first HEADERS frame.

    akamai_h2

    Field by field

    Sections are separated by a vertical bar, and an empty section is still a section.

    Each section of the Akamai HTTP/2 fingerprint, the characters it contributed, and what those characters say.
    FieldCharactersReading
    SETTINGS The parameters in the client's first SETTINGS frame, in the order it sent them, written as identifier:value.
    WINDOW_UPDATE How many bytes the client added to the connection-level flow control window. 00 means it sent no WINDOW_UPDATE at all, which is not the same as adding zero.
    PRIORITY The standalone PRIORITY frames the client sent, if any. 0 means it sent none. Priority carried inside a HEADERS frame is not counted here.
    Pseudo-header order The order of the pseudo-headers in the first HEADERS frame, one letter each: m is :method, a is :authority, s is :scheme, p is :path.

    JA4H

    JA4H packs the method, the HTTP version, whether a cookie and a referer were sent, how many header fields there were, and the first Accept-Language tag into twelve readable characters. Three truncated SHA-256 hashes follow: the header names in the order they were sent, the cookie names, and the cookie name=value pairs.

    ja4h

    Field by field

    Colour is what says where each of the first six fields starts; an underscore precedes each of the three hashes.

    Each JA4H field, the characters it contributed to the value, and what those characters say.
    FieldCharactersReading
    Method The request method, cut to its first two characters, so methods that share those two characters land on the same code.
    HTTP version The HTTP version the request used, written without its dot: 11 is HTTP/1.1, 20 is HTTP/2.
    Cookie present Whether the request carried a Cookie header. c means it did, n means it did not.
    Referer present Whether the request carried a Referer header. r means it did, n means it did not.
    Header count How many header fields the request carried. Cookie, Referer and the HTTP/2 and HTTP/3 pseudo-headers are left out of this count.
    Accept-Language The first four characters of the first Accept-Language tag, hyphens removed and padded with zeros. 0000 means the request sent no Accept-Language header.
    Header name hash (b) A SHA-256 of the header names in the order they were sent, truncated to 12 characters. JA4H never sorts this list: the order is what separates one client library from another.
    Cookie name hash (c) A SHA-256 of the cookie names, sorted by byte value so uppercase names come first, truncated to 12 characters.
    Cookie name=value hash (d) A SHA-256 of the cookie name=value pairs, sorted by cookie name, truncated to 12 characters.

    Original-order variants

    ja4h_o and ja4h_ro

    JA4H never sorts the header names, so only the two cookie sections change.

    More on network fingerprinting

    Where network fingerprints hold, where they break, and what they are still worth once a client would rather not be recognised.