Skip to main content
Find which limit you hit, and whether waiting clears it.

Plan limits

  • Free and Plus have a payment limit. Enterprise has none.
  • Upgrading raises the limit but does not reset the count, which carries across plan changes.
  • A refusal for a plan quota is plan_quota_reached. It is an account setting, not a card setting.
  • Plan quotas apply on production deployments only. Preview, development, test and staging deployments are not metered.
See Billing.

Spending limits

Set per agent card, in US dollars. Every window is rolling, not a calendar period. A foreign total is converted at a daily reference rate, plus a 3% safety buffer, before it is checked. A currency with no rate, or a rate older than 48 hours, counts as an unknown total. On Free, the starter agent card carries every default except the daily limit. The daily, weekly and rolling 30-day limits apply on production deployments only, like plan quotas. Preview, development, test and staging deployments are not metered: they ignore those rolling caps and enforce only the per-transaction cap.
A card fill counts against the limits the moment it lands, before any order exists. If the order is never placed, that amount still counts until the window rolls past it.
A breach always refuses that fill with limit_reached. What happens next depends on Auto-pause on limit exceeded (autoPauseOnLimit), which is on for every agent card created in the dashboard:
  • On: any breach, including a per-transaction one, changes the card’s status to limit, and it stops filling until you resume it.
  • Off: the card stays active. A smaller cart, or the same purchase once the window rolls past older fills, goes straight through.

Sessions

Tokens never expire. Only sessions do.

Concurrent sessions

  • Past the limit, chromium.launch() is refused with session_limit. The connect is refused, not queued, and nothing is opened or spent.
  • Every session holds a slot until it closes. browser.close() returns once the proxy acknowledges the close, before the slot is released, so a launch right after it can still get session_limit at the plan limit. Speaking the protocol directly, close the WebSocket: a browser.close frame alone leaves the session open.
  • A slot whose release failed, or one held by a proxy that crashed, frees itself within 3 minutes, when its lease runs out without a renewal.
  • Close a session you no longer need, or wait for one to finish, then launch again with backoff. Retrying in a tight loop only spends the connect rate limit below.
  • The limit is per account, so another API key does not raise it.

Hosted MCP server

These apply only to the hosted MCP server. The agent gets each refusal as a tool error carrying the message.

Waiting for the account holder

Rate limits

The per-minute limits and the recipe budget all answer rate_limited. Tell them apart by which call threw: chromium.launch() or a fill (the proxy), listTokens() (the catalog), submitRecipe() (recipes) or a login write. Do not go by a missing retryAfterSeconds. A proxy can strip Retry-After from a catalog 429, and treating that as the daily recipe limit would stop token lookups for a day over a pause of seconds.
Filing a signup request with POST /v1/logins/requests counts toward the per-minute login write limit, but not toward the 24-hour credential-change budget. An ordinary pending request draws on that budget only when the account holder approves it. If the budget is spent then, the request stays pending and the agent never sees daily_limit. A pre-approved signup that completes at once draws on its own allowance instead, listed under Ceilings. The catalog, connect and token resolution windows are fixed one-minute windows, not sliding ones. A refused request records nothing, so retrying early is refused again without pushing the window out. The per-account budgets mean another API key does not raise the limit. A refused fill leaves the session open, so retry it on the same page.

Ceilings

Past either pre-approved ceiling, POST /v1/logins/requests is not refused. It answers pending instead of approved, and the request waits for the account holder like any other. Two more ceilings apply when the account holder adds sites to the Pre-approved signups list. Each one refuses the whole add with signup_preapproval_too_many, and nothing from that add is saved.

Labels per site name

Every login gets a label made from its site’s name, such as example for example.com. A label holds at most 32 lowercase letters and digits, so a longer site name is cut short. When that label is taken, Agent Vault tries example2, example3 and so on, up to 50 candidates. Sites with the same name share them, so example.com and example.co.uk draw on the same 50. When all 50 are taken, a new login for that name is refused, even below the 500-login ceiling:
  • The account holder’s Add login form does not save the login, and shows only That login could not be saved. Check the fields.
  • An agent’s signup request cannot be approved. It stays pending, and the request on Logins says Could not find a free name for this login. Its failure reason is label_unavailable. The agent never sees this code: its request simply stays pending. A pre-approved signup falls back to pending for the same reason.
To recover, the account holder deletes a login that holds one of those labels, then adds the login or approves the request again. Editing a login does not help: a label is never renamed, and changing a login’s website does not change its label.

Payload sizes

Field lengths

Tool limits

Generated passwords

Applies to the passwords the vault generates for agent signups and password rotations (createLogin, rotateLoginPassword, the create_login and rotate_login_password tools, and POST /v1/logins/requests and POST /v1/logins/password).

Automatic key revocation

Each refusal is counted once, at the proxy.

Data retention

Expired data is removed hourly.

Attested checkout concurrency

Applies only to attested detokenization, which is off by default. One code, attested_checkout_busy, covers four ceilings on attested checkouts running at once: by default 1 per session, 2 per key, 2 per account and 4 per proxy instance. It is the one attested code that clears on its own. Back off and retry rather than opening more sessions: the per-key and per-account ceilings mean extra keys do not raise the limit.