ExchainDocs
DocsAPI

Get startedMandates

Mandates

The limits Exchain checks before it co-signs, on every chain.

A mandate is the set of limits Exchain checks every payment against, using the wallet's history. You set it at registration, and it does not change. The same mandate model applies on every chain; only the seller rules differ.

Parameters

All six are required. Amounts are decimal strings in the asset's minor units; burstPerMinute is an integer. Limits are in the asset's own units, with no USD conversion.

ParameterRuleWindowRefusal code
perTxCapLargest single payment60 sper_tx_cap
burstPerMinuteNumber of payments60 svelocity_burst
dailyTotal outflowRolling 24 hdaily_outflow
perSellerTotal per counterpartyRolling 24 hper_seller_cap
perAgentTotal per agent: the intent's agentIdentifier on Cardano, the registered agent address on EVM chainsRolling 24 hper_agent_cap
envelopeTotal over the wallet's life3,650 daysenvelope_exhausted
constitution
{
  "constitution": {
    "params": {
      "perTxCap": "50000000",
      "daily": "1000000000",
      "perSeller": "200000000",
      "perAgent": "500000000",
      "envelope": "50000000000",
      "burstPerMinute": 10
    }
  }
}

With a 6-decimal asset, 50000000 = 50 units (50 tADA or 50 USDC). Read a wallet's mandate with GET /v1/wallets/{walletId}/mandate, and what is left of it with GET /v1/wallets/{walletId}/allowance.

A wallet may govern several assets, each with its own mandate: up to 16 on Cardano, and up to 16 of one chain's listed assets on an EVM Safe. Each payment counts only against the mandate of its own asset. See Several assets.

Rolling windows

  • Windows slide; they do not reset on a calendar day.
  • A 409 window refusal carries retryAfterSec. daily_outflow and per_agent_cap also carry windowResetsAt.
  • windowResetsAt frees the oldest contribution in the window. That may not be enough for your next payment.
  • Decision time is Exchain's clock, never context.submittedAt.
409 member, daily_outflow
{ "purchaseId": "pur_2", "outputIndex": 1, "verdict": "denied", "denied": "daily_outflow", "reasonEnglish": "<plain-English reason>", "bound": "1000000000", "used": "990000000", "attempted": "19000000", "retryAfterSec": 5400, "windowResetsAt": "2026-11-06T11:30:00Z" }

Seller rules

Seller rules are set at registration, next to the mandate.

RuleCardanoEVM chainsRefusal
Allow and deny listssellerAllowList, sellerDenyList: sellerVkeyHash:<56 hex> or agent identifierssellerAllowList, sellerDenyList: the payee as eip155:<chainId>:0x…, lowercasecounterparty_blocked
Registry gateregistryGate: the seller is a live Masumi registry agent—registry_gate
Price gatepriceGate: no payment above the seller's published price—price_above_published
Seller binding—sellers: an x402 payment must match the seller's signed offerpayee_unpinned, price_above_published, body_mismatch
Unsigned sellers—unsignedSellers: "refuse", or { "allowUnder" } to cap payments without a signed offer. With seller binding on, every direct payment counts as unsignedregistry_gate

Details: Seller gates (Cardano) and Seller binding (EVM chains).

Changing a mandate

There is no API to change a mandate. Registering the same wallet again with different limits returns 409 wallet_exists. To change limits, create and register a new wallet.

Two ceilings

The mandate is one of two limits on what an agent can spend. The second holds on chain, without Exchain.

MandateCardano on-chain ceilingEVM chains
Set byRegistration with ExchainThe owner, in the wallet datumThe owner, by funding the Safe
Enforced byExchain, before it co-signsThe Cardano contractThe chain: a Safe cannot pay more than it holds
LimitsSix limits plus seller rulesOne limit per asset per period, plus a minimum balanceThe Safe balance, plus any Permit2 approval and treasury allowance
Protects againstA misbehaving agentA misbehaving agent and a compromised ExchainA misbehaving agent and a compromised Exchain

On Cardano, set the on-chain period limit at or above the mandate's daily. On EVM chains, keep in the Safe no more than the agent may spend.

GET /v1/wallets/{walletId}/bound returns both, signed and read on chain at one block or slot: honest is what the mandate still allows, and worstCase is what could leave if the agent key and every Exchain key were stolen.

On this page