A query language for the internet.
The internet is relationships, not rows. Whisper is queried in Cypher, where you write those relationships as patterns and follow them the way you'd reason about them.
The question, written down
A relational JOINor a flat API can tell you what a single record holds. Neither can express “follow this domain to its addresses, to the networks that announce them, to the networks those peer with.” That’s a path, and paths are what graphs are for.
Cypher lets you draw the path. The query on the right reads almost like the sentence you’d say out loud, and it returns every co-hosted domain on a shared address in one statement. There’s a second advantage that matters more every month: language models already write Cypher. An agent can express a hunt in the same language a human would, with no bespoke integration in between.
MATCH (h:HOSTNAME {name:"example.com"})
-[:RESOLVES_TO]->(ip:IPV4)
<-[:RESOLVES_TO]-(other:HOSTNAME)
WHERE other.name <> h.name
RETURN ip.name AS shared_ip,
collect(other.name)[0..20] AS co_hostedCross-layer is the fast path
A query language is only half of it. The graph itself is shaped around the questions security teams actually ask, so the traversals that cross layers are the ones that run fastest.
An address links straight to the prefix announcing it, so “who routes this?” is one hop, not an IP-in-CIDR scan. Cloud and vendor attribution is resolved when the data is loaded, so “who actually operates this address?” is a lookup, not a guess. The work that would otherwise be a deep scan is folded into an indexed edge ahead of time. You get the depth without paying for it at query time.
The hardest pivots, as one call
On top of plain Cypher, a small set of procedures package the multi-step traversals that come up again and again. They return data and the evidence behind it.
- originswhisper.origins
- Reconstruct the likely real IPs behind a CDN or proxy from passive evidence, each scored and named to the network that announces it — no scanning.
- variantswhisper.variants
- Generate look-alike domains with more than a dozen algorithms and keep only the ones that are actually registered — the shortlist worth investigating.
- identifywhisper.identify
- Resolve a batch of hosts to the vendor and tenancy class behind them, with a confidence band and the evidence for each.
- assesswhisper.assess
- Return a threat verdict with explicit coverage, so "no data" is never mistaken for "clean" — the grounding read an agent runs before it acts.
- walkwhisper.walk
- For a host the graph has not seen before, find the nearest known infrastructure through independent channels — shared nameserver, same network, certificate co-observation.
- explainCALL explain
- Return a verdict with the factors behind it and every source feed, dated — a sourced evidence chain you can put in a ticket, not a number.
Run a real query
This runs live against the production graph. Edit it, or start from an example.
DNS: a hostname to its live IP addresses
The full language and procedure reference lives in the docs, and there’s a direct REST surface on the API page.