Skip to main content
An offramp converts crypto into fiat in the customer’s virtual account. Add an autoPayout block, and Conduit then pays a bank recipient from that virtual account. You create both with one POST /v2/orders call, but they are two resources: the order (the conversion) and a chained withdrawal (the payout). Each has its own status and its own webhooks.
Test this flow in sandbox. See OFFRAMP orders (sandbox) for the simulated path, the document-review step and failure controls.

Prerequisites

  • An active customer with a USD virtual account (Add virtual accounts).
  • The crypto to convert: in a wallet of the customer, or sent to a funding address that the order gives you. For the funding address, register the sending address first (Deposit-funded orders).
  • A supporting document for the payout’s purpose, uploaded with POST /v2/documents (purpose transaction_support). intercompany and personal_transfer_of_funds take a whitelisted recipient instead (Payout requirements).
  • Your API key.

Step 1 — Create the order with a SWIFT autoPayout

This order is funded by a deposit: it names sourceAsset and no source. To convert from a wallet the customer already holds, send source instead (Convert).
  • autoPayout takes the same purpose, documents and recipient fields as a fiat POST /v2/payouts. On swift, send iban or accountNumber. bankAddress is optional: Conduit derives it from bic.
  • Conduit checks the payout’s requirements when it creates the order. A payout that would be refused is refused here, before any money moves.
  • The response carries depositInstructions. Send the order’s totalDebit to that address before lockExpiresAt. On a source-locked order, totalDebit equals amount (How much an order debits).

Step 2 — The order succeeds

When the funds clear, the order executes on its own. It converts the crypto and credits the customer’s virtual account. Then order.succeeded fires. order.succeeded means the virtual account is credited. It does not mean the recipient is paid. An account whose bank pays only on the order’s instruction, such as a naira account, is the exception: there the order succeeds only when the bank has paid the recipient.

Step 3 — Follow the chained withdrawal

After the credit, Conduit starts the payout as its own transaction, type: "withdrawal", with linkedOrderId set to the order. Find it in either of these ways: GET /v2/orders/{id} also lists the ids of every transaction of the order in linkedTransactionIds, but not their types. Conduit’s payout fee comes out of the converted amount, so the recipient receives destinationAsset.amount less that fee, and less any margin you declared on the payout with autoPayout.markupBps or autoPayout.markupAmount. The withdrawal then moves like any payout (Send a payout): A failure of the withdrawal does not change the order: it stays succeeded, and order.failed does not fire.

Recover from a failed payout

The withdrawal’s status tells you where the money is and whether you may pay again: To pay again, send a standalone POST /v2/payouts from the customer’s virtual account, with a new idempotency-key. A new order is not needed: the converted money is already in the virtual account.
  • Held for review. The withdrawal reads stage: "under_review" or, when Conduit asks you for a document, stage: "awaiting_customer_action" with hasRfi: true. Answer the request (A payout that needs a document). Do not pay again while it is held.
  • Document declined. transaction.rejected names the acceptedDocumentTypes. Pay again with one of them.
  • No withdrawal after order.succeeded. The payout did not start, and the converted amount stays in the virtual account. Contact support before you pay it out yourself.

See also