The sequence
Only the transfer is required. Preview is optional but cheap, and a quote is mandatory whenever the source and destination currencies differ.Statuses
Seven, and only some of them are ones you will see in a response.Amounts change form
This catches nearly everyone. The request and the response are not in the same units.
Never feed a response amount back into a request.
totalDebit — sourceAmount plus fee — is what actually leaves the account, and is the figure to put in front of whoever approves the payment.
externalReference is the idempotency key
You choose it, it is unique within your business, and reusing it returns the existing transfer without looking at the rest of your payload.
Two consequences worth internalising now:
- A different payment under a used reference returns the old transfer and moves nothing.
- A failed transfer keeps its reference. Retrying with it returns the failure, not a new attempt.
FX quotes
A quote locks a rate for exactly one transfer. It is bound to five things — source account, destination, both currencies, and the side with its amount — and spending it on anything that differs is refused. Its expiry comes from the FX provider rather than a fixed Sakawave window, so readexpiresAt instead of assuming a duration. Like a destination, it is single use.
Events
Transfers reach your endpoint asfiat.withdrawal.* events. There are no transfer.* events.
The payload is the posted ledger transaction, with the transfer described inside
relatedOperation. See webhook events.
Next
Introduction
Why a transfer needs four prior calls.
Get started
A same-currency transfer end to end.
Setup and configuration
Limits, approval policy, and pacing a batch.
Cross-currency transfers
Quotes, corridors, and what binds to what.