The moving parts
- The agent. It uses the Python SDK’s
MachineAgentand a linked OAuth client. The SDK exchanges a signed client assertion for a short-lived access token and attaches it to every call. - The platform. It runs the FastAPI middleware. The middleware checks the token and the scope before your route code runs — or, for live enforcement, an adapter asks MudraID’s
/decide. - The MudraID backend. It issues tokens, publishes signing keys, decides protected actions, processes containment, and keeps the evidence.
What you get
- Identity. Each agent has an identity and a linked OAuth client. The client signs with a private key you hold; MudraID stores only the public key.
- Short-lived tokens. Access tokens last five minutes by default, and never longer than the fifteen-minute ceiling. Each is bound to one resource. The SDK refreshes them for you and reads the real lifetime from
expires_in. - Scopes. A platform decides which agent can do what, per route.
- Live decisions. For protected actions,
/decideanswersallow,denyornot_safely_decided, and fails closed. - Containment. Revoking a grant or suspending the client prevents new access tokens from being issued. A token already issued may remain usable by a surface validating it offline until it expires—five minutes by default and never longer than the configured fifteen-minute ceiling. Integrations using live enforcement consult current authority and containment on each protected action.
- Audit. Every token issuance and every failed authentication is logged and hash-chained, as is every live-enforcement decision. Offline verification happens inside your own middleware, so MudraID neither sees nor records it.
Pick your path
I'm building an agent
Link an OAuth client and use the Python SDK’s
MachineAgent.I run a platform
Add the FastAPI middleware. Protect your routes.
Show me the model
The concepts behind the trust loop.

