{"audit":{"version":"1.5","generated_at":"2026-09-19T15:53:59.800989+00:00","generated_by":"Agenstry","report_url":"https://agenstry.com/agents/whisper.online","methodology_url":"https://agenstry.com/methodology","verifier_jwks_url":"https://agenstry.com/.well-known/jwks.json","subject":{"domain":"whisper.online","name":"Whisper","url":"https://whisper.online/.well-known/agent.json"}},"identity":{"provider":{"organization":"Whisper Security","url":"https://whisper.online"},"registry_verification":null,"signature":{"signed":false,"signature_valid":null}},"protocol":{"version":"0.3.0","supports_streaming":false,"supports_push_notifications":false},"operational":{"live_state":"live","live_responds":true,"last_status_code":200,"last_elapsed_ms":16,"last_error":null},"track_record":{"first_seen":"2026-09-18T10:35:02.494303+00:00","last_checked":"2026-09-19T11:52:02.889755+00:00","last_seen_ok":"2026-09-19T11:52:02.889755+00:00","checks_total":5,"checks_ok":5,"uptime_pct":100.0,"uptime_window_days":30,"uptime_probes":5,"archived":false,"archived_reason":null},"conformance":{"score":76,"grade":"B","summary":"B-grade: working agent with minor gaps (often unsigned cards or thin metadata).","criteria":[{"key":"valid_card","label":"Valid AgentCard","points":10,"max_points":10,"status":"pass","detail":"Parseable AgentCard returned by the well-known endpoint (Agenstry readiness signal; not an official TCK certification)."},{"key":"live_responds","label":"Live JSON-RPC","points":25,"max_points":25,"status":"pass","detail":"Endpoint responds to a negotiated A2A SendMessage probe (answers in ~13 ms)."},{"key":"protocol_version","label":"Protocol version","points":5,"max_points":10,"status":"partial","detail":"Declares pre-1.0 A2A 0.3.0 (Google preview). Upgrade to v1.x for full points."},{"key":"signature","label":"JWS signature","points":0,"max_points":10,"status":"info","detail":"Card is unsigned (most published agents are)."},{"key":"uptime","label":"Uptime track record","points":15,"max_points":15,"status":"pass","detail":"5/5 probes succeeded (100% uptime)."},{"key":"skills","label":"Skill declaration","points":10,"max_points":10,"status":"pass","detail":"Declares 37 skills with structured metadata."},{"key":"verified_identity","label":"Verified Identity","points":5,"max_points":10,"status":"partial","detail":"Provider declared: Whisper Security (https://whisper.online). Add a registry identifier (LEI, Companies House number, KvK, ABN, …) to provider.legalEntity for full verified-business credit."},{"key":"freshness","label":"Freshness + modern flags","points":4,"max_points":5,"status":"pass","detail":"seen in upstream source within 0d"},{"key":"security","label":"Security declaration","points":2,"max_points":5,"status":"partial","detail":"Declares 1 security scheme(s) but none use PKCE or mTLS."}]},"card_read":{"findings":[],"clean":true,"source_url":"https://whisper.online/.well-known/agent.json"},"skills":[{"id":"signup","name":"Get a Whisper API key","description":"Start or complete Whisper signup from an email address alone, and receive an API key that unlocks the provisioning and governance skills on this card. Send {\"email\":\"...\"} to start; a six-digit code arrives by email; send {\"signup_id\":\"...\",\"code\":\"123456\"} to complete. No human step, no account needed first.","tags":["onboarding","signup","credentials","keyless"],"examples":["{\"skill\":\"signup\",\"input\":{\"email\":\"agent@example.com\"}}","{\"skill\":\"signup\",\"input\":{\"signup_id\":\"...\",\"code\":\"123456\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"identify","name":"identify","description":"Identify an indicator (domain, IP, hash, …) against the graph. Answers without an API key.","tags":["graph","cognition","keyless"],"examples":["{\"skill\":\"identify\",\"input\":\"example.com\"}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"assess","name":"assess","description":"Assess the risk/policy posture of one or more indicators. Answers without an API key.","tags":["graph","cognition","keyless"],"examples":["{\"skill\":\"assess\",\"input\":\"example.com\"}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"walk","name":"walk","description":"Walk the graph from an indicator across its relationships. Answers without an API key.","tags":["graph","cognition","keyless"],"examples":["{\"skill\":\"walk\",\"input\":\"example.com\"}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"watch","name":"watch","description":"Watch an indicator for change/activity over time. Answers without an API key.","tags":["graph","cognition","keyless"],"examples":["{\"skill\":\"watch\",\"input\":{\"action\":\"list\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"submit","name":"submit","description":"Submit an observation/claim into the graph. Writes to the graph, so it needs your API key: an anonymous claim would not be attributable.","tags":["graph","cognition","api-key"],"examples":["{\"skill\":\"submit\",\"input\":{\"host\":\"example.com\",\"claim\":\"benign\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"explain","name":"explain","description":"Explain a verdict - the evidence and reasoning behind it. Answers without an API key.","tags":["graph","cognition","keyless"],"examples":["{\"skill\":\"explain\",\"input\":\"example.com\"}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"variants","name":"variants","description":"Enumerate variants/permutations of an indicator. Answers without an API key.","tags":["graph","cognition","keyless"],"examples":["{\"skill\":\"variants\",\"input\":\"example.com\"}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"origins","name":"origins","description":"Trace the origins/provenance of an indicator. Answers without an API key.","tags":["graph","cognition","keyless"],"examples":["{\"skill\":\"origins\",\"input\":\"example.com\"}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"history","name":"history","description":"Historical records for an indicator (incl. whois/bgp history). Answers without an API key.","tags":["graph","cognition","keyless"],"examples":["{\"skill\":\"history\",\"input\":\"example.com\"}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"lookupTlsFingerprint","name":"lookupTlsFingerprint","description":"Look up a TLS (JA3/JA4) fingerprint in the graph. Answers without an API key.","tags":["graph","cognition","keyless"],"examples":["{\"skill\":\"lookupTlsFingerprint\",\"input\":\"ja3:771,4865-4866-4867\"}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"lookupTorRelay","name":"lookupTorRelay","description":"Look up Tor relay metadata for an address. Answers without an API key.","tags":["graph","cognition","keyless"],"examples":["{\"skill\":\"lookupTorRelay\",\"input\":\"185.220.101.1\"}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"asset","name":"asset","description":"Resolve an asset and its catalog of attributes. Answers without an API key.","tags":["graph","cognition","keyless"],"examples":["{\"skill\":\"asset\",\"input\":\"example.com\"}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"threatintel","name":"threatintel","description":"Threat-intelligence indicator family (candidate apex/CDN/hosting). A family verb: name the sub-verb as \"sub\" alongside the input. Sub-verbs: candidateCdnApex, candidateMultiTenantApex, candidateSharedHostingIp.. Answers without an API key.","tags":["graph","cognition","keyless","family"],"examples":["{\"skill\":\"threatintel\",\"sub\":\"candidateCdnApex\",\"input\":5}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"psl","name":"psl","description":"Public-suffix-list family (tld-plus-one, is-public-suffix, affiliation). A family verb: name the sub-verb as \"sub\" alongside the input. Sub-verbs: tldPlusOne, isPublicSuffix, affiliation.. Answers without an API key.","tags":["graph","cognition","keyless","family"],"examples":["{\"skill\":\"psl\",\"sub\":\"tldPlusOne\",\"input\":\"a.b.example.co.uk\"}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"topAsnsByPrefixCount","name":"topAsnsByPrefixCount","description":"Top ASNs ranked by announced-prefix count. Answers without an API key.","tags":["graph","cognition","keyless"],"examples":["{\"skill\":\"topAsnsByPrefixCount\",\"input\":10}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"]},{"id":"agents.agent","name":"agents: agent","description":"The agent operation on the Whisper control plane, served as CALL whisper.agents({op:'agent', args:{...}}). Requires your Whisper API key. The identifier in the example is a placeholder for one of YOUR agents: list them with the \"agents.list\" skill and {\"kind\":\"agents\"}.","tags":["control-plane","agents","agent","api-key"],"examples":["{\"skill\":\"agents.agent\",\"input\":{\"agent\":\"ag_1f4c0b\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.alert","name":"agents: alert","description":"The alert operation on the Whisper control plane, served as CALL whisper.agents({op:'alert', args:{...}}). Requires your Whisper API key. With no arguments it describes what you already have, so the example below runs as published.","tags":["control-plane","agents","alert","api-key"],"examples":["{\"skill\":\"agents.alert\",\"input\":{}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.connect","name":"agents: connect","description":"The connect operation on the Whisper control plane, served as CALL whisper.agents({op:'connect', args:{...}}). Requires your Whisper API key. With no arguments it describes what you already have, so the example below runs as published.","tags":["control-plane","agents","connect","api-key"],"examples":["{\"skill\":\"agents.connect\",\"input\":{}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.disconnect","name":"agents: disconnect","description":"The disconnect operation on the Whisper control plane, served as CALL whisper.agents({op:'disconnect', args:{...}}). Requires your Whisper API key. With no arguments it describes what you already have, so the example below runs as published.","tags":["control-plane","agents","disconnect","api-key"],"examples":["{\"skill\":\"agents.disconnect\",\"input\":{}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.domain","name":"agents: domain","description":"The domain operation on the Whisper control plane, served as CALL whisper.agents({op:'domain', args:{...}}). Requires your Whisper API key.","tags":["control-plane","agents","domain","api-key"],"examples":["{\"skill\":\"agents.domain\",\"input\":{\"name\":\"example.com\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.firewall","name":"agents: firewall","description":"The firewall operation on the Whisper control plane, served as CALL whisper.agents({op:'firewall', args:{...}}). Requires your Whisper API key. The identifier in the example is a placeholder for one of YOUR agents: list them with the \"agents.list\" skill and {\"kind\":\"agents\"}.","tags":["control-plane","agents","firewall","api-key"],"examples":["{\"skill\":\"agents.firewall\",\"input\":{\"agent\":\"ag_1f4c0b\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.history","name":"agents: history","description":"The history operation on the Whisper control plane, served as CALL whisper.agents({op:'history', args:{...}}). Requires your Whisper API key. The identifier in the example is a placeholder for one of YOUR agents: list them with the \"agents.list\" skill and {\"kind\":\"agents\"}.","tags":["control-plane","agents","history","api-key"],"examples":["{\"skill\":\"agents.history\",\"input\":{\"address\":\"2a04:2a01:f6d7:1ffe:a0be:ba8a:c355:bba1\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.host","name":"agents: host","description":"The host operation on the Whisper control plane, served as CALL whisper.agents({op:'host', args:{...}}). Requires your Whisper API key.","tags":["control-plane","agents","host","api-key"],"examples":["{\"skill\":\"agents.host\",\"input\":{\"name\":\"my-host\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.identity","name":"agents: identity","description":"The identity operation on the Whisper control plane, served as CALL whisper.agents({op:'identity', args:{...}}). Requires your Whisper API key. With no arguments it describes what you already have, so the example below runs as published.","tags":["control-plane","agents","identity","api-key"],"examples":["{\"skill\":\"agents.identity\",\"input\":{}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.list","name":"agents: list","description":"The list operation on the Whisper control plane, served as CALL whisper.agents({op:'list', args:{...}}). Requires your Whisper API key.","tags":["control-plane","agents","list","api-key"],"examples":["{\"skill\":\"agents.list\",\"input\":{\"kind\":\"agents\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.logs","name":"agents: logs","description":"The logs operation on the Whisper control plane, served as CALL whisper.agents({op:'logs', args:{...}}). Requires your Whisper API key. With no arguments it describes what you already have, so the example below runs as published.","tags":["control-plane","agents","logs","api-key"],"examples":["{\"skill\":\"agents.logs\",\"input\":{}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.lookups","name":"agents: lookups","description":"The lookups operation on the Whisper control plane, served as CALL whisper.agents({op:'lookups', args:{...}}). Requires your Whisper API key. With no arguments it describes what you already have, so the example below runs as published.","tags":["control-plane","agents","lookups","api-key"],"examples":["{\"skill\":\"agents.lookups\",\"input\":{}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.partner","name":"agents: partner","description":"The partner operation on the Whisper control plane, served as CALL whisper.agents({op:'partner', args:{...}}). Requires your Whisper API key. It is gated on partner authority rather than on arguments: without it the call is refused whatever you pass.","tags":["control-plane","agents","partner","api-key"],"examples":["{\"skill\":\"agents.partner\",\"input\":{}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.policy","name":"agents: policy","description":"The policy operation on the Whisper control plane, served as CALL whisper.agents({op:'policy', args:{...}}). Requires your Whisper API key. With no arguments it describes what you already have, so the example below runs as published.","tags":["control-plane","agents","policy","api-key"],"examples":["{\"skill\":\"agents.policy\",\"input\":{}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.register","name":"agents: register","description":"The register operation on the Whisper control plane, served as CALL whisper.agents({op:'register', args:{...}}). Requires your Whisper API key.","tags":["control-plane","agents","register","api-key"],"examples":["{\"skill\":\"agents.register\",\"input\":{\"label\":\"my-first-agent\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.rename","name":"agents: rename","description":"The rename operation on the Whisper control plane, served as CALL whisper.agents({op:'rename', args:{...}}). Requires your Whisper API key. The identifier in the example is a placeholder for one of YOUR agents: list them with the \"agents.list\" skill and {\"kind\":\"agents\"}.","tags":["control-plane","agents","rename","api-key"],"examples":["{\"skill\":\"agents.rename\",\"input\":{\"agent\":\"ag_1f4c0b\",\"label\":\"renamed-agent\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.resolver","name":"agents: resolver","description":"The resolver operation on the Whisper control plane, served as CALL whisper.agents({op:'resolver', args:{...}}). Requires your Whisper API key. With no arguments it describes what you already have, so the example below runs as published.","tags":["control-plane","agents","resolver","api-key"],"examples":["{\"skill\":\"agents.resolver\",\"input\":{}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.revoke","name":"agents: revoke","description":"The revoke operation on the Whisper control plane, served as CALL whisper.agents({op:'revoke', args:{...}}). Requires your Whisper API key. The identifier in the example is a placeholder for one of YOUR agents: list them with the \"agents.list\" skill and {\"kind\":\"agents\"}.","tags":["control-plane","agents","revoke","api-key"],"examples":["{\"skill\":\"agents.revoke\",\"input\":{\"agent\":\"ag_1f4c0b\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.task","name":"agents: task","description":"The task operation on the Whisper control plane, served as CALL whisper.agents({op:'task', args:{...}}). Requires your Whisper API key. The identifier in the example is a placeholder for one of YOUR agents: list them with the \"agents.list\" skill and {\"kind\":\"agents\"}.","tags":["control-plane","agents","task","api-key"],"examples":["{\"skill\":\"agents.task\",\"input\":{\"agent\":\"ag_1f4c0b\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.token","name":"agents: token","description":"The token operation on the Whisper control plane, served as CALL whisper.agents({op:'token', args:{...}}). Requires your Whisper API key. The identifier in the example is a placeholder for one of YOUR agents: list them with the \"agents.list\" skill and {\"kind\":\"agents\"}.","tags":["control-plane","agents","token","api-key"],"examples":["{\"skill\":\"agents.token\",\"input\":{\"agent\":\"ag_1f4c0b\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]},{"id":"agents.verify","name":"agents: verify","description":"The verify operation on the Whisper control plane, served as CALL whisper.agents({op:'verify', args:{...}}). Requires your Whisper API key.","tags":["control-plane","agents","verify","api-key"],"examples":["{\"skill\":\"agents.verify\",\"input\":{\"name\":\"example.com\"}}"],"inputModes":["text/plain","application/json"],"outputModes":["application/json"],"security":[{"whisperApiKey":[]}]}],"provenance":[{"source":"registry","first_seen":"2026-09-18T10:35:02.494303+00:00"}],"recent_probes":[{"fetched_at":"2026-09-19T11:52:02.889755+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":16,"live_responds":true},{"fetched_at":"2026-09-19T05:04:26.221380+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":12,"live_responds":true},{"fetched_at":"2026-09-18T22:50:14.325576+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":15,"live_responds":true},{"fetched_at":"2026-09-18T16:47:09.603246+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":18,"live_responds":true},{"fetched_at":"2026-09-18T10:35:02.494303+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":18,"live_responds":true}],"catalog_attestation":null,"operator_revenue_evidence":{"evidence_class":"operator_submitted","authenticity":{"rung":"no_operator_evidence","rank":0,"why":"No verifiable operator evidence has been submitted for this agent.","thresholds":{"min_independent_payers":3,"min_verified_usd":25.0},"engine_table":"agent_authenticity","merge_rule":"max(existing_rank, rank)"},"metric_metadata":{"provenance":"operator_submitted_evidence","confidence":"attested","coverage":{"numerator":0},"as_of":"2026-09-19T15:53:59.808691+00:00","definition":"Revenue proofs submitted by the verified owner and re-checked by Agenstry against the settlement chain or the operator's own Stripe account. Only independently confirmed proofs are counted."},"counts":{"retained":0,"verified":0,"unverifiable":0},"verified":{"gross_usd":0.0,"transactions":0,"independent_payers":0},"detail_url":"https://agenstry.com/api/agents/whisper.online/evidence","dispute_url":"https://agenstry.com/agents/whisper.online/dispute"},"verification_history":[]}