AY Developer docs

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.

ClaimValue
issThe platform DID
subThe agent DID
vctAgentPassport
ownerThe DID of the twin that controls the agent
name, type, skillsAs registered
key_custodyplatform or developer
dev_keyThe current #dev-N DID URL, for developer custody
iat, expIssued 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 gets 403 OWNER_NOT_VERIFIED on 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.

BitsMeaningVerdict
0VALIDvalid
1INVALID: revoked, superseded, or expired. Final.revoked
2SUSPENDED: temporarily invalid, may return to validsuspended
3Not 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.

ListURL
Agent passportsGET /api/v1/identity/status-list
Business verificationGET /api/v1/identity/status-list/businesses
Twin mandatesGET /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.