Skip to main content
Checks the recipient’s account, fixes the price, and tells you where to send your USDC. No money moves until you send it.
Call this from your server only, never from a browser or app, so your API key stays secret.

Endpoint

Requires the offramp scope.
Always send an Idempotency-Key: any text that’s unique to this payout, such as your own payout ID. If you send the same key again, you get the original order back with a 200 instead of a second order. That makes it safe to retry when a request times out.

Body

number
required
USDC amount, 0.5 – 50,000. The local equivalent must fall inside the per-transaction range.
string
required
Payout currency: KES, NGN, GHS, or UGX.
string
A wallet address you control, starting with 0x. Required, unless you set funding_wallet_ref. On automatic orders, if the payout fails or you send too little, we return your USDC here by itself. It’s also where support sends money back if anything needs sorting out.
string
The reference of one of your Wallet API addresses. When you set it, we pay the order from that address’s USDC on Base, so you don’t send anything yourself. Refunds go back to that same address, and any refund_address you send is ignored. Needs an Idempotency-Key. See paying from a Wallet API address.
object
required
Who gets paid. See recipients for the fields each payout method needs. We check it before creating the order.For NGN, recipient.institution is an institution code such as OPAYNGPC. Get the valid codes from GET /api/offramp/institutions.
string
Your own reference, such as your payout ID. We send it back as external_reference in responses and webhooks. It stays between you and us: on M-Pesa and bank payouts, the recipient sees “Payment from Minisend to” followed by your business name.

Example

Response (201)

This order is automatic. A send-and-confirm order looks the same, except:
  • deposit_submission_required is true
  • total_deposit_usdc equals amount_usdc
  • fee comes off the payout
  • there’s no sender_fee_usdc or transaction_fee_usdc
  • expires_at is 30 minutes away
string
required
Unique order identifier.
number
required
The exact amount of USDC to send. On send-and-confirm orders it equals amount_usdc. On automatic orders it’s the order amount plus sender_fee_usdc and transaction_fee_usdc. Send exactly this: a smaller amount isn’t accepted and goes back to refund_address.
boolean
required
true: send to deposit_address, then send us the transaction hash. false: we spot your transfer ourselves, so there’s nothing more to do. This can change from order to order, so check it every time instead of going by currency.
number
Automatic orders only. A fee that’s already included in total_deposit_usdc.
number
Automatic orders only. A network fee that’s already included in total_deposit_usdc.
string
required
Where to send your USDC on Base. On send-and-confirm orders, it’s a shared address. On automatic orders, it’s a one-time address just for this order, which we watch for you.
string
required
Always base. We can’t see USDC sent on any other network.
number
required
The quoted rate. On send-and-confirm orders, we pay out at the live rate when your USDC arrives, and the order’s rate, amount_local, and fee update to match. On automatic orders, the rate is fixed.
string
required
The deadline for sending your USDC, ISO 8601. 30 minutes on send-and-confirm orders, about an hour on automatic ones. After that, the order becomes expired.
string
Only on orders paid from a Wallet API address. The reference you sent in the request.
string
required
What to do next for this order, in plain words. Handy to show your user.

Paying from a Wallet API address

If the USDC for this payout is already in one of your Wallet API addresses on Base, add funding_wallet_ref and we pay the order from there. You don’t send anything and there’s no hash to submit.
cURL
The response looks like any automatic order, with funding_wallet_ref added and deposit_submission_required set to false. The USDC for total_deposit_usdc leaves your address straight away, and the recipient is usually paid within a few minutes. Wait for offramp.completed or offramp.failed. What to know before you use it:
  • It works for Kenya M-Pesa phone and till payouts and Nigeria bank payouts. For other recipients, leave out funding_wallet_ref and pay the order yourself.
  • The address needs at least total_deposit_usdc in USDC on Base, counting payouts and withdrawals from it that are still in progress. If you’re moving money in from another network, wait for wallet.deposit.settled first.
  • refund_address isn’t needed. Refunds go back to the paying address.
  • Keep auto-sweep off for that address, so the balance is still there when you pay out.
  • An Idempotency-Key is required.

Errors