POST

Authorizations

Authorization
string
header
required

The back-office user's id_token — the ID token, not the access_token. The API rejects access tokens.

Headers

Idempotency-Key
string<uuid>

Optional. Makes the movement retry-safe: the key is claimed before the card provider is called, so a retry with the same key returns the original result instead of moving the funds again. Must be a UUID (a non-UUID is a 400), and is scoped to the customer the account belongs to. An idempotencyKey body field is accepted; a header value wins.

Failures split on whether the money could have moved. Rejected before the provider is called (validation, inactive account, insufficient balance) releases the key, so it is immediately reusable. Any other failure — a timeout, a dropped connection, a provider rejection, or an error we do not recognise — pins the claim: every retry returns 409 IDEMPOTENT_REQUEST_IN_PROGRESS, and on that path it is NOT transient. This code is also returned while a first attempt is still running and the two are identical on the wire, so retry with backoff past the 30-second server timeout, then treat the key as pinned; it persists until the movement is reconciled or the key expires (best-effort, at least 48h). Never rotate to a fresh key; that bypasses the protection and loads the card twice.

Path Parameters

customerId
string<uuid>
required

The customer's ID.

accountId
string<uuid>
required

The account's ID.

Query Parameters

programId
string
required

The program the customer/account belongs to. Required on every request.

Body

application/json
amount
string
required

The amount to move, as a decimal string.

Example:

"50.00"

action
enum<string>
required

Whether to add funds to (LOAD) or remove funds from (UNLOAD) the card balance.

Available options:
LOAD,
UNLOAD

Response

The card balance was adjusted with the provider.

success
boolean
availableBalance
number

The card balance after the operation.

transactionId
string
message
string