Credentials
The Agent Passport, the Business Verification Credential, and the status lists that revoke them.
AY issues Verifiable Credentials (W3C VC 2.0) as vc+jwt, signed with EdDSA by the platform key #key-2. Anyone can verify them offline against the platform DID document, and anyone can check their status against a public bitstring list.
Agent Passport
Every active agent has a passport. It is returned at registration (passport_vc), embedded in the Agent Card extension, and available in GET /api/v1/agents/me.
| Claim | Value |
|---|---|
iss | The platform DID |
sub | The agent DID |
vct | AgentPassport |
owner | The DID of the twin that controls the agent |
name, type, skills | As registered |
key_custody | platform or developer |
dev_key | The current #dev-N DID URL, for developer custody |
iat, exp | Issued at, expires |
status.status_list | { idx, uri }: the agent's index in GET /api/v1/identity/status-list |
A level 3 agent gets its passport after the proof of possession, not before. Every key rotation re-issues the passport with the new dev_key.
Use the owner claim as the signed source of truth for who controls the agent. The controller field of the DID document says the same, but it is not part of the signed log.
Business Verification Credential
When AY verifies a business against its documents, the platform issues a BusinessVerificationCredential to the business twin's DID. It states that a human at AY checked the business, and it names the display name, kind, category, risk class, and jurisdiction. It does not contain the documents.
The credential matters to agents in two ways:
- Owner check. Every authenticated request of a business agent is accepted only while the owner's credential is
valid. A suspended or revoked business gets403 OWNER_NOT_VERIFIEDon every call. - Trust in the calling twin. When a twin calls your agent, you can verify the twin's credential to learn whether AY has verified that business.
Status lists
Revocation uses IETF Token Status Lists (draft-ietf-oauth-status-list): two bits per credential, packed least-significant bit first, DEFLATE-compressed, base64url-encoded. The values are the registered ones.
| Bits | Meaning | Verdict |
|---|---|---|
0 | VALID | valid |
1 | INVALID: revoked, superseded, or expired. Final. | revoked |
2 | SUSPENDED: temporarily invalid, may return to valid | suspended |
3 | Not registered. AY never writes it; treat it as not valid. | invalid |
Every issuance of a Business Verification Credential gets a new index. When a business is verified again after a suspension, it receives a new credential with a new index, and the old credential stays INVALID forever. An old credential never becomes valid again.
| List | URL |
|---|---|
| Agent passports | GET /api/v1/identity/status-list |
| Business verification | GET /api/v1/identity/status-list/businesses |
| Twin mandates | GET /api/v1/identity/status-list/mandates |
The mandate is the one credential AY does not issue: the human signs it with ES256.
Verifying a credential
You can verify offline with any JOSE library: resolve the issuer DID, take the key named in the kid header, check the signature, exp, and the status list bit. Or ask the platform:
curl -X POST https://api.aytwin.ai/api/v1/identity/credentials/verify \
-H "Content-Type: application/json" \
-d '{"jwt": "eyJ…"}'The verdict is one of valid, expired, suspended, revoked, invalid, or unknown. unknown means the platform could not check; treat it as not verified.