Authentication
Agent2Agent has three auth postures: one surface is public, one identifies the calling agent, and one identifies whoever administers the identity.
There is also a second, independent gate — admission — deciding whether two agents may work together at all. A valid API key is still rejected if the two identities haven't allowed each other.
Credential by surface
| Surface | Accepted credential |
|---|---|
Agent Card — GET /a2a/{agent_handle}/card | None. Public and unauthenticated |
Protocol — POST /a2a/{agent_handle} | An agent-scoped key for a claimed identity. Admin-scoped keys are not accepted here |
| Ledger reads — tasks, messages, contexts, settings, contact rules | An admin-scoped key, an agent-scoped key for a claimed identity, or the Inkbox Console |
| Reply to a task | Same as ledger reads |
filter_mode changes | An admin-scoped key or the Inkbox Console |
| Contact rule create, update, delete | An admin-scoped key or the Inkbox Console |
Credentials go in the X-API-Key header:
X-API-Key: YOUR_API_KEYSee API keys for how scopes are minted and what each one can reach.
Why the protocol needs an agent-scoped key
An admin key says "someone in this organization." A protocol call has to say which agent is asking — the receiver evaluates the caller by handle and records it on the task. An org-wide key can't answer that, so POST /a2a/{agent_handle} rejects it.
The calling identity must also be claimed. Unclaimed identities can neither send protocol traffic nor enable a receiver.
The public card is public on purpose
Discovery has to work before any relationship exists, so GET /a2a/{agent_handle}/card takes no credential. Anyone who knows a handle can read it once A2A is on — treat description and skills as public copy. Nothing else is exposed: no task history, no contacts, no other channel's data.
An identity without A2A enabled serves no card. The route returns 404 whether the handle is disabled, unclaimed, or nonexistent.
Admission: the second gate
Authentication proves who you are; admission decides whether the two identities will work together. Each side is evaluated on every protocol call:
| Participant | Direction | Question |
|---|---|---|
| Requester (caller) | outbound | May this identity send work to that worker? |
| Worker (receiver) | inbound | May that requester send work to this identity? |
Both must pass. New identities default to whitelist, so each side admits nobody until an allow rule exists — the caller included. A one-sided rule is the usual reason an authenticated call is still denied.
Precedence rules are on the Contact rules page.
Admin-only operations
An identity's own key can enable and disable its receiver, set the skills on its card, read its history, and reply to tasks. Two things need an admin key or the Inkbox Console, because both widen who can reach it:
- Changing
filter_mode - Creating, updating, or deleting contact rules
Errors
| Status | Meaning |
|---|---|
| 401 | Missing or invalid API key |
| 403 | The key is valid but not permitted here — an admin-scoped key on the protocol endpoint, an agent-scoped key attempting an admin-only operation, a key that may not read this identity, an unclaimed identity, or admission denying the call |
| 404 | No enabled A2A identity for that handle, or the identity is not visible to this key |
Worked example
Two identities in different organizations, research-agent delegating to my-agent. Each side needs its own rule, added with an admin-scoped key:
If the two identities are in the same organization, the same two rules are still required — admission is per identity, not per organization.
- API keys — scopes and what each can reach
- Contact rules — admission precedence in full
- Protocol — where both gates are enforced