Skip to main content
POST
Mint fresh single-use card credentials against an active mandate — no passkey. Merchant callers receive plaintext credentials; agent callers receive an encrypted_payload (credentials encrypted to the agent’s public key). POST /v1/mandates/{id}/charge · Authenticated with your secret key (merchants) or Ed25519 signature (agents). Need to create a mandate first? Mandate creation is part of the Session APIs — create a mandate with a mandate_setup block on Create Session.
Charging is available to merchants (secret key) and agents (Ed25519 signature). It is deliberately not exposed over MCP. See Mandates for the model.

Path parameters

string
required
The mandate id (from List Mandates).

Body

string
required
Charge amount as a decimal string with up to 2 decimals, e.g. "40.00". The per-charge cap is enforced by the card network — an over-cap charge is declined (THRESHOLD_EXCEEDED).
string
Idempotency key (max 255). The same mandate id + reference returns the original charge (deduplicated: true) instead of minting again. Omit it and every call is a distinct charge. A failed charge clears its key, so a retry after failure is not deduplicated.
object[]
Optional per-charge product details (exactly one entry, same shape as the purchase_context.custom entries in Create Session). Omit to reuse the mandate’s setup context. Currency always comes from the mandate, never the charge.

Response

string
string
string
string
string
awaiting_result or failed.
string
SUCCESS or FAILURE.
object
Merchant callers: { token, dynamicCvv, expiryMonth, expiryYear }.
object
Agent callers: { ephemeral_public_key, iv, auth_tag, data }, decrypted client-side.
string
string
e.g. THRESHOLD_EXCEEDED on an over-cap decline.
boolean
True when a prior charge with the same reference was returned.

Notes

  • The mandate must be active. Charging a non-active mandate returns 409 MANDATE_NOT_ACTIVE.
  • An over-cap charge is a normal outcome: status: "failed" with an errorMessage such as THRESHOLD_EXCEEDED. The amount cap is enforced at the card-network level.
  • A charge outside a listed mandate’s merchant returns 403 MANDATE_MERCHANT_NOT_ALLOWED.
  • After checkout, settle the outcome with Report a Mandate Charge.

Error responses

Authorizations

Authorization
string
header
required

Your secret key: sk_test_* (sandbox) or sk_live_* (production).

Path Parameters

id
string
required

The mandate id (from List Mandates).

Body

application/json
amount
string
required

Charge amount as a decimal string, e.g. "40.00". Must be within the mandate cap.

Pattern: ^\d+(\.\d{1,2})?$
reference
string

Idempotency key. The same mandate id + reference returns the original charge.

Maximum string length: 255
purchase_context
object[]

Optional per-charge product details — same shape as purchase_context.custom in Create Session.

Required array length: 1 element

Response

Charge initiated; single-use credentials issued.

mandateId
string
instructionId
string
transactionId
string
orderId
string
status
enum<string>
Available options:
awaiting_result,
failed
fetchStatus
enum<string>
Available options:
SUCCESS,
FAILURE
credentials
object

Present for merchant callers: single-use card credentials.

encrypted_payload
object

Present for agent callers: credentials encrypted to the agent's public key.

errorCode
string
errorMessage
string

e.g. THRESHOLD_EXCEEDED on an over-cap decline.

deduplicated
boolean