Before you start
You need a ready pay-in capability and ready issued destination wallet for the same customer. Complete any open work through Capabilities and tasks, then refetch both resources.1. Create a quote
Create the price withPOST /v3/quotes. Send these headers:
data.id as QUOTE_ID. Present the returned amounts and fees rather than rebuilding them from the rate.
2. Execute the quote
Execute the current quote before expiry withPOST /v3/transfers. Use a new key for this intended transfer:
data.id as TRANSFER_ID and retain its current state.
3. Retrieve funding instructions
ReadGET /v3/transfers/{transferId}/instructions. Render the returned data.instructions variant without assuming its type.
These details are transfer-specific. Never reuse one transfer’s bank coordinates, code, hosted URL, amount, reference, or expiry for another pay-in.
For bank instructions, when reference.required is true, display the exact reference.value next to the bank coordinates and make it copyable. Show the returned amount and currency from the same instruction set.
An issued bank account is different: it provides reusable details for later deposits. See Issue a bank account when that is the intended experience.
4. Track settlement
ReadGET /v3/transfers/{transferId} after execution and after each event. Drive the customer-facing status from the latest data.state.
Use data.stateDetail and data.openTaskIds when the transfer needs another action. Do not mark it complete from an expected schedule.
Next, add Webhooks and keep the transfer status synchronized until it reaches an outcome your product handles.