WhisperDocs
Endpoint

The /128 identity

Every host and every agent gets a real, routable IPv6 address that is its identity. A stranger can verify it with stock tools, and our API is never in the trust decision.

Most EDRs hand an endpoint an opaque vendor GUID that only their console can interpret. Whisper hands it a public internet identity instead: a routable IPv6 /128 out of 2a04:2a01::/32, announced by AS219419 (viaGraph B.V., a RIPE resource holder). The address is not a token you rent from us. It is an identity you hold, named in the public DNS, registered in public RDAP, and checkable by anyone. That single fact is the anchor for everything else: reverse-DNS attribution, per-/128 egress and policy, the off-host kill-switch, the graph verdict, and agent governance all hang off it. In the seven-layer architecture this is layer one, and every other layer keys off it.

Two tiers, one primitive

The identity is not a feature of the sensor. It is the other way around: the identity is the product, and the sensor is an optional layer you add where you want per-process depth. Everything on the keyless side works with no agent installed and no API key, for anything that can hold an address, a server, a laptop, a printer, an ephemeral AI agent.

Two tiers around one primitive: the keyless tier needs no agent and no API key and covers enroll, verify, resolve, RDAP and the revoke proof; the keyed tier adds the optional sensor, policy, logs and budgets. Both act on the same /128. KEYLESS · NO AGENT · NO API KEY enroll a /128 identity verify it: dig · delv · curl, to the root RDAP, the public registry object the revoke, provable by anyone nobody needs our word for any of it WITH A KEY · THE CONTROL PLANE the calm sensor: per-process depth policy: firewall · egress · geo · per-device logs, budgets, the kill-switch the graph verdict on every destination the power-up, never the price of entry the same /128
Both tiers act on the same primitive. The keyless half is complete on its own; adding a key unlocks the sensor and the control plane, and never changes what a stranger can verify.

Verify it yourself, keyless

The whole point is that you do not take our word for it. Here is the live identity of a real agent, scout, checked with nothing but dig, delv and curl, against the IANA root. No account, no API key.

The address names itself. Reverse DNS resolves the /128 to its identity:

$ dig +noall +answer -x 2a04:2a01:b69a:6717:e3b0:51ff:3bf7:f478 @1.1.1.1
8.7.4.f...ip6.arpa. 60 IN PTR ae3b051ff3bf7f478.tdc38e7c55bad3306a92b830f9bb1e4f9.agents.whisper.online.

The name is signed: delv re-derives the chain to the IANA root, and the record carries an RRSIG under algorithm 13 (ECDSA P-256), validated to the root:

$ dig +dnssec -x 2a04:2a01:b69a:6717:e3b0:51ff:3bf7:f478 @9.9.9.9
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2      # ad is the resolver's claim; delv re-derives the chain
8.7.4.f...ip6.arpa. 60 IN PTR   ae3b051ff3bf7f478.tdc38e7c55bad3306a92b830f9bb1e4f9.agents.whisper.online.
8.7.4.f...ip6.arpa. 60 IN RRSIG PTR 13 34 60 20260826210000 20260824200000 58485 1.0.a.2.4.0.a.2.ip6.arpa. kXm7KL2mBVn...

The loop closes. The forward AAAA of that name returns the same /128, so the reverse-DNS binding is forward-confirmed, the standard internet trust primitive an operator can authorize on:

$ dig +noall +answer AAAA ae3b051ff3bf7f478.tdc38e7c55bad3306a92b830f9bb1e4f9.agents.whisper.online @1.1.1.1
...agents.whisper.online. 0 IN AAAA 2a04:2a01:b69a:6717:e3b0:51ff:3bf7:f478

The TLS leaf is pinned. A DANE-EE record (usage 3, selector 1, matching 1) pins the agent's certificate key in DNSSEC, so its mTLS identity is verifiable with no public CA in the path:

$ dig +noall +answer TLSA _443._tcp.ae3b051ff3bf7f478.tdc38e7c55bad3306a92b830f9bb1e4f9.agents.whisper.online @1.1.1.1
_443._tcp...agents.whisper.online. 0 IN TLSA 3 1 1 9EC1EF18A1F15E5480A0FC3C8D6E9690B2CCF1A7FA7146201940F28C422BB47D

One keyless call, the whole bundle

If you would rather have every proof in a single response, the keyless verify endpoint returns the whole evidence object at once: is this a Whisper agent, does the DANE pin match the served leaf, is the signed identity document valid, and the supporting records to re-check each claim by hand.

$ curl -s 'https://rdap.whisper.online/verify-identity?ip=2a04:2a01:b69a:6717:e3b0:51ff:3bf7:f478'
{
  "is_whisper_agent": true,
  "fqdn": "ae3b051ff3bf7f478.tdc38e7c55bad3306a92b830f9bb1e4f9.agents.whisper.online",
  "tenant": "tdc38e7c55bad3306a92b830f9bb1e4f9",
  "dane_ok": true,
  "jws_ok": true,
  "evidence": {
    "posture": "tier1.5",
    "dane": { "usage": 3, "selector": 1, "matching": 1,
              "profile": "DANE-EE 3 1 1 (DNSSEC-anchored TLSA; no public CA needed)",
              "strong_pin": true, "served_leaf_matches": true },
    "rdap": "https://rdap.whisper.online/ip/2a04:2a01:b69a:6717:e3b0:51ff:3bf7:f478",
    "identity_doc": "https://ae3b0...agents.whisper.online/.well-known/whisper-identity"
  }
}

And the identity is a first-class object in a public registry. The RDAP record is an RFC 9083 IP-network object: who holds the address, when it was registered, and a chain up to the RIPE aggregate:

$ curl -s https://rdap.whisper.online/ip/2a04:2a01:b69a:6717:e3b0:51ff:3bf7:f478
{ "objectClassName": "ip network", "handle": "ae3b051ff3bf7f478",
  "startAddress": "2a04:2a01:b69a:6717:e3b0:51ff:3bf7:f478",
  "name": "scout", "type": "Whisper agent identity", "status": ["active"], "country": "NL",
  "entities": [{ "handle": "tdc38e7c55bad3306a92b830f9bb1e4f9", "roles": ["registrant"] }],
  "events": [{ "eventAction": "registration", "eventDate": "2026-06-26T23:31:14.390Z" }],
  "links": [{ "rel": "rdap-up", "title": "RIR (RIPE) aggregate 2a04:2a01::/32",
              "href": "https://rdap.db.ripe.net/ip/..." }] }
i

These are the same proofs the public how-to at whisper.online/docs/verify walks through, the full seven-proof keyless chain from the DNSSEC root down through DANE, RDAP and the signed identity document. Trust is anchored in the public DNSSEC hierarchy, not in a vendor console.

The same chain, in the console

Operators see that chain rendered on the host page: the /128, its verification state, a copy-the-evidence button that hands you the exact dig to re-run, and the live feed of who has been resolving that identity.

The Whisper EDR console host page for web-edge-01 showing its routable /128, an Identity verified badge reading four checks keyless, a copy-evidence control, and a live who-resolved feed.
The host page for web-edge-01: its routable /128, "Identity verified, 4 checks, keyless", a copy-evidence control that hands you the exact commands, and the who-resolved feed. Real capture, demo data.

It persists across upgrade and restart

An identity is only useful if it is stable. A host's /128 is durable: it survives a sensor upgrade and a reboot, so reverse-DNS attribution, RDAP, policy and the kill-switch all keep pointing at the same identity across the machine's life. You do not re-earn trust every time the agent restarts.

Three ways to carry it on the wire

How the /128 shows up in your traffic is your choice. All three source from the same routable, reverse-DNS-attributable identity.

TierHowBest for
Tier 1 - routedWireGuard (kernel, userspace, or a no-root wireproxy to a local SOCKS5) routes the agent's own /128; packets source from it directly.Full network identity on the wire; reverse-DNS of the source address resolves to the agent.
Tier 1.5 - proxiedA source-bound SOCKS5 or HTTP egress proxy binds each connection to the agent's /128 over the anycast /32.Egress identity with no tunnel to manage; the default for spawned agents.
Tier 2 - resolve-onlyKeep your own address and point resolution at Whisper by DoH or a dedicated resolver /128.Graph-first policy and verdicts without changing how you egress.

You do not have to choose by hand. One command, whisper connect, negotiates the best tier the platform and network can give: it tries Tier 1 first, a routed /128 over userspace WireGuard, under a short bound, and on any failure downgrades automatically to Tier 1.5, which needs nothing but outbound :443. The one-line success message names the tier it landed on; an explicit --tier forces that tier, with no downgrade. And a connection installed as a service carries the observe sensor by default (opt out with --no-sensor; enforcement stays a separate opt-in), so the zero-config path is also the best-protected one.

See connectivity tiers for the setup of each.

Nested identity for AI agents and sub-agents

The agent era needs more than one identity per machine. When an agent spawns a sub-agent, the child gets its own /128 nested under its parent, so an agent tree is governed node by node: each node has its own reputation, its own egress, its own logs and its own revoke. The tree forms two ways, and only one of them carries authority. A parent can be declared at spawn, which is display metadata. The load-bearing edge is measured: the egress plane observes the child's connections physically arriving from the parent's /128 and records that transit, to a depth of 32.

A workstation identity with a build agent nested under it and a browser sub-agent under that. Solid edges are measured transit and carry policy; a dashed edge is a declared parent, display only. Every node lists its own PTR, RDAP, logs and revoke. workstation · ...:41e2 own PTR · RDAP · logs · revoke depth 0 build agent · ...:8c11 own PTR · RDAP · logs · revoke depth 1 browser · ...:f3aa own PTR · RDAP · logs · revoke depth 2 measured measured declared parent (spawn arg) display only · never carries policy policy composes left to right down the measured chain, most-restrictive-wins · a deny or kill at any node binds everything to its right
Each node in the tree is a full identity: its own reverse DNS, its own RDAP object, its own logs, its own revoke. Only the measured edge carries policy; the declared pointer is display metadata, precisely so a hostile agent cannot claim a victim as its parent.

The tree does real work:

i

Scope. Nesting is measured: the parent that carries policy is inferred from observed transit, not from a self-declared claim, because a declared-parent field would be a cross-tenant disclosure oracle. Cross-owner nesting (one tenant's agent nested under another's) is deliberately not enabled today, held on a framing-oracle risk we will not rush.

Why the identity is the anchor

Because the identity is a real, verifiable network object rather than a console record, it does load-bearing work a vendor GUID cannot: