ref, it takes an idn_ id or the persona’s name — the API resolves both.
The persona
create—POST /v1/identities.IdentityCreateis{ name, description?, metadata? }. A persona is created empty; its endpoints are minted through their own routes.list—GET /v1/identities, cursor-paginated.get—GET /v1/identities/{ref}.update—PATCH /v1/identities/{ref}.IdentityPatchis every create field optional. The denormalisedemails/phones/domains/connectionsarrays are read-only here.delete—DELETE /v1/identities/{ref}. Checkagentsfirst.
The grant
The agent↔identity edge hangs off the agent — it answers which personas that agent may act as.attach—POST /v1/agents/{id}/identities. Idempotent: re-attaching answersattached: true, created: false, so a provisioning script can re-run safely.detach—DELETE /v1/agents/{id}/identities/{identity_id}. The identity itself is untouched; running sessions are not interrupted.held—GET /v1/agents/{id}/identities: which personas may this agent wear.
agents
GET /v1/identities/{ref}/agents — who may wear this persona. The reverse direction of the same edge, and the read to do before deleting an identity.
Endpoint reads
The addressable objects behind the persona’s denormalised arrays — what a screen needs to show status or delete a row:inboxes—GET /v1/identities/{ref}/emails.deleteInbox—DELETE /v1/identities/{ref}/emails/{inbox_id}.phones—GET /v1/identities/{ref}/phones.releasePhone—DELETE /v1/identities/{ref}/phones/{phone_id}. Irreversible at the carrier: the number goes back to the pool and cannot be reclaimed.messages—GET /v1/identities/{ref}/messages: everything that arrived for this persona, both channels unlesschannelnames one.
emails and phones; these are the identity-side reads.