Prerequisites
- A Borderless account with completed KYB verification
- Borderless API key configured in your org settings (see dashboard setup)
- A wallet holding a supported stablecoin
Payouts:Create,Payouts:Read, andPayouts:Writepermissions
Payout lifecycle
Get a quote
POST/payouts/quote : Request payout quoteRequest a quote to see the estimated fiat amount and fees before creating a payout.Request
Response
amount field in the quote response is the net fiat the recipient receives after fees.Create a payout
POST/payouts : Create payoutCreate a payout to start the off-ramp process. This requires Borderless-specific fields: your account ID, payment instructions ID (the destination bank account), and a payment purpose.Request
Response
externalId for idempotency — if you retry with the same externalId, the existing payout is returned instead of creating a duplicate.Payment purposesThe paymentPurpose field must be one of: salary payment, personal remittance, rent payment, property purchase, owned account abroad, advertising expenses, advisory fees, business insurance, construction, delivery fees, education, exports, donation, hotel, loan payment, maintenance expenses, medical expense, office expenses, royalty fees, service charge, shares investment, tax payment, transportation fees, travel, utility bills, other.Wait for action required
After creation, Dfns coordinates with Borderless to obtain a deposit address. When ready, the payout advances to
AwaitingPayoutConfirmation and Dfns fires a payout.action.required webhook. Subscribe to the webhook for real-time notification (recommended for automation)You can also poll GET/payouts/{payoutId} (Get payout status) and check for data.executionStatus === "AwaitingPayoutConfirmation".The webhook payload includes the full payout object with the depositAddress in data:Webhook payload
Confirm the payout
POST/payouts/{payoutId}/action : Create payout actionConfirm the payout by echoing back the transfer details. Dfns validates these match the payout data, then submits the on-chain transfer from your wallet.Request
transfer.to address must match the depositAddress from the payout data, and the amount must match the payout’s asset amount. This is a deliberate confirmation step — you’re approving that the correct amount goes to the correct address.After confirmation, Dfns handles the rest: submitting the transfer, waiting for on-chain confirmation, and monitoring until Borderless confirms fiat disbursement.Only the user who created the payout can confirm or cancel it.
Cancel a payout
POST/payouts/{payoutId}/action : Create payout action
To cancel a payout that hasn’t been confirmed yet:
Request
Check payout status
GET/payouts/{payoutId} : Get payout status
Poll a payout to track its progress:
Request
status and the granular data.executionStatus. The top-level status values are:
| Status | Meaning |
|---|---|
Processing | Payout is active — waiting for provider instructions, user confirmation, or settlement |
Completed | Fiat has been disbursed to the bank account |
Failed | Non-recoverable error |
Rejected | Transfer was rejected by a Dfns policy |
Expired | Timed out waiting for confirmation (24h) or transfer submission (4h) |
Canceled | Canceled by the user |
Policies
Payouts create a transfer from your wallet to the provider’s deposit address. If you have policies configured on wallet transfers, the transfer may require approval. The top-levelstatus stays Processing, but data.executionStatus changes to PendingPolicyApproval until the policy is resolved.