Skip to main content
Zuba is Privy’s preferred partner for African-corridor payouts. With Privy powering your wallets and Zuba handling the last mile, you can move stablecoins into local currency across Africa. This recipe walks through the full flow:
  1. Create a wallet with Privy
  2. Fund your Zuba account with USDC/USDT from that wallet
  3. Call the Zuba Payout API to pay out across Africa
  4. Track the payout to completion

Prerequisites

Zuba uses OAuth 2.0 client credentials. Exchange your Client ID and Secret for a bearer token (valid 24 hours):
cURL
Use the returned access_token as Authorization: Bearer <token> on every Zuba request below.

1. Create a wallet with Privy

If your users already have Privy embedded wallets, skip ahead. Any Privy wallet holding USDC or USDT works. To create a server wallet:
cURL
See Privy wallet docs for embedded and user-owned wallet setups.

2. Fund your Zuba account

Provision a deposit address on the network you want to fund from:
cURL
Response
The address is reusable, so you can send to it as many times as you like. For EVM networks, the same address is valid on all supported EVM chains. Supported networks and tokens: Now send USDC/USDT from your Privy wallet to that address using Privy’s transaction APIs. See sending transactions on Ethereum or Solana. Once the transfer confirms on-chain, the funds appear on your Zuba balance:
cURL

3. Pay out across Africa

One request does it all: pass the beneficiary’s local payment details inline. inputCurrency is the balance you’re paying from (your USDC/USDT), while currency and amount are what the beneficiary receives. Zuba handles the conversion:
cURL
For repeat payouts, create the beneficiary once via POST /v1/beneficiaries and reference it with "beneficiary": { "id": "..." }. Use route: "mobile_money" for mobile money corridors (GHS, XOF, XAF). Field requirements per corridor are available at GET /v1/payouts/requirements and in the Zuba payout docs.

4. Track the payout

Register a webhook endpoint and listen for payout lifecycle events:
cURL
Event payload
Verify deliveries with the X-Zuba-Signature header (see Zuba webhook docs). You can also poll GET /v1/payouts/{id}.

Test it in sandbox

Everything above works against https://api.sandbox.zuba.com with sandbox credentials. Magic beneficiary account numbers give deterministic outcomes (0000000000paid, 0000000001failed). See the sandbox testing guide. That’s it: a Privy wallet, one deposit address, and one API call to reach bank accounts and mobile money wallets across Africa.