Before you start: the OMS API is in early access. Every endpoint, including the ones in this guide, requires an early-access API key. Request access before you begin. The corridors and rails available to you depend on how your project is configured; contact us before you build against them.
Step 1: Fund the sender’s wallet
The sender is your customer. Pick the funding route that fits them:- Bank transfer: give the sender a virtual account whose destination is their OMS wallet. Each ACH or wire deposit is converted to USDC automatically.
- Cash: issue a cash-in code the sender takes to a retail location.
completed (transaction.statusChanged) before you pay out.
Step 2: Register the recipient
The recipient is a counterparty of the sender. Create it withPOST /counterparties, then register the recipient’s bank account with POST /external-accounts and owner: { "kind": "counterparty", "counterpartyId": "ctp_..." }:
bankUsfor a US account, paid in USD.bankIbanfor an IBAN account, paid in USD over SWIFT.bankCanadafor a Canadian account, paid in USD over SWIFT or CAD over the local rail.
GET /reference/account-type-requirements?customerId=cst_... to see which account types your project can create and the fields each needs. Pay a third party has the full request and response bodies.
Step 3: Pay out
Create a quote from the sender’s OMS wallet to the recipient’s account and accept it withPOST /transactions, as in Bank transfers. The quote locks the rate and fees in pricing (exchangeRate and fees) until expiresAt, so show the recipient amount to the sender before they confirm.
For a recipient who wants cash in the US, use a cash destination instead; see Cash pickup.
Track the remittance
Each leg is its own transaction. Put a sharedmetadata key (for example remittanceId) on the payout quote, which copies it to the payout transaction, and record the funding transaction’s ID alongside it. Follow both with transaction.statusChanged. The payout transaction’s destination.owner names the recipient counterparty, and its payout transfer (GET /transfers/{transferId}) carries the bank references for tracing.
Verification of the sender is set per project. Depending on your configuration, OMS verifies customers or relies on your own verification.