Build money movement into anything.
One REST API for MoMo, cards, bank payouts, airtime and bills in Ghana. Test keys work against a full sandbox from the day you sign up.
No SDK to install. Plain HTTPS and JSON.
Sandbox to first payment in an afternoon.
- 1
Get your test keys
Sign up and create an
sk_test_key in your dashboard. Every call it makes goes to our simulator, so no real money moves. - 2
Take your first payment
One
POST /api/v1/chargeswith anIdempotency-Key. Retry with the same key and you get the first answer back, never a second charge. - 3
Listen for the webhook
We send
charge.successto your endpoint, signed with its secret. Check the signature, then update your order.
curl https://starpaygh.com/api/v1/charges \
-H "Authorization: Bearer sk_test_…" \
-H "Idempotency-Key: 3f2b8c1e-…" \
-H "Content-Type: application/json" \
-d '{"amount": 25000, "currency": "GHS",
"channel": "momo", "msisdn": "0240000000"}'
# The sandbox approves 0240000000 at once
{ "status": true, "message": "Charge successful",
"data": { "id": "ch_…", "status": "success", "amount": 25000 } }
const res = await fetch("https://starpaygh.com/api/v1/charges", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.STARPAY_KEY}`,
"Idempotency-Key": crypto.randomUUID(),
"Content-Type": "application/json",
},
body: JSON.stringify({
amount: 25000, currency: "GHS",
channel: "momo", msisdn: "0240000000",
}),
});
const { data } = await res.json(); // data.status: "success"
import os, uuid, requests
res = requests.post(
"https://starpaygh.com/api/v1/charges",
headers={
"Authorization": f"Bearer {os.environ['STARPAY_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={"amount": 25000, "currency": "GHS",
"channel": "momo", "msisdn": "0240000000"},
)
data = res.json()["data"] # data["status"] == "success"
25000 is GHS 250.00.Small API. Every way Ghana pays.
Plain REST over HTTPS, JSON in and out, the same envelope on every response, and cursor paging on lists.
- POST
/api/v1/chargesTake a payment by MoMo, card or stablecoin - POST
/api/v1/transfersPay a MoMo wallet or bank account - POST
/api/v1/resolve/momo-nameSee whose name a MoMo number is in - POST
/api/v1/vas/airtimeAirtime, and data and utility bills beside it - GET
/api/v1/balancesWhat's in your StarPay balance - GET
/api/v1/transactionsEvery payment in and out, a page at a time
Built for production.
The parts you would otherwise build yourself.
A webhook for every event
Signed with your endpoint's secret and retried for about 15 hours if your server is down. Resend any delivery from your dashboard.
Charged once
Send the same
Idempotency-Keytwice and you get the first answer back, never a second charge.One provider per payment
A payment is never handed to a second provider, so a lost reply can't become a double charge. When we change provider, your code doesn't.
Test and live keys
sk_test_keys run on the simulator, with numbers that approve, decline or time out.sk_live_keys work once your business is approved.Signed payouts
Sending money and buying airtime or bills needs a signed request as well as your key, so a leaked key alone can't send money.
Keys that do one job
Give each key only what it needs: take payments, send money, or read.
Ship your integration this week.
Test keys in minutes, and a sandbox that behaves like the real thing.
