Minisend
What Minisend does
Minisend moves money between stablecoins and local currency across Kenya, Nigeria, Ghana, and Uganda. A business holding USDC or USDT can pay it out as KES, NGN, GHS, or UGX to a bank account, mobile money account, paybill, or till (off-ramp), or accept a customer's stablecoin payment through a hosted checkout page that settles to the business's own bank or mobile money account (checkout). A business can also collect KES only from a customer's phone, via an M-Pesa or Airtel Money payment prompt, and receive stablecoins in exchange (on-ramp) — or provision stablecoin wallets programmatically for its own users (wallets).
The two directions do not share a method list. Paybill, till, and bank transfer are off-ramp payout destinations; on-ramp collects through the phone prompt and nothing else.
Pick your product
| You want to |
Product |
Read |
| Pay someone in KES, NGN, GHS, or UGX from a USDC balance |
Off-ramp |
references/offramp.md |
| Collect KES via an M-Pesa or Airtel Money prompt and receive USDC |
On-ramp |
references/onramp.md |
| Create wallets for your own users, and see what they receive |
Wallets |
references/wallets.md |
| Accept a payment and settle to a bank or mobile money account, or keep it in USDC |
Checkout |
references/checkout.md |
Authenticate
Every request carries an API key as a bearer token:
Authorization: Bearer <key>
Minisend issues two key namespaces, and they are not interchangeable:
ms_live_... — off-ramp, on-ramp, and checkout
wsk_live_... — the wallet API only
curl https://merchant.minisend.xyz/api/merchant/checkout \
-H "Authorization: Bearer ms_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ ... }'
Full detail — scopes, the access-gate 403 model, rate limits, error bodies, and how to get access — is in references/authentication.md. Read it before writing any request code.
Rules that prevent most integration bugs
- A key's scope and the account's capability are two independent gates, but both return the identical 403 message — you cannot tell which one failed from the response. Either way, the fix is the same: contact
info@minisend.xyz.
- Phone numbers are normalised to the local
0XXXXXXXXX format for you — several input shapes are accepted, so read the normalised value back rather than assuming yours survived.
refund_address is mandatory on every off-ramp order.
- No quote is a lock. The quote endpoints reserve nothing and the order is priced fresh at creation, so read the priced fields back from the response you actually act on — never compute or hardcode them.
- Webhook signatures verify over the raw request body, not a re-serialized copy of the parsed JSON.
- A customer returning to your site from checkout arrives with
status=completed in the URL. That is a query parameter, not evidence — confirm with the webhook or a server-side status read before releasing anything.
Reference map
references/authentication.md — API keys, scopes, the access-gate 403 model, rate limits, error bodies
references/offramp.md — pay out KES, NGN, GHS, or UGX from a stablecoin balance
references/recipients.md — recipient formats and validation per currency and method
references/onramp.md — collect KES via an M-Pesa or Airtel Money prompt and receive stablecoins
references/wallets.md — programmatic wallet creation for your own users
references/checkout.md — hosted checkout and payment links
references/webhooks.md — event types, signature verification, delivery/retry behavior
references/errors.md — every error code and body the API returns
references/faq.md — common integration questions
1---2name: minisend3description: Integrate Minisend payment APIs — accept USDC/USDT and pay out local currency across Africa. Use when working with Minisend, or when building stablecoin payouts or collections in Kenya, Nigeria, Ghana, or Uganda — M-Pesa, mobile money, paybill, till, or bank transfer; KES, NGN, GHS, UGX; off-ramp, on-ramp, checkout, payment links, or programmatic wallet creation.4---56# Minisend78## What Minisend does910Minisend moves money between stablecoins and local currency across Kenya, Nigeria, Ghana, and Uganda. A business holding USDC or USDT can pay it out as KES, NGN, GHS, or UGX to a bank account, mobile money account, paybill, or till (off-ramp), or accept a customer's stablecoin payment through a hosted checkout page that settles to the business's own bank or mobile money account (checkout). A business can also collect **KES only** from a customer's phone, via an M-Pesa or Airtel Money payment prompt, and receive stablecoins in exchange (on-ramp) — or provision stablecoin wallets programmatically for its own users (wallets).1112The two directions do not share a method list. Paybill, till, and bank transfer are off-ramp *payout* destinations; on-ramp collects through the phone prompt and nothing else.1314## Pick your product1516| You want to | Product | Read |17| --- | --- | --- |18| Pay someone in KES, NGN, GHS, or UGX from a USDC balance | Off-ramp | `references/offramp.md` |19| Collect KES via an M-Pesa or Airtel Money prompt and receive USDC | On-ramp | `references/onramp.md` |20| Create wallets for your own users, and see what they receive | Wallets | `references/wallets.md` |21| Accept a payment and settle to a bank or mobile money account, or keep it in USDC | Checkout | `references/checkout.md` |2223## Authenticate2425Every request carries an API key as a bearer token:2627```28Authorization: Bearer <key>29```3031Minisend issues two key namespaces, and they are not interchangeable:3233- `ms_live_...` — off-ramp, on-ramp, and checkout34- `wsk_live_...` — the wallet API only3536```bash37curl https://merchant.minisend.xyz/api/merchant/checkout \38 -H "Authorization: Bearer ms_live_xxxxxxxx" \39 -H "Content-Type: application/json" \40 -d '{ ... }'41```4243Full detail — scopes, the access-gate 403 model, rate limits, error bodies, and how to get access — is in `references/authentication.md`. Read it before writing any request code.4445## Rules that prevent most integration bugs4647- A key's scope and the account's capability are two independent gates, but both return the identical 403 message — you cannot tell which one failed from the response. Either way, the fix is the same: contact `info@minisend.xyz`.48- Phone numbers are normalised to the local `0XXXXXXXXX` format *for* you — several input shapes are accepted, so read the normalised value back rather than assuming yours survived.49- `refund_address` is mandatory on every off-ramp order.50- **No quote is a lock.** The quote endpoints reserve nothing and the order is priced fresh at creation, so read the priced fields back from the response you actually act on — never compute or hardcode them.51- Webhook signatures verify over the raw request body, not a re-serialized copy of the parsed JSON.52- A customer returning to your site from checkout arrives with `status=completed` in the URL. That is a query parameter, not evidence — confirm with the webhook or a server-side status read before releasing anything.5354## Reference map5556- `references/authentication.md` — API keys, scopes, the access-gate 403 model, rate limits, error bodies57- `references/offramp.md` — pay out KES, NGN, GHS, or UGX from a stablecoin balance58- `references/recipients.md` — recipient formats and validation per currency and method59- `references/onramp.md` — collect KES via an M-Pesa or Airtel Money prompt and receive stablecoins60- `references/wallets.md` — programmatic wallet creation for your own users61- `references/checkout.md` — hosted checkout and payment links62- `references/webhooks.md` — event types, signature verification, delivery/retry behavior63- `references/errors.md` — every error code and body the API returns64- `references/faq.md` — common integration questions