Amounts
Always decimal strings, never numbers. USDT has 6 decimals ("101.500000"); BOB has 2 ("1000.00"). Parse them with a decimal type, never a float.
Rates
rate is bolivianos per USDT, 4 decimals ("9.9500"), net of our markup; the fee is itemised beside it. It is informative — the end user accepts source.amount, and exactly that is debited. In a quote, source is what you pay and target what the destination receives, each with its currency.
Idempotency
ForPOST /payouts your transaction_id is the idempotency key — no header. The same transaction_id with the same body returns the same payment; with a different body it is 409 TRANSACTION_ID_REUSED. On a timeout or a 503, resend the same request: it is paid once.
POST /fx/quotes is not idempotent — a retry is just another quote; show the end user the one you got. A top-up is credited once per transfer. Only the sandbox faucet takes an Idempotency-Key header.
Ids
A payment’s id is itspo_ id, returned when you create it: use it in /payouts/{id} paths. Your transaction_id stays on the payment as your reference; find a payment by it with GET /payouts?transaction_id=….
A top-up is a deposit with a dep_ id, named in its deposit.* webhooks and in the reference of its row in GET /wallets/transactions; its chain and tx_hash identify the transfer.
Request ids
Every response carries anX-Request-Id header. Send your own (letters, digits and . _ : -, up to 128) and we echo it; otherwise we make one (req_…). Quote it when you ask us about a call.
Times
ISO 8601, UTC.Errors
JSON. Branch on the code — inmessage for most errors, in code when the body has one. Never branch on the human text. Every code is listed in Errors.