What it does
Send an agent card URL (or a domain). We read the card through Countersign's safe fetcher and check: the required fields; that the domain the card names is the host that served it; that the operator publishes the same agent id or key on that domain (/.well-known/agent-identity.json or the JWKS); and that a key proves control: the card's own JWS signature, and an optional signed challenge. The answer is matches, does not match or cannot tell, each check listed, signed with the time we looked; a key the card only names, without a signature or signed challenge, is not a match. It shows control of a domain and a consistent card, not who the operator is in law. Your card address and challenge are not stored; no model.
- Where it sits
- Agents › Trust › Verify
- Who it is for
- Feeds the identity and payment road: one input to a decision to deal with an agent, never the whole decision. For agents, platforms and merchants that must decide whether to deal with, list or pay an agent they have never met.
- Price
- Free: 40 checks an hour per address. A per-check fee is planned, not charging.
- Limits
- Public https hosts only (port 443), no IP addresses. The card is one JSON object up to 200,000 characters with no repeated keys; at most 4 fetches per call. Required: name, url (https) and at least one of id, a public key (Ed25519, canonical base64) or a JWS signature on the card. The card must be served from the host its url names, with no redirect to another host. The operator's statement: /.well-known/agent-identity.json = {"agents":[{"id":"..","public_key":"<b64>"}]} on that host, and/or its JWKS at /.well-known/jwks.json (a card signature's jku is used only if it is that exact path on the same host or a parent domain of it). Card signature: JWS EdDSA over the canonical JSON of the card without 'signatures' (Agent2Agent agent card format 0.3). Challenge (optional): sign the text 'llpro-agent-identity-check/v1', newline, the domain, newline, your nonce, newline, the time (UTC, within 10 minutes of now) with the agent's key. A match by agent id alone is marked weak (an id can be copied). It does not show who the operator is in law: a domain and a key are not a legal person, a licence or a reputation. It does not show that the agent is safe or does what it says, that the domain is not hijacked or the key not stolen, or anything about the time before we looked. Not a certification and not a guarantee. A key a card only names, without the card's own signature or a signed challenge, gives cannot_tell: public keys are public. We fetch only the card address you give us and that host's /.well-known files, at most 4 fetches per call and 120 checks an hour per domain, with the user agent Countersign/1.0 (independent checker; LLPRO); robots.txt is not read, because each fetch is requested by a user for one public address. A does_not_match result records what we saw; it can come from a misconfigured site as often as from anything worse, and an operator can ask for a recheck or correction at llpro.ai/support. We check formats as we read them (the Agent2Agent agent card format version 0.3, JWS, JWKS, canonical JSON with sorted keys); LLPRO claims no certification or conformance and is not affiliated with the Agent2Agent project, the IETF or the W3C. Your card address and challenge are not stored; we keep only counts.
For developers: try it
POST https://llpro.ai/mcp tools/call agent_identity_check
{"card_url":"https://countersign.llpro.ai/.well-known/agent-card.json"}
-> verdict matches|does_not_match|cannot_tell, checks [card_found, required_fields, domain_match, operator_publishes, key_control], signed observation
With proof of key control (optional): {"domain":"example.com","challenge":{"nonce":"<8-128 chars>","at":"2026-11-12T09:00:00Z","signature":"<b64 Ed25519 over the challenge text>"}}
Offline verifier and test vector: llpro.ai/agent-identity-check-verify (agent_identity_verify.py, runs without our server).
For agents
Tool agent_identity_check on https://llpro.ai/mcp and in the tools list. Signed answers are checked with the public key below (signer llpro1:4nkux5vixiuqofshwp7cm73qhm): an Ed25519 signature over the observation as canonical JSON (sorted keys, no spaces).
Public key (base64): TXPAOBZFpvm0UUltSd3fKoGE1Hem7XLvg0P0wyIowto=
For agents: this page as Markdown · JSON · llms.txt · MCP endpoint llpro.ai/mcp · agent card