Skip to main content
PUT
Approve or decline a proposed mandate

Authorizations

x-juno-jwt
string
header
required

Session JWT from the identity provider that signed the user in — Dynamic Labs, Privy, or Clerk (consumer sign-in). Send it in the x-juno-jwt header on every authenticated request. An Authorization: Bearer <jwt> header carrying the same JWT is also accepted, and takes precedence when both are present.

Headers

x-sumvin-ceremony-ticket
string | null

Ticket from the approval link. Treat it as a secret: it addresses a live spending authorisation, carries exactly one decision, and stays usable until that decision is made or the approval window closes.

x-juno-jwt
string | null
x-juno-orgid
string | null

Tenant org ID for multi-tenant auth

X-Timestamp-Format
string

Controls how timestamp fields are serialized in JSON response bodies.

Default (header omitted or any other value): epoch milliseconds as integers. iso8601: UTC ISO 8601 strings of the form YYYY-MM-DDTHH:MM:SSZ.

Example: with X-Timestamp-Format: iso8601, the field value 1704067200000 becomes "2024-01-01T00:00:00Z".

Affected fields (recursively, in dicts and arrays): any field whose name ends in _at, plus the literal field names timestamp, period_start, and period_end. All other fields are passed through unchanged.

Only iso8601 is recognized. Any other value (or omitting the header) yields the default epoch-ms representation; the server does not reject unknown values, so this is documented as an example rather than an enum to keep generated clients permissive.

Example:

"iso8601"

Body

application/json

The account holder's answer to a proposed spending mandate.

decision
enum<string>
required

Whether to authorise the proposed spending mandate. Approving requires the signature; declining does not.

Available options:
approved,
declined
signature
string | null

Signature over the prepared authorisation exactly as it was supplied, produced by a wallet key registered on this account. Required to approve, and ignored when declining.

Response

Decision recorded

A proposed spending mandate as it currently stands.

HAL-style hypermedia links for navigation.

ceremony_id
string
required

Stable identifier for this approval, safe to log and to quote in support.

status
enum<string>
required

Where the approval stands: awaiting a decision, authorised, declined, or lapsed. Reconciled against the mandate itself, which a separate actor can move.

Available options:
proposed,
stamped,
declined,
expired
expires_at
integer
required

When this approval lapses, in epoch milliseconds. After it, nothing can be signed.

mandate_uri
string
required

Identifier of the spending mandate being authorised.

statement
string
required

The sentence the wallet shows the account holder. It names the spending limit and the moment the authorisation lapses, and it is part of what is signed.

scopes
string[]
required

Exactly what this mandate authorises, as it appears in the signed authorisation.

chain_id
integer
required

Network the signature is produced on.

verifying_contract
string
required

Address the signature is checked against — the wallet on this account.

signer_anchor
enum<string>
required

What the signature has to prove. registered_safe_owner means it must come from a key registered as an owner of the account's wallet; the wallet is a contract and cannot sign for itself.

Available options:
claimed_wallet,
registered_safe_owner
typed_data
EIP712Payload · object
required

The prepared authorisation to sign, exactly as stored. Sign these bytes unchanged — anything rebuilt from the fields above may differ from what is verified.

reason
string | null

Why the approval reached this state when that is not simply the account holder's own answer — for example an authorisation withdrawn before it was approved. Null when there is nothing to add.