Skip to main content
This guide sends 10 USDC to a Kenyan M-Pesa number, then shows what’s different for Nigerian bank accounts. Before you start, you need:
  • An API key with off-ramp switched on. See getting access.
  • A wallet you control with some USDC on Base.
1

Quote the payout

Add the recipient, and we’ll check their account and give you the name it’s registered to, all in the same call.
recipient_amount is what lands in the recipient’s account. deposit_submission_required tells you which way the order will go. This one is automatic, so nothing comes off the payout and a small sender fee is added to what you send instead. When an order asks you to send and confirm, the quote is a close estimate, fee comes off the payout, and there’s no estimated_total_deposit_usdc.
2

Create the order

Add an Idempotency-Key header with a value that’s unique to this payout. If your request times out and you send it again, we’ll recognise it and won’t create a second order.
We check the recipient’s account before creating anything. If the account isn’t valid, you get a 422 and no order is created.
3

Send USDC on Base

From your own wallet, transfer exactly total_deposit_usdc USDC on Base to deposit_address before expires_at.
Send exactly total_deposit_usdc, in USDC, on Base. On automatic orders, a smaller amount isn’t accepted and goes back to your refund_address. You also only have a few minutes, so create the order when you’re ready to send. When an order asks you to send and confirm, you have 30 minutes.
4

Confirm your transfer (only if asked)

Skip this step when deposit_submission_required is false, as it is for the order above. We spot the transfer ourselves, and calling this endpoint returns 409.When it’s true, send us the transaction hash (the ID of your transfer, starting with 0x):
A 200 with "status": "settling" means the payout is on its way. A 422 means we couldn’t find a matching transfer. Check the amount, the network, and the hash, then try the same call again.
5

Check it's done

Check the order’s status, or wait for the webhook:
When the payout lands, status becomes completed, settlement_receipt holds the payout receipt, and an offramp.completed webhook fires. See off-ramp webhooks.

NGN payouts

NGN orders pay out to bank accounts and are always automatic, like the one above. The only difference is how you describe the recipient: a bank institution code and an account_number. See recipients. Get the bank codes from GET /api/offramp/institutions instead of typing them into your code.
Automatic orders only stay open for a few minutes, because the rate is fixed when you create them. Create the order when you’re ready to send, ideally with the transfer automated. If time runs out, the order expires and you can simply create a new one. If a payout fails after you’ve sent your USDC, it goes back to your refund_address by itself.