Methodology
How it works.
Three stages. Read. Cross-check. Call it.
A header parser pulls out From, Reply-To, Return-Path, the Received chain IPs, and the Authentication-Results verdicts. A regex pass over the body extracts URLs, bare domains, email addresses, and IPs.
Sender is tagged primary. Everything else is secondary. Capped at 20 unique identifiers per check.
Every identifier is placed on the Whisper graph in parallel. Registrar, MX, SPF, DNSSEC, ASN, country, threat-feed history, co-located hostnames.
3.67B nodes · 30.8B relationships · sub-millisecond query
The signals compose into a single verdict against published thresholds. The rules are below. The graph is the authority.
Below 30 → clean · 30–79 → mixed · 80+ → hostile
Weights live in src/lib/score.ts. Templates that turn each triggered signal into plain English live in src/lib/templates.ts. Both are open source under github.com/whisper-sec/isitspam.
The same graph and queries are available to your team. Set up the MCP client, read the Cypher query guide, or browse the full developer documentation.