Enable A2A
- Open the agent and go to the Channels tab.
- Toggle A2A on. This sets
a2aEnabledon the agent and makes its agent card publicly discoverable. - Create an A2A API key for the agent (prefix
pf_a2a_). Keys are scoped to a single agent and are shown in full only once at creation. An agent can have up to 20 keys.
- Skill allowlist — restrict which of the agent’s skills are advertised on the agent card.
- Auto-approve tools — when on, A2A calls bypass interactive tool-approval gates (use carefully).
- End-user connections — require a verified end-user token so each external caller acts as their own connected identity.
Discover the agent (agent card)
A2A clients start by fetching the agent card, which is public (gated only by the A2A toggle) and describes the agent and how to call it:The agent card is the source of truth for the call URL: clients should read the JSON-RPC endpoint from the card’s
url field rather than hardcoding a host. The card is cached with a 60-second Cache-Control and an ETag.Send a message
Call the JSON-RPC endpoint from the card’surl with the message/send method. Authenticate with the agent’s A2A key in the X-Api-Key header:
parts can be text, file (by URI), or structured data.
Response
A terminal reply comes back as an A2A message:status.state such as input-required or auth-required. Resume by calling message/send again with the same contextId (see below).
Maintaining conversation context
A2A carries the conversation handle incontextId (the A2A equivalent of a chat ID):
- First message — omit
contextId. The server creates a chat and returns itscontextIdin the result. - Follow-up messages — set
params.message.contextIdto the value you got back. The agent reuses that chat and sees the full history.
contextId is bound to the agent (and, when end-user connections are enabled, to the specific end user) that created it. A caller cannot resume a chat that belongs to a different agent or a different end user — those requests fail closed.
Authentication summary
A2A keys are per-agent and non-transferable: the key’s signed scope (
a2a-agent:<agentId>) must match the agent in the URL, so one agent’s key cannot call another agent.
Supported methods
Because the current implementation is synchronous, the server returns either a terminal message or a paused task inline; clients drive multi-step flows with follow-up
message/send calls that share a contextId.
Error codes
A2A uses JSON-RPC error objects. The HTTP status is200 for protocol-level errors (the error is in the envelope), 403 for auth failures, and 404 when the agent is missing or not A2A-enabled.
Related
- Agent API channel — the simpler plain-HTTP surface for one agent.
- Agent Management API — create, update, list, and invoke agents.
- Channels tab — enabling channels from the agent builder UI.

