Transaction Tokens
Stops access tokens being passed between an agent’s internal tools and services while keeping the user’s intent attached.
Flows / Delegation chains
Inside your own infrastructure, replace the access token with a short-lived token that pins down one transaction and travels the whole call chain.
A request arrives at your edge with an access token. Behind the edge are an agent, the tools it calls, and the services those tools call. If the access token is passed along, every one of those services holds a credential that works at the front door. If each hop calls the others with only its own service identity, the downstream services have no idea who the request is for.
A transaction token sits between those two failures. At the edge, the external token is exchanged for a signed, short-lived token that records who the request is for, which workload asked, and the fixed details of what was requested. That token is passed unchanged from service to service inside one trust domain. Services can read it and make decisions on it, but they cannot alter the context, and the token is useless outside.
For agent systems this is a way to keep the user’s intent attached to a request as an LLM fans it out across tools, without handing the model’s surroundings a reusable credential.
9 steps between 4 parties. Each step shows the message and who holds which credential afterward. Use ←→ or select any arrow.
Drag to see every party and step. Tap a step to jump to its explanation.
The gateway validates the caller’s access token in the normal way. This is the last place that token should be seen.
Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
A profile of token exchange. The gateway authenticates as a workload, presents the access token as the subject, and supplies details of the request.
POST /txn-token-service/token_endpoint HTTP/1.1
Host: txn-token-service.trust-domain.example
Content-Type: application/x-www-form-urlencoded
grant_type=urn:ietf:params:oauth:grant-type:token-exchange
&requested_token_type=urn:ietf:params:oauth:token-type:txn_token
&audience=trust-domain.example
&scope=trade.stocks
&subject_token=<external access token>
&subject_token_type=urn:ietf:params:oauth:token-type:access_token
&request_context={"req_ip":"69.151.72.123","authn":"face"}
&request_details={"action":"BUY","ticker":"MSFT","quantity":"100"}Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
It checks the subject token and the requester, then writes the context into the token it signs. From here on those details cannot be changed by anything downstream.
Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
The header type is txntoken+jwt. txn identifies the transaction, sub the user, req_wl the workload that asked for the token, rctx the circumstances of the request, and tctx its fixed parameters. The audience is the trust domain itself.
{
"iat": 1686536226,
"exp": 1686536586,
"aud": "trust-domain.example",
"txn": "97053963-771d-49cc-a4e3-20aad399c312",
"sub": "d084sdrt234fsaw34tr23t",
"req_wl": "apigateway.trust-domain.example",
"rctx": { "req_ip": "69.151.72.123", "authn": "face" },
"scope": "trade.stocks",
"tctx": { "action": "BUY", "ticker": "MSFT", "quantity": "100" }
}Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
The gateway forwards the request with the transaction token in the Txn-Token header. The external access token is dropped here.
Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
Signature, audience, expiry. The agent now knows the user and the approved action without holding anything it could use to start a different transaction.
Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
The agent authenticates to the tool as itself with its workload identity, and attaches the unmodified transaction token. Two questions, two credentials: which service is calling, and what transaction this is part of.
Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
The tool can refuse anything that does not match tctx. If a prompt injection has convinced the agent to sell instead of buy, the tool sees a request that contradicts the signed transaction and rejects it.
Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
The token expires within minutes. A copy found in a log is of little use: wrong time, and no value outside the trust domain.
Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
The transaction tokens draft has been through repeated working group last calls and is waiting for its write-up before going to the IESG. A separate individual draft proposes agent-specific context for the token, so that each agent in a chain is recorded as the request moves. Its claim design changed during 2026, which is a fair signal of how settled it is.
See the full tracker for status and links.
Stops access tokens being passed between an agent’s internal tools and services while keeping the user’s intent attached.
The primitive under on-behalf-of flows, ID-JAG, identity chaining and transaction tokens.
One of several attempts to record which agents handled a request.
Includes a section on agents: each hop in an agent chain must explicitly scope and re-bind the security context.
The closest thing to an IETF reference architecture for agent authentication and authorization. Its opening position: agents are workloads.
Trade the token you were given for a new one that names both the user and the service now acting for them.
Carry who-is-this-for across an organizational boundary, with each side keeping control of its own tokens.
A workload identity that is bound to a key and proven on every request, so it survives the gateways and proxies that agent traffic passes through.
Every agent process gets a cryptographic identity from the infrastructure it runs on, and uses it to authenticate both ends of every connection.