Where it is served
A gateway’s agent plane has its own host, next to the LLM and MCP ones:<agent> is the agent’s registry id, or its name when exactly one enabled agent
of the application has that name. Anything else is 404.
GET /v1/gateways/{id} returns the host as hosts.agent, with
agent_token_issuer beside it. Both are absent when the environment publishes no
agent host; the gateway then serves no agents.
The pieces
Agents are a plane of their own on an application, next to its models and MCP
servers. The application’s one key opens all of its planes.
The card is pinned
The gateway reads the agent’s card once, when the agent is added, and serves that copy. A change on the agent’s side reaches callers only after someone reviews and approves it (Check for changes in the console). See Card pinning. The card a caller gets is rewritten:- the gateway’s URL is its only JSON-RPC interface;
- the gateway API key (
X-AG-API-Key) is its only security scheme, with no per-skill security; - push notifications and the extended card are off;
signaturesis removed, along with the other version’s interface and security fields.
Methods
A method of the other version, an unknown one, or one outside the agent’s
Allowed methods answers
-32601. Refused calls never reach the agent.
Tasks belong to their caller
A task or context belongs to the application and subject that first received it from the agent: the application itself, the end user it named, or the person an identity provider signed in. Two keys of one application share their tasks; two end users of one application do not.- Before
tasks/get,tasks/cancel,tasks/resubscribe(and the 1.0 names), and before a message that names ataskIdorcontextId, the gateway checks the owner. Another owner, or none, answersTaskNotFoundError(-32001) without calling the agent. A new conversation sends nocontextId; the agent assigns it. - Every task and context id an answer names is recorded for the caller for 7 days, renewed each time an answer names it again.
- An answer that names an id another caller owns is not delivered (
-32092,ownership_conflict).
-32092, ownership_unavailable) and nothing is sent.
What reaches the agent
The caller’s JSON-RPC body, unchanged, at the agent’s endpoint, with:- the agent’s sign-in credential and its static headers;
Content-TypeandAccept;A2A-Version: 1.0on 1.0 agents;X-AG-Trace-Id;- the caller’s
X-A2A-Extensions(0.3) orA2A-Extensions(1.0).
Authorization, not Cookie, not any
X-AG-*. The answer keeps the caller’s JSON-RPC id.
Policies
Three policies apply to agent calls: Rate Limiter, Request Size Limiter and TrustGuard. Global policies of any other kind are left out of agent calls. Policies see the message parts, the same for both versions: text, data and files. On the request they see the message sent; on the response, the parts of a message answer, or of a task’s status message, artifacts and agent messages. A block answers-32090 instead of calling the agent, or instead of its answer.
The gateway does not rewrite parts, so a mask verdict also blocks. In a
stream, each event with content is checked before it is relayed; a blocked event
is replaced by a -32090 event, the stream is closed, and the gateway cancels the
task at the agent. Artifact chunks sent with append are checked one by one, so
content split across two chunks can pass.
Limits
These values are fixed.
Traces
Each call is a trace of kinda2a in Activity: the agent, method, version,
task and context ids, task state, the agent’s HTTP status, the outcome, the
blocking policy, and the sign-in mode and subject kind (user or app). Never
the token.
Next
Agents
Add an agent, pin its card, choose how TrustGate signs in to it.
Connect to an agent
Call an agent from an application, and what each error means.
Hosted agents
Agents on Amazon Bedrock AgentCore, Microsoft Foundry and Vertex AI.
Verify TrustGate's token
How an agent checks that a call came through the gateway, and for whom.