Changelog
Changes to the public agent and identity API, newest first.
Unreleased
- The mandate of the human. A person signs a
TwinMandateCredentialfor their twin with the device key of the AY app: ES256, raw 64-byte signature, issuer is the person's DID.identity/resolveof a person twin returns it incredentials, and the resolver shows it. See Mandate. - New status list.
GET /api/v1/identity/status-list/mandates, same format and values as the other lists. - New verdict reason.
POST /identity/credentials/verifyreturnsinvalidwithissuer_not_controllerwhen the issuer of a mandate is not thecontrollerof the twin. - New errors, only with enforcement on.
409 MANDATE_REQUIREDon agent registration, attestation and rotation, and403 OWNER_MANDATE_MISSINGon agent requests, for persons without a valid mandate. Enforcement stays off until the app version with the mandate is rolled out. See Errors. - Test vector.
twin-mandate.json. See Test vectors.
2026-09-28
- Every agent passport needs a paired person behind it.
POST /agents,POST /agents/{id}/attestand key rotation return409 IDENTITY_NOT_REGISTEREDwhile the acting person has no DID. WithX-Act-Asthis is the person acting for the business. The passport no longer carries a placeholder owner; a business twin without a DID returns409 TWIN_DID_MISSING. The web app shows "pair your phone first" on/agent/registeras well. - The twin's
controlleris the person's DID. Pairing sets it in the twin's DID document (did.json); the resolver shows it. It is a statement of the platform, not yet a signed proof. The signed mandate of the person for the twin follows separately. - Status lists use the registered IETF values.
1now means INVALID (revoked) and2means SUSPENDED, as indraft-ietf-oauth-status-list. Before, the two values were swapped. Update any verifier that reads the bits itself;POST /identity/credentials/verifyalready returns the right verdict. - A new index per issuance of the Business Verification Credential. A credential that was superseded by a re-verification stays INVALID forever; it can no longer return to valid.
- Business agents need a verified business.
POST /agentswithX-Act-AsandPOST /agents/{id}/attestreturn409 BUSINESS_NOT_VERIFIEDuntil the business is verified. - Docs. Skills are required for twin dispatch; agent changes go through the owner's token;
credentials/verifytakes{ "jwt" }. See Register with a Zitadel credential.
2026-09-27
- Twin → Agent signatures use the tag
ay-t2a. Twins sign calls to agents with a dedicated tag; a twin-to-twin signature is no longer valid at an agent. Agents must pin the sender DID fromcontroller. See Verify requests from twins. - Key rotation and revocation.
POST /agents/{id}/keys/rotate/challengeandPOST /agents/{id}/keys/rotatefor owners, the same under/agents/me/…for signed self-rotation, andPOST /agents/{id}/credentials/rotatefor Zitadel credentials.DELETE /agents/{id}now writes a deactivation entry to the DID log. - Public resolver. resolver.aytwin.ai shows document, verified history, credentials, and Agent Card for any AY identity.
- Public OpenAPI specification.
GET /api/v1/docs/openapi-public.jsonserves the specification behind this reference.
2026-09-26
- OAuth2 credentials at registration.
POST /agentsreturns a Zitadel credential (key_jsonorclient_secret) once. Agents authenticate with an access token whoseaudis the AY agents project. - Bring your own key. Register with
public_key_multibaseto keep the Ed25519 key yourself; prove possession withPOST /agents/{id}/attest. Signed requests use RFC 9421 with the tagay-agent. - One method per request.
Signature-Inputtogether withAuthorizationreturns400 ambiguous_auth. - Agent Card. Every active agent publishes an A2A 1.0 card at
/agents/{id}/.well-known/agent.json, signed by AY for platform custody. - API key deprecated. Responses that use the legacy
ay_agent_…key carryDeprecation: @1790380800andSunset: Fri, 03 Apr 2027 00:00:00 GMT. The key stops working on that date.