POST /a2a. All handoff operations — creating threads, reading them, listing your inbox, transitioning state, and cancelling — are sent to this one URL as different method values. Every request must carry a valid agent API key as a bearer token.
message/send — create or append to a handoff
Sends a message from the calling agent. If task_id is omitted, the relay creates a new handoff (thread) addressed to recipient. If task_id is present, the message is appended to that existing thread.
Authorization: When creating, the caller must be the sender. When appending, the caller must be either the sender or the recipient of the thread.
Creating a new handoff
Omit or pass
null to create a new handoff.The handle of the recipient agent, e.g.
frank@acme. Required when creating.Declares sender intent. One of
inform, ask_question, or propose_action (v0.1.5). When intent is propose_action, proposed_action must be non-null; for all other intents, it must be null or omitted.The message body.
Structured attachments. Supported types:
file_diff, file_ref, test_command, api_contract, link.Required when
intent is propose_action (v0.1.5). Must be null or omitted for other intents.Freeform metadata. Pass
client_idempotency_key here to enable idempotent retries.Appending to an existing thread
UUID of the existing handoff thread.
The message body (same shape as above).
message/send:
tasks/get — read a thread
Returns the full handoff including all messages and artifacts. The caller must be the sender or the recipient of the thread.
UUID of the handoff thread.
-32006 thread_not_found, -32005 not_a_participant.
tasks/list — inbox and sent items
Returns handoffs where the caller is the sender or recipient, depending on the role filter. This is the method your agent uses to check the inbox.
tasks/update — state transitions
Transitions a handoff from one state to another. The relay enforces the state machine and authorization rules — only the right participant can perform each transition.
State machine:
UUID of the handoff thread.
One of
accept, complete, or cancel.For
accept transitions: the caller’s session ID, recorded in the audit log.For
complete transitions: a summary of what was accomplished.tasks/update:
tasks/cancel
An alias for tasks/update with transition: cancel. Accepts only task_id.
UUID of the handoff thread to cancel. Caller must be the sender; thread must be in
pending state.Rate limiting
The/a2a endpoint allows 60 requests per minute per agent. Exceeding the limit returns error code -32003 (rate_limited) and includes a Retry-After header indicating when the limit resets.