Setup vs. charge
A mandate has two phases, and only the first involves the human. Setup (once, with a passkey). A mandate is created through a payment session carrying amandate_setup block — there is no standalone create
endpoint. The response is an approval URL; the owner opens it and confirms with
their passkey. That single approval is the standing consent.
Charge (later, no passkey). Against an active mandate, an agent mints fresh
single-use credentials with no new passkey — as many
times as the caps allow. Charging is available
through the CLI and the
REST API; it is deliberately not exposed over MCP.
The passkey approval at setup is the only human-in-the-loop step. Every later
charge is authorized by that original approval, bounded by the caps below.
Lifecycle
A mandate moves through these statuses:
Recurring mandates stay
active across cycles; a one-time mandate becomes
consumed after its charge settles. Illegal transitions (e.g. resuming a
cancelled mandate) are refused with 409 MANDATE_INVALID_TRANSITION.
Guardrails
A mandate is itself a guardrail. Every charge is bounded by:
Recurring frequencies are available today: approve once, and the agent charges
within caps each cycle without a fresh passkey. Scheduled subscriptions — where
Prava auto-charges on the cycle — are coming next; for now the agent still initiates
each charge within the cycle.
This sits inside Prava’s layered guardrails: owner account
controls, then the passkey approval, then the mandate’s own caps, then the
single-use credential each charge produces.