Skip to content

NDJSON Schema Reference

This page describes the fields emitted in each offline NDJSON connection record.

The sniffer writes ECS-style JSON with a custom pqc.* namespace for quantum-safety and handshake details. Fields are omitted when the related protocol data was not observed or could not be parsed.

Record Shape

Each line is one complete JSON object:

{
  "@timestamp": "2026-05-11T18:40:13.141Z",
  "event": {},
  "source": {},
  "destination": {},
  "network": {},
  "observer": {},
  "pqc": {}
}

Protocol-specific objects such as tls, ssh, quic, and tcp are present only when that information is available.

Core Fields

Field Type Description
@timestamp string Event timestamp in ISO-8601 UTC format.
event.id string Connection identifier.
event.category array[string] ECS category; currently includes network.
event.type array[string] ECS event type; currently includes connection and protocol.
event.kind string ECS event kind; currently event.
event.dataset string Dataset name; currently pqc.network.
event.duration integer Connection duration in nanoseconds when available.
tags array[string] Optional tags, typically including the customer ID.

Conversation Fields

These are the fields most useful for top-talkers, port grouping, and address grouping.

Field Type Description
source.ip string Source IP address.
source.port integer Source transport port.
source.bytes integer Bytes observed from source to destination.
source.packets integer Packets observed from source to destination.
destination.ip string Destination IP address.
destination.port integer Destination transport port.
destination.bytes integer Bytes observed from destination to source.
destination.packets integer Packets observed from destination to source.
network.transport string Transport protocol, such as tcp or udp.
network.protocol string Application/protocol classification, such as tls, quic, ssh, or http.
network.bytes integer Sum of source and destination bytes.
network.packets integer Sum of source and destination packets.
network.community_id string Optional community ID when available.
tcp.state string TCP state when tracked.
tcp.client_isn integer Optional client initial sequence number.
tcp.server_isn integer Optional server initial sequence number.

TLS Fields

Field Type Description
tls.version_protocol string Negotiated TLS version label: TLSv1.3, TLSv1.2, TLSv1.1, TLSv1.0, SSLv3, or Unknown.
tls.cipher string Negotiated cipher suite name when known.
tls.client.server_name string Client SNI value when present.
tls.next_protocol string Negotiated ALPN protocol when present.
tls.client_offered_pqc_kex string Comma-separated PQC KEX algorithms offered by the client when detected.
tls.established boolean Whether the TLS connection was established.

TLS Handshake Fields

TLS parser details are emitted under pqc.handshake.* so quantum-safety consumers can keep crypto evidence with the assessment.

Field Type Description
pqc.handshake.client_hello.version string ClientHello version.
pqc.handshake.client_hello.ciphersuites array[string] Client-offered cipher suites.
pqc.handshake.client_hello.compression_methods array[integer] Client-offered compression methods.
pqc.handshake.client_hello.supported_groups array[string] Client-offered supported groups/key-share groups. Known values are emitted as names; unmapped values fall back to hex.
pqc.handshake.client_hello.signature_algorithms array[string] Client-offered signature algorithms. Known values are emitted as names; unmapped values fall back to hex.
pqc.handshake.client_hello.alpn_protocols array[string] Client-offered ALPN protocols.
pqc.handshake.client_hello.supported_versions array[string] Client-offered TLS versions.
pqc.handshake.server_hello.version string ServerHello version.
pqc.handshake.server_hello.selected_ciphersuite string Selected cipher suite name, or hex value if unknown.
pqc.handshake.server_hello.selected_alpn string Selected ALPN protocol.
pqc.handshake.server_hello.key_share.group string Selected TLS 1.3 key-share group.
pqc.handshake.server_hello.key_share.key_exchange_length integer Selected key-share length.
pqc.handshake.server_key_exchange.kex_type string TLS 1.0-1.2 key exchange type, such as ECDHE or DHE.
pqc.handshake.server_key_exchange.curve_name string ECDHE curve name when available.
pqc.handshake.server_key_exchange.public_key_length integer ECDHE public key length.
pqc.handshake.server_key_exchange.dh_p_length integer DHE prime modulus length.
pqc.handshake.server_key_exchange.dh_g_length integer DHE generator length.
pqc.handshake.server_key_exchange.dh_Ys_length integer DHE public value length.
pqc.handshake.key_exchange_algorithm string Parsed key exchange algorithm.
pqc.handshake.signature_algorithm string Parsed signature algorithm.
pqc.handshake.encryption_algorithm string Parsed encryption algorithm.
pqc.handshake.ciphersuite_name string Parsed cipher suite name.
pqc.handshake.client_offered_pqc_kex string PQC KEX algorithms offered by the client.
pqc.handshake.kex_quantum_safe string KEX component safety: Safe, Vulnerable, or Unknown.
pqc.handshake.sig_quantum_safe string Signature component safety: Safe, Vulnerable, or Unknown.
pqc.handshake.enc_quantum_safe string Encryption component safety: Safe, Vulnerable, or Unknown.

PQC Assessment Fields

Field Type Description
pqc.quantum_safety string Overall classification: Safe, Vulnerable, or Unknown. Unknown/unmapped TLS cipher suites or key-share groups produce Unknown rather than being treated as vulnerable classical crypto.
pqc.readiness_score integer Readiness score from 0 to 100.
pqc.has_pqc_kex boolean Whether PQC key exchange was detected.
pqc.has_pqc_sig boolean Whether a PQC signature algorithm was detected.
pqc.pqc_kex_is_hybrid boolean Whether the PQC KEX is hybrid.
pqc.pqc_sig_is_hybrid boolean Whether the PQC signature is hybrid.
pqc.pqc_downgrade_detected boolean Whether downgrade behavior was detected.
pqc.pqc_kex_algorithm string Detected PQC KEX algorithm.
pqc.pqc_sig_algorithm string Detected PQC signature algorithm.
pqc.vulnerability_reason string Human-readable reason for a vulnerable or unknown classification.
pqc.assessment.overall_safety string Detailed overall assessment.
pqc.assessment.vulnerability_score integer Vulnerability score from 0 to 100.
pqc.assessment.vulnerable_components array[string] Components contributing to vulnerability.
pqc.assessment.recommended_algorithms array[string] Suggested safer algorithms.
pqc.assessment.remediation_priority string Priority label such as High, Medium, or Low.
pqc.assessment.assessed_at string Assessment timestamp in ISO-8601 UTC format.

SSH Fields

Field Type Description
ssh.client.protocol_version string Client SSH protocol version.
ssh.client.software_version string Client SSH software version.
ssh.client.comments string Optional client banner comments.
ssh.client.kex_algorithms array[string] Client-offered SSH KEX algorithms.
ssh.server.protocol_version string Server SSH protocol version.
ssh.server.software_version string Server SSH software version.
ssh.server.comments string Optional server banner comments.
ssh.selected_kex_algorithm string Selected SSH KEX algorithm.
ssh.has_pqc_kex boolean Whether SSH PQC KEX was detected.
ssh.kex_quantum_safe string SSH KEX safety classification.

QUIC Fields

Field Type Description
quic.version string Parsed QUIC version.

Observer Fields

Field Type Description
observer.name string Sniffer ID/name.
observer.type string Observer type; currently sniffer.
observer.vendor string Vendor name; currently Tychon.
observer.product string Product name.

Dashboard Notes

For top-talkers grouped by port, address, and KEX method, use:

  • Port: destination.port, with source.port available for client-side grouping.
  • Address: source.ip and destination.ip.
  • Conversation count: count records or unique event.id values, depending on the aggregation window.
  • KEX method: prefer pqc.handshake.key_exchange_algorithm; fallback to pqc.handshake.server_hello.key_share.group for TLS 1.3 key-share group detail.
  • Safety: use pqc.quantum_safety for the overall connection classification.