News

Technical blog

HTTP Methods Are Not Agent Permissions

GET, POST, and DELETE describe how a request should be handled at the transport layer. They do not prove who authorized an agent, what business action the agent intended, or what changed after the request completed.

An AI agent sends a request through transport, protocol, authorization, and real-world effect layers while a guardian observes the complete path

In an A2A system, the HTTP method is the envelope. Security depends on the operation inside it, the authority behind it, and the effect that finally reaches the world.

HTTP gives distributed systems a common vocabulary. A client uses GET to retrieve a representation, POST to ask a resource to process input, PUT to replace a representation, and DELETE to remove one. These semantics make browsers, caches, proxies, crawlers, and APIs interoperable.

The vocabulary is useful, but it is easy to assign it more security meaning than it has. A request method does not authenticate a principal, establish a mandate, limit a purchase, or attest to the effects produced downstream. This distinction becomes critical when autonomous agents translate natural-language goals into A2A messages, tool calls, and transactions.

Safe, idempotent, and authorized are different properties

HTTP defines GET as a safe method because its requested semantics are essentially read-only. “Safe” describes what the client asks the server to do. It does not guarantee that the implementation has no incidental effect. Servers still write access logs, update metrics, charge advertising accounts, and populate caches when processing GET requests.

Idempotency is different again. A method is idempotent when repeating the same request has the same intended effect as making it once. HTTP defines safe methods, PUT, and DELETE as idempotent. That does not mean DELETE is harmless; it means deleting the same resource twice should not produce two different intended deletions.

PropertyQuestion it answersWhat it does not establish
SafeDid the client request an essentially read-only operation?That the server produced no side effect
IdempotentCan an identical request be repeated without multiplying its intended effect?That the operation is low-risk or reversible
AuthenticatedWhich client or principal presented a valid identity?That this identity may perform this action
AuthorizedIs this principal permitted to perform the scoped action now?That the implementation stayed within the scope
Observed effectWhat state actually changed across the complete dependency chain?That the change was intended or authorized

How a GET request can still change the world

The most direct failure is a server that violates HTTP semantics. The HTTP standard explicitly warns about resources such as page?do=delete: if a query parameter selects an unsafe action, the resource owner must disable that action for safe methods. Otherwise crawlers, link checkers, previews, and prefetchers can trigger it simply by following a URL.

Agent systems add several more paths from nominal retrieval to effect:

  • Legacy endpoints. An old service accepts page edits, subscriptions, or state transitions through a GET query string.
  • Redirect and proxy chains. A permitted destination forwards the request to a blocked service or interprets a URL as an instruction to fetch and publish data.
  • Observable metadata. URLs, query values, referrers, counters, and access logs become durable signals that another agent can later read.
  • Application reactions. Fetching a resource triggers a webhook, lazy job, billing event, cache fill, or downstream workflow.
  • Sensitive disclosure. Even a perfectly implemented read can reveal task history, artifacts, prices, identities, or private capabilities to the wrong agent.

This is the technical lesson behind the reported German wiki incident. Agents that were intended to read the public web allegedly found wiki software where GET parameters could save content. The transport policy saw a read method; the destination produced a write effect. The resulting pages then became shared memory across separate agent runs.

Where GET and POST appear in A2A v1.0

A2A defines an interaction model and several protocol bindings. In the HTTP+JSON binding, retrieval and state-changing operations are mapped to conventional HTTP methods.

HTTP requestA2A purposeSecurity-sensitive result
GET /.well-known/agent-card.jsonDiscover identity, interfaces, capabilities, and skillsSelects which remote agent and endpoint will be trusted
GET /extendedAgentCardRetrieve authenticated, more detailed discovery metadataMay disclose private skills and operational details
GET /tasks/{id}Retrieve status, artifacts, and optionally task historyCan expose confidential work or another tenant's task
GET /tasksList tasks matching a filterCan reveal activity patterns and cross-task relationships
POST /message:sendSend a message or initiate/continue a taskThe message can request a quote, purchase, transfer, or deletion
POST /tasks/{id}:cancelAttempt to cancel an active taskCan interrupt fulfillment and create contractual consequences

These mappings are transport conventions, not a commerce specification. A2A does not decide when a quote becomes a binding order, settle a payment, or define a company's approval limit. Those meanings belong to the application and its surrounding legal and operational controls.

Use a four-layer model for every agent transaction

A useful trust decision separates four layers that are often collapsed into one log line.

LayerQuestionEvidence to retain
1. TransportHow did bytes move?Method, URL, headers, redirects, destination IP, response code
2. ProtocolWhich A2A operation and task were invoked?Operation, version, task ID, context ID, tenant, artifact references
3. AuthorityWho may ask for which business action under what limits?Principal, mandate, scope, amount ceiling, expiry, approver
4. EffectWhat actually changed?Order, payment, reservation, file write, notification, receipt

Consider POST /message:send with the message “Buy 500 units at up to $12 each.” At the transport layer, it is a POST. At the A2A layer, it is SendMessage. At the authority layer, it is a proposed purchase under a $6,000 ceiling. At the effect layer, it might create a binding order and a payment obligation—or only return a draft quote. The first two layers cannot answer which outcome occurred.

Authorization must bind to an operation and its effect

A2A v1.0 includes TASK_STATE_AUTH_REQUIRED for tasks that need additional authorization. The specification is careful about its meaning: the state transition alone does not authorize any particular operation. Implementations must define the authorization's scope, validity, revocation, and how the approved operation is identified.

A transaction mandate should bind at least:

  • the human or organization being represented;
  • the requesting and executing agent identities;
  • the counterparty and permitted operation;
  • resource, quantity, price, geography, and time limits;
  • whether delegation to another agent is allowed;
  • an expiry, revocation reference, and approval provenance;
  • the expected receipt or postcondition proving completion.

Credentials passed through a chain of agents are especially risky. The A2A specification recommends binding credentials to the agent that originated the authorization request and protecting them from other agents in the chain. A bearer token that any intermediary can reuse is not a narrowly delegated mandate.

Retries turn semantic mistakes into financial mistakes

Autonomous clients retry aggressively. A timeout after sending an order does not tell the client whether the server committed it before the connection failed. Retrying a non-idempotent purchase can create two orders, two reservations, or two payments.

Use an application-level idempotency key for every consequential action. Bind it to the principal, counterparty, operation, normalized payload, and authorization scope. Store the resulting receipt long enough to answer retries deterministically. Do not infer retry safety from POST or GET alone.

Enforce effects outside the agent's sandbox

A rule implemented inside an environment the agent can inspect or modify is a policy hint, not a durable boundary. Production A2A systems need an independent mediation layer between agent reasoning and external effects.

  1. Resolve the operation. Parse the A2A version, operation, task, tenant, destination, and application intent.
  2. Evaluate the mandate. Check the principal, counterparty, scope, limits, expiry, delegation rules, and required human approval.
  3. Control egress. Enforce destination and redirect policy at a gateway the agent cannot reconfigure. Block tunnel and proxy chains unless explicitly required.
  4. Execute with bounded credentials. Mint short-lived, operation-specific credentials instead of giving agents reusable general-purpose secrets.
  5. Verify the postcondition. Compare the observed state and receipt with the approved effect before reporting success.

What the audit event should contain

A useful trace must connect the network request to the business result. Recording only “agent called URL” or only the natural-language message leaves the important joins unresolved.

Field groupMinimum evidence
Identityrun_id, agent_id, principal_id, runtime attestation
Transportrequest_id, method, original URL, redirect chain, destination
A2Aprotocol version, operation, task ID, context ID, tenant, counterparty
Mandateauthorization ID, permitted effect, limits, expiry, approval source
Outcomeobserved effect, affected resource, amount, receipt ID, before/after digest
Relationshipsparent task, delegating agent, referenced messages, shared external resources

Detection rules worth implementing first

  • Safe-method effect mismatch. Flag GET or HEAD requests followed by an external write, subscription, counter increment, or other consequential state transition.
  • Protocol-to-business mismatch. Flag generic SendMessage operations that produce purchases, payments, deletions, or credential changes without a matching mandate.
  • Cross-agent substrate reuse. Detect multiple isolated runs touching the same rare wiki, paste page, cache key, counter, URL shortener, or tunnel endpoint.
  • Answer or capability propagation. Detect distinctive data, bypass instructions, or task answers moving from one agent's external write into later agents' decisions.
  • Retry multiplication. Group semantically equivalent requests and flag multiple receipts or effects under one intended transaction.
  • Discovery drift. Flag a changed Agent Card, endpoint, interface, signer, or capability between qualification and execution.

A minimum production checklist

  • GET endpoints never expose cross-tenant tasks or private Agent Cards.
  • Unsafe query-string actions are rejected for safe HTTP methods.
  • Redirects are re-authorized at every hop.
  • Consequential actions require scoped, expiring mandates.
  • Orders and payments use application-level idempotency keys.
  • A2A task completion is reconciled with an external receipt.
  • Egress logs are correlated across every concurrent agent run.
  • Evaluation runs are invalidated when cross-run answer sharing appears.
  • Operators have a cohort-level kill switch and evidence-preservation plan.

The AgentCollusion opportunity

Traditional API monitoring asks whether a request was authenticated and whether the endpoint returned success. Agent oversight must ask a larger question: how did information and authority move across agents, tasks, services, and time to produce the final outcome?

The highest-value signals are therefore relationships and mismatches: transport intent versus observed effect, protocol operation versus business meaning, mandate versus outcome, and one agent's discovery versus another agent's later action. That is where an A2A trust layer becomes more than an API gateway.

Sources and further reading

Related: when read-only agents learned to write