v1 · updated 12 Sep 2026

API reference

Base URL https://api.saopayglobal.com/v1 · sandbox https://sandbox.api.saopayglobal.com/v1

Initiate a mobile money payment

POST/payments/momo

Sends an approval prompt to the customer's phone. Returns a payment in pending.

FieldTypeNotes
amountintegerPesewas, min 100, max 5,000,000
currencystringGHS
phonestring233XXXXXXXXX
networkstringmtn · telecel · airteltigo · optional
referencestringUnique, ≤ 64 chars, idempotent
descriptionstringShown on the prompt, ≤ 60 chars
callback_urlstringHTTPS
metadataobject≤ 20 keys

Initiate a card payment

POST/payments/card

Returns authorization_url. Redirect the customer; Sao redirects back to return_url and sends a webhook.

Retrieve a payment

GET/payments/{id}

Also accepts your reference: GET /payments/ref/{reference}.

List payments

GET/payments?status=success&from=2026-09-01&limit=50

Cursor paginated with next_cursor. Max 100 per page.

POST/links
FieldTypeNotes
amountintegerOmit for open amount
titlestringShown on the page
reusablebooleanDefault false
collectarrayname · email · note
expires_atdatetimeOptional

Create a refund

POST/refunds

Fields: payment_id, optional amount for partial, reason. Returns a refund with status pending then completed.

Create a payout

POST/payouts
FieldTypeNotes
amountintegerPesewas
destination.typestringmomo · bank
destination.phonestringFor momo
destination.bank_code, accountstringFor bank
referencestringIdempotent
narrationstringAppears on the recipient's statement
POST/payouts/batch

Up to 1,000 payouts in one call. Each item succeeds or fails independently; the batch reports per-item status.

Name lookup

GET/lookup/momo?phone=233244123456

Returns the registered name for a MoMo number. Free, rate limited to 10 per second.

Webhooks

POST/webhooks
GET/webhooks
DELETE/webhooks/{id}

Events: payment.success, payment.failed, payment.expired, refund.completed, payout.completed, payout.failed. Signature header X-Sao-Signature.

Balance

GET/balance

Available and pending balances per currency.

Objects

Payment { id, status, amount, currency, network, phone, reference, description, fee, net, metadata, failure_reason?, created_at, completed_at? } Refund { id, payment_id, amount, status, reason, created_at } Payout { id, amount, destination, status, reference, narration, created_at } Link { id, url, amount?, title, reusable, collect, expires_at?, paid_count } Webhook { id, url, events[], secret, created_at }
Try it · sandboxPOST /payments/momo
// response appears here