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.

A man in glasses grinning at his laptop.

Sandbox to first payment in an afternoon.

  1. 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. 2

    Take your first payment

    One POST /api/v1/charges with an Idempotency-Key. Retry with the same key and you get the first answer back, never a second charge.

  3. 3

    Listen for the webhook

    We send charge.success to your endpoint, signed with its secret. Check the signature, then update your order.

Take a MoMo payment
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"
Amounts are in pesewas: 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-Key twice 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.

A man smiling and pointing up with both hands.