Skip to main content
Approvals put a human in the loop before an agent does anything high-stakes. When an agent triggers a sensitive action, the API freezes the request and returns 202 { status: "pending_approval", approval_id } instead of executing. A human (the developer, or the end-user in your app) approves or denies it; on approval the API replays the frozen action and records the result. Gating is configured per primitive on the Account Kit, and the queue is a first-class resource alongside vault and logs.

CLI First

Tools

ToolTypeDescription
approvals_listCoreList approvals (filter by status)
approvals_getCoreFetch a single approval + its result/error
approvals_approveCoreApprove → API replays the frozen action
approvals_denyCoreDeny with an optional reason

What’s gated by default

Actionaction_type
Issue a virtual cardcards.create
Create a cardholdercards.cardholder.create
Top up a cardcards.topup
Purchase a domaindomains.purchase
Start KYC (verification)verification.start
Form a companyformation.create
File the formationformation.submit
Connect / sign up for a 3rd-party serviceconnections.connect
Developers override this per primitive in the Account Kit (primitives_config.<primitive>.requiresApproval, or connections_config.requiresApproval). Set true to force approval, false to opt out. Human (dashboard/session) callers bypass the gate, and so do agent calls on the account’s own default agent profile — only agent calls on real tenant users are gated.

Lifecycle

Pending response (202):
A pending approval becomes executed (with the action’s result), failed (with an error), or denied.

Error Handling

ErrorCauseRecovery
not_foundInvalid approval_id / user_idUse GET .../approvals?status=pending
invalid_inputApproval already resolved (executed/denied)Fetch it to see the terminal status
forbiddenCaller may not resolve this approvalApprove as the developer (session or workspace key)

Typical Workflow