- Updated
- Reading
- 8 min
- By
- Anlyon Team
Auth0 for AI Agents (Token Vault) vs Anlyon: tokens, and what the agent may do with them
Auth0 Token Vault stores your users' tokens and CIBA asks them to approve. Anlyon makes the call: a per-user limit, an approval bound to the request, a receipt.
- comparison
- end users
- auth0
- token vault
- ciba
- approvals
Auth0 for AI Agents gives your users a login, keeps their third-party tokens in Token Vault, and can ask them to approve a step on their phone through CIBA. Anlyon also keeps each user's token, then makes the call itself, under a limit counted for that user, with an approval bound to the exact request and a graded receipt for each write.
If your agent mostly reads, or you already run Auth0 and want a token store next to it, Auth0 is a natural fit. If your agent writes in your users' HubSpot, Slack, Linear, GitHub or Notion and a wrong write would be your problem, read on. Facts about Auth0 below come from Auth0's own docs and site, checked on 2026-11-02.
What Auth0 for AI Agents does
Auth0's AI docs describe four features: user authentication, Token Vault, asynchronous authorization and FGA for RAG (auth0.com/ai/docs, as of 2026-11-02). The product went GA in a post dated Nov 19, 2025, which cites "35+ supported app integrations" and custom OAuth connections (Auth0 blog, as of 2026-11-02).
Per-user tokens. A user connects an account through the My Account API's connected accounts flow, and Auth0 "stores the provider's access and refresh tokens in Token Vault" (Token Vault, as of 2026-11-02). The AI docs say Token Vault "manages obtaining, storing, and refreshing API tokens." To act, "the agent then performs a token exchange to retrieve an external access token" and "uses the external access token to call the third-party API on the user's behalf" (call third-party APIs, as of 2026-11-02). So your agent's process holds the provider token for the call.
Approvals through CIBA. Your backend sends a request to /bc-authorize, the user approves on a trusted device (Guardian push by default, email if you enable it), and your backend polls /token (async authorization, as of 2026-11-02). Auth0's AI SDK wraps a tool with withAsyncAuthorization() and a bindingMessage built from the tool's arguments; on approval "the Auth0 AI SDK retrieves an access token to call the shop's API" (get started, as of 2026-11-02).
What a CIBA approval binds to. This is the part worth being precise about. Per Auth0's CIBA reference, the request carries a binding message ("required and up to 64 characters"), a scope that must include openid, an audience, and optional authorization_details, which Guardian renders on the consent screen. On approval, Auth0 returns an access token with authorization_details in the response (user authorization with CIBA, as of 2026-11-02). Auth0's RAR page says it supports validating authorization_details types, and lists "validating RAR objects beyond checking that they have a type property" under what Auth0 does not support (RAR, as of 2026-11-02). In short: the approval yields a token for your API, and your API enforces what it means. We did not find in Auth0's docs, as of 2026-11-02, a step where Auth0 compares the request your agent later sends with what the user approved.
Limits, audit, deletion, self-host, pricing. We did not find a limit you set per user on agent writes in Auth0's AI docs as of 2026-11-02. The marketing page mentions "built-in audit trails" (auth0.com/ai, as of 2026-11-02). Deleting a connected account "does not automatically revoke the external provider's tokens" (connected accounts, as of 2026-11-02). Pricing is per monthly active user. The GA post says the Free plan includes "two connected apps in our Token Vault", the pricing page shows no CIBA on Free, CIBA needs Enterprise or an add-on, and Private Deployment is an Enterprise add-on (pricing, as of 2026-11-02).
What Anlyon does
Your agent names an action, such as hubspot-update-deal-stage. Your server names the user with anlyon.forUser(session.user.id). Anlyon holds that user's token and makes the call. Because the call goes through Anlyon, four things happen on every governed write: it counts against that user's limit before it is sent, it can wait for that user's yes in your app, it comes back with a graded receipt, and it is filed under that user.
await ops.approvalPolicies.create({
name: 'User approves closing a deal',
matchKind: 'action',
matchActionName: 'hubspot-update-deal-stage',
condition: "input.dealstage == 'closedwon' || input.dealstage == 'closedlost'",
effect: 'require_approval',
decidedBy: 'end_user',
});
// In your app, the signed-in user decides:
await anlyon.endUsers.approvals.decide(user.id, approvalId, { decision: 'approve' });
Moving a decision from your team to the user counts as loosening a control, so when this policy is created with an API key, the call throws SignOffRequiredError and the policy waits until a workspace admin approves it at error.signOffUrl. An admin can also create it directly in the console under Controls → Policies. An agent can never loosen its own guardrails.
The approval is bound to a SHA-256 digest of the exact request: request, target, versions, preconditions and expiry. Anlyon recomputes it before dispatch and refuses on any difference, so what the user approved is what runs.
Side by side
| Question | Auth0 for AI Agents (as of 2026-11-02) | Anlyon |
|---|---|---|
| Who connects the account | The user, through the connected accounts flow (source) | The user, through a connect link your server creates. Your server confirms the connection from your session, so a forwarded link cannot attach someone else's account |
| Where tokens live and who refreshes them | Token Vault stores and refreshes them (source); your agent exchanges for the provider token and calls the API (source) | Encrypted in Anlyon, refreshed by Anlyon. Anlyon makes the call; your process never gets the token |
| Per-user limits on writes | We did not find this in Auth0's AI docs (source) | Counted and reserved per user before the call, in money, record changes or a unit you declare |
| Approval by the end user, bound to the exact request | CIBA: the user approves a binding message, scope, audience and optional authorization_details; Auth0 validates the type, your API validates the rest (source) | The user decides in your app; bound to a digest of the exact request, rechecked before dispatch |
| Receipt per write with provider read-back | We did not find this in Auth0's docs (source) | A graded receipt per write; confirmed means a read-back of the provider's record matched |
| Binding the user so a prompt cannot switch it | The token exchange starts from the signed-in user's Auth0 token; the SDK's userID comes from your session (source) | Your server binds the user with forUser(); the tools have no user field and the client cannot be switched |
| Erase a user | Deleting a connected account does not revoke provider tokens (source) | endUsers.erase(): revokes where the provider supports it, deletes connections, cancels approvals, clears counters |
| Catalogue size | "35+ supported app integrations" plus custom OAuth (source) | Sign-in for HubSpot, Slack, Linear, GitHub, Notion; about 27 API-key integrations |
| Self-host | Private Deployment, Enterprise add-on (source) | Runs as a hosted service |
| Pricing model | Per monthly active user; AI Agents add-on adds 50% to base price (source) | Monthly plans; governed actions are the billed meter (pricing) |
Anlyon's limits, stated once: the list of integrations is shorter, and Gmail, Google Calendar and Salesforce are not live yet. End users are supported over the HTTP API and the TypeScript and Python SDKs, not yet over MCP or the CLI. Anlyon is a small company.
When to choose Auth0 for AI Agents
- You already run Auth0 for sign-in and want tokens, login and fine-grained access for RAG from one vendor.
- Your agent needs Google or Microsoft accounts today, or a custom OAuth connection.
- You are happy for your agent's process to hold the provider token and call the API, and your own API will enforce what a CIBA approval allows.
- You want approvals on the user's phone through Guardian, outside your app.
- You need Auth0's scale, enterprise contracts and private deployment.
When to choose Anlyon
- Your agent writes in your users' accounts, and one user's runaway session must not spend another user's allowance.
- You want the user's yes in your own app, and the request that runs to be the request they saw.
- You need a receipt per write that says whether the provider's own record matched.
- You want a prompt to have no way to name a different user, and a forwarded connect link to attach nothing.
- You want to erase a user in one call. See acting for your users, per-user limits and user approvals in your app.
Using both
Many teams will keep Auth0 as their identity provider. Your server reads the signed-in user's id from the Auth0 session and passes it to anlyon.forUser(). For the integrations Anlyon supports, each user connects their account to Anlyon, and Anlyon makes those calls. For anything else, your agent can keep using Token Vault. The two do not share tokens: a connection in Token Vault is not available to Anlyon, and the reverse. For a wider view, see agent auth platforms compared and Arcade, Composio and Anlyon.
Sources
All checked on 2026-11-02.
- Auth0 for AI Agents docs: https://auth0.com/ai/docs
- Auth0 for AI Agents GA post: https://auth0.com/blog/auth0-for-ai-agents-generally-available/
- Token Vault: https://auth0.com/docs/secure/tokens/token-vault
- Connected accounts for Token Vault: https://auth0.com/docs/secure/tokens/token-vault/connected-accounts-for-token-vault
- Call third-party APIs on a user's behalf: https://auth0.com/ai/docs/intro/call-third-party-apis-on-users-behalf
- Asynchronous authorization: https://auth0.com/ai/docs/intro/asynchronous-authorization
- Async authorization quickstart: https://auth0.com/ai/docs/get-started/asynchronous-authorization
- User authorization with CIBA: https://auth0.com/docs/get-started/authentication-and-authorization-flow/client-initiated-backchannel-authentication-flow/user-authorization-with-ciba
- Authorization code flow with RAR: https://auth0.com/docs/get-started/authentication-and-authorization-flow/authorization-code-flow/authorization-code-flow-with-rar
- Auth0 for AI marketing page: https://auth0.com/ai
- Auth0 pricing: https://auth0.com/pricing
- Anlyon docs: https://docs.anlyon.com/guides/act-for-your-users
Frequently asked questions
- What is Auth0 Token Vault?
- Token Vault is part of Auth0 for AI Agents. As of 2026-11-02, Auth0's docs say it stores the access and refresh tokens for each account a user connects, and your agent exchanges an Auth0 token for the provider's access token, then calls the provider's API itself.
- What does an Auth0 CIBA approval bind to?
- Per Auth0's docs as of 2026-11-02, the user approves a request shown as a binding message of up to 64 characters, plus scope, audience and optional authorization_details. Approval returns an access token for your API. Auth0 validates the type of each authorization_details object, and the docs say validating the rest is up to you.
- Is there an alternative to Auth0 Token Vault where the agent never holds the user's token?
- Anlyon keeps each user's token, refreshes it, and makes the call itself. Your agent names an action, your server names the user, and the call counts against that user's limit and can wait for that user's yes. Anlyon's integration list is shorter than Auth0's.
- Can I use Auth0 and Anlyon together?
- Yes. Auth0 can sign your users in and stay your identity provider, and your server passes the signed-in user's id to Anlyon's forUser(). Each user still connects their accounts to Anlyon separately. Tokens in Token Vault are not passed to Anlyon.
