Skip to main content

Payment platform · West Africa

The payment API
of Guinea.

Orange Money, MTN Money, Visa and Mastercard cards — behind a single API. For merchants who want to collect without integrating ten operators.

Open sandbox

No commitment,
no hidden fees.

Immediate signup, ready-to-use sandbox keys, merchant contract activated within days after KYC.

p99 latency

< 300ms

average response time

Wallet · GNF

12,4M

available today

Live activity

Live
  • OM

    INV-0142

    Conakry

    +500k
  • MT

    INV-0141

    Kindia

    +250k
  • INV-0140

    Visa

    +1,5M

4

countries · 3 currencies

payments-initiate.sh
# HMAC-SHA256 authentication, idempotent, sandbox
curl -X POST https://sandbox-api.saalapay.com/api/v1/payments/initiate \
  -H "X-SP-CLIENT-ID: pk_sandbox_..." \
  -H "X-SP-SIGNATURE: $SIGNATURE" \
  -H "Idempotency-Key: $UUID" \
  -d '{ "amount": 500000, "currency": "GNF", "method": "MOBILE_MONEY", "provider": "orange_money" }'
Orange Money MTN Mobile Money Visa Mastercard Bank transfer HMAC-signed webhooks Orange Money MTN Mobile Money Visa Mastercard Bank transfer HMAC-signed webhooks

For whom?

One API,
three very concrete use cases.

School

T2 2026 fees

847 / 1,200 parents

Collected

211,7M GNF

Remaining

88,3M GNF

Recent payments

  • Diallo Aïssata · Orange +250k
  • Camara Mohamed · MTN +250k
  • Barry Mariama · Visa +250k

École Lumière — Conakry

Collect tuition fees
without chasing parents.

Each term, École Lumière bills 1,200 families. Before SaalaPay, the office collected cash, lost receipts, spent two weeks tracking late payments. Today, every parent pays from their phone, the school wallet credits automatically.

  • Per-parent payment linkSent by SMS or WhatsApp with amount and due date pre-filled.
  • Automatic reconciliationEach payment received matched to its invoice, zero manual entry.
  • Sub-wallets per classroomCafeteria, transport, supplies — native splits, no external table.
E-commerce

Indigo blue wax fabric

2 yards · 100% cotton

185 000 GNF

Payment method

Webhook received payment.succeeded

POST /shop/orders/482/confirm · 142ms · 200 OK

Niani Boutique — Madina Market

Sell online without giving up
Mobile Money.

Niani sells wax fabric on her WooCommerce site. Her customers are in Conakry, Dakar, Paris — each with their preferred method. One SaalaPay integration: Orange Money for locals, Visa for the diaspora, MTN for neighbors.

  • WooCommerce plugin or REST50-line integration, or official plugin maintained by the team.
  • Idempotent webhooksNo double-confirmation, even if the webhook arrives twice.
  • GNF · XOF · EUR convertibleAt today's rate, traced on each transaction.
NGO · Charity

Ramadan 2026 campaign

School cafeteria for 380 children

Goal

50M

Collected

38,4M

Donors

412

Immutable audit log

  • 14:32 · don.received · 50 000 GNF · Diaspora-FR
  • 14:31 · don.received · 25 000 GNF · Conakry
  • 14:28 · don.received · 100 000 GNF · Anonymous
  • 14:24 · don.received · 10 000 GNF · Conakry

Action Santé Guinée — Conakry

Collect donations,
trace every cent.

An NGO can't afford to lose a donor for lack of a payment method. Action Santé Guinée collects via Mobile Money for the local base, by card for the diaspora. Each transaction writes a line in an immutable journal — auditable to the cent.

  • Hosted donation pagesOne-shot or recurring campaign, shareable by link.
  • Immutable audit logBefore/after snapshots per movement, one-click CSV export.
  • Charity preferential rateReduced commission on eligible donations.

Production-grade

Built to handle load
and survive operator outages.

HMAC-SHA256 auth

Signature on every request, 60s anti-replay window, hot key rotation.

Native idempotency

Idempotency-Key header honored, same call = same response, always.

Signed webhooks

HMAC + dedup by event-id on SaalaPay side, replay button available.

Immutable ledger

Before/after snapshots per movement, integrity verified on every write.

Native rate limiting

Limits per key, per IP, per endpoint. Atomic Lua on Redis.

Encrypted secrets

libsodium XSalsa20-Poly1305 on keys and secrets in DB.

For developers

A REST API
with no surprises.

No SDK required. You call an endpoint, you get a deterministic JSON response, you listen to a signed webhook. That's it.

  • HMAC-SHA256 authentication

    Signature on every request, 60-second anti-replay window, hot key rotation.

  • Native idempotency

    Idempotency-Key header supported — the same call returns the same response.

  • Signed and replayable webhooks

    HMAC signature, server-side dedup, "replay" button in the dashboard.

  • Unlimited sandbox

    Isolated subdomain (sandbox-api.saalapay.com), keys distinct from live.

payments-initiate.sh
# HMAC-SHA256 authentication, idempotent, sandbox
curl -X POST https://sandbox-api.saalapay.com/api/v1/payments/initiate \
  -H "X-SP-CLIENT-ID: pk_sandbox_..." \
  -H "X-SP-SIGNATURE: $SIGNATURE" \
  -H "X-SP-TIMESTAMP: $TIMESTAMP" \
  -H "Idempotency-Key: $UUID" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 500000,
    "currency": "GNF",
    "method": "MOBILE_MONEY",
    "provider": "orange_money",
    "customer_phone": "+224611223344"
  }'
initiate-payment.js
// No SDK required — standard fetch is enough
const res = await fetch('https://sandbox-api.saalapay.com/api/v1/payments/initiate', {
  method: 'POST',
  headers: {
    'X-SP-CLIENT-ID': process.env.SP_CLIENT_ID,
    'X-SP-SIGNATURE': signature,
    'X-SP-TIMESTAMP': timestamp,
    'Idempotency-Key': crypto.randomUUID(),
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    amount: 500000,
    currency: 'GNF',
    method: 'MOBILE_MONEY',
    provider: 'orange_money',
  }),
});

const { id, status, redirect_url } = await res.json();
InitiatePayment.php
// With any HTTP client (cURL, Guzzle, fetch...)
$ch = curl_init('https://sandbox-api.saalapay.com/api/v1/payments/initiate');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'X-SP-CLIENT-ID: ' . $clientId,
        'X-SP-SIGNATURE: ' . $signature,
        'X-SP-TIMESTAMP: ' . $timestamp,
        'Idempotency-Key: ' . bin2hex(random_bytes(16)),
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'amount'    => 500000,
        'currency'  => 'GNF',
        'method'    => 'MOBILE_MONEY',
        'provider'  => 'orange_money',
    ]),
]);
$payment = json_decode(curl_exec($ch), true);

Estimate

How much does it cost
on your volume?

Public rates, no commitment. Beyond 50M XOF/month, a negotiated contract may apply.

GNF

≈ 10 M GNF · 117 € · 76 700 XOF

Mobile Money 70%
Cards 25%
Transfer 5%

Estimated total cost

287 500 GNF

i.e. 2.88% of volume

Mobile Money · 7 M × 2,5% 175 000
Cards · 2,5 M × 3,5% + 1k 112 500
Transfer · 0,5 M Free
View all rates

FAQ

The recurring questions

How long does integration take?
One day for a sandbox POC, one week for production go-live with webhook handling and business error management. No SDK required — a standard HTTP client is enough.
What happens if a Mobile Money operator goes down?
The API returns an explicit error with a `provider_unavailable` code. You can fall back to another method on the UI side without restarting the whole transaction (idempotency guaranteed).
How do settlements work?
Mobile Money on T+1 business day, cards on T+2 business days. Settlement to bank account or wallet — free in both cases, no withdrawal fee.
Is SaalaPay licensed by BCRG or BCEAO?
SaalaPay operates through partnerships with banks and licensed operators in each jurisdiction. Platform-level licenses are under review.
Which countries beyond Guinea?
Senegal, Mali, Ivory Coast operational (XOF). Burkina Faso and Togo planned subject to ongoing operator agreements.
Is there a test environment?
Unlimited sandbox from signup. Isolated subdomain, separate keys, strict middleware rejection if you try to use a sandbox key on live.

Question not listed? Contact the team

Collect this quarter,
not in six months.

Immediate sandbox on signup, merchant contract activated within days after KYC verification. No setup fee.