Agent identity check
Inspect a public agent credential or agent card and see, separately, who signed it, who it says operates the agent, whether that operator controls the claimed domain, whether a legal entity was validated, and the current status of each key, each with the time it was checked and how long the result stays fresh. Optionally run a live key-possession challenge.
The claim that a vendor operates an agent, a domain-control check and legal-entity vetting are different assertions. The check never merges them into one "verified" badge.
Console: https://sectigoaxiom.com/tools/identity-check (no account needed).
Run a check
POST /v1/public/identity-check with one of:
| Field | What it is |
|---|---|
agent_card | An agent card as inline JSON, or an Axiom-signed card. |
url | An https URL to fetch the card from. |
jwk | A bare public JWK (EC P-256 or OKP Ed25519). Private key material (d) is refused. |
refresh | Optional true to ignore a cached result and check again. |
curl -sS https://api.sectigoaxiom.com/v1/public/identity-check \
-H 'content-type: application/json' \
-d '{"url":"https://agents.example.com/.well-known/agent-card.json"}'Read the result
{
"id": "chk_01…",
"checked_at": "2026-11-15T10:02:11.000Z",
"fresh_until": "2026-11-15T10:17:11.000Z",
"cached": false,
"subject": { "kind": "agent_card", "url": "https://agents.example.com/.well-known/agent-card.json" },
"issuer": { "name": "Example Agents Ltd", "kind": "self_declared", "verified": false },
"operator": {
"claimed": {
"result": "claimed",
"value": "Example Agents Ltd",
"source": "self_declared",
"checked_at": "…",
"fresh_until": null,
"detail": "…"
},
"domain_control": {
"result": "verified",
"value": "example.com",
"source": "https_origin",
"checked_at": "…",
"fresh_until": "…",
"detail": "…"
},
"legal_entity": { "result": "not_validated", "value": null, "source": "none", "checked_at": "…", "fresh_until": null, "detail": "…" }
},
"self_declared": { "…": "fields the card asserts about itself" },
"keys": [{ "kid": "…", "status": "unknown", "source": "self_declared", "checked_at": "…" }],
"evidence": [{ "kind": "card_fetch", "result": "fetched", "checked_at": "…", "detail": "…" }]
}| Assertion | Possible results | What it proves |
|---|---|---|
issuer | kind: axiom, self_declared, none | Who signed or published the card. verified: true only for a valid Axiom signature. |
operator.claimed | claimed, absent | What the card says. Always self-declared. |
operator.domain_control | verified, mismatch, not_found, not_verified, not_checked | The card is served over HTTPS from the claimed domain (or matches the card at its well-known location, /.well-known/agent-card.json or /.well-known/agent.json), or the domain is a verified domain of a Sectigo-validated organisation. |
operator.legal_entity | validated, validated_stale, not_validated | Only validated when an Axiom-signed card binds the agent to an organisation Sectigo validated, with the evidence time and its freshness bound. |
keys[].status | active, rotating, revoked, expired, suspended, retired, unknown | Read live from Axiom's credential records (source: axiom); unknown when Axiom has never seen the key. Certificate status is checked with the CA where one exists. |
Verifying a signature and establishing a key's current status are separate: the result reports both.
Freshness and caching
A result is stored and reused until fresh_until (at most 15 minutes, shorter if any evidence expires sooner); cached: true says you got a stored result. Pass refresh: true to check again. Every result can be linked from a review:
curl -sS https://api.sectigoaxiom.com/v1/public/identity-check/chk_01…The stored result is returned with stale: true once fresh_until has passed.
Live key-possession challenge
A card can list a key that the live agent does not hold. The challenge proves possession now; it is never cached.
Request a nonce for the key:
shcurl -sS https://api.sectigoaxiom.com/v1/public/identity-check/challenge \ -H 'content-type: application/json' -d '{"jwk":{"kty":"EC","crv":"P-256","x":"…","y":"…"}}'Response:
{ challenge_id, nonce, expires_in: 300, sign: { typ: "axiom-possession+jws", payload: { nonce, aud } } }.The agent signs a compact JWS with header
typ: axiom-possession+jwsover{ "nonce": "…", "aud": "https://api.sectigoaxiom.com" }(audis optional, but must match when present).Submit the proof:
shcurl -sS https://api.sectigoaxiom.com/v1/public/identity-check/challenge/verify \ -H 'content-type: application/json' -d '{"challenge_id":"chk_01…","proof":"eyJ…"}'Response:
{ possession: true, thumbprint, checked_at }. Each challenge is single-use and expires after five minutes.
Axiom-signed agent cards (opt-in)
An agent's owner can publish an Axiom-signed card for a registered agent. It is off by default; an unpublished card and a non-existent agent both return 404, so the endpoint cannot be used to enumerate agents.
Publish (tenant admin, requires
agent.write):httpPUT /v1/agents/agt_01…/card/publication { "enabled": true, "domain": "agents.example.com" }The response includes
card_url. Adomainis shown as claimed unless it is one of the organisation's verified domains.Read (public):
GET /v1/agents/agt_01…/cardreturns{ card, jws }: the card (v: axiom.agent-card.v1, with the agent's keys and their current status,card_urlandjwks_uri) and the same card as a compact JWS (typ: axiom-agent-card+jws) signed by Axiom'sidentitykey. Submit either to the identity check. A valid signature says Axiom issued the card at itsissued_at; it says nothing about the agent's status now, which the check reads live.
Trust anchors
GET /v1/public/ca/trust-anchors returns the CA name, its mode and the PEM trust anchors that agent certificates chain to. Agent credentials chain only to these purpose-specific anchors: browser trust for website TLS does not extend to agent credentials.
Status
Sectigo SCM runs in mock mode in this preview, backed by a local development CA that issues real X.509 certificates; mode in the response says which. Organisation validation through SCM is only as real as the configured CA.