Skip to main content

What is winam-payments?

winam-payments is a payment abstraction layer between your sportsbook or frontend platform and Mobile Money providers in Cameroon (MTN MoMo, Orange Money). Ilustration how it works

What you need to implement

1

Initiate a payment

Call POST /api/v1/deposits or POST /api/v1/withdrawals with your unique reference key.
2

Handle both deposit collection modes

Depending on the operator, the player either confirms a payment request sent to their phone, or dials a USSD code that you display. Read collection_mode in the deposit response and render instructions when present. See Deposit collection modes.
3

Expose a webhook endpoint

Provide a callback_url that accepts POST JSON requests — this is where winam-payments sends the payment outcome.
4

Verify webhook signatures

Each webhook includes an X-Winam-Signature header (t=<unix>,v1=<hex>, HMAC-SHA256 with your application’s webhook secret). See Webhooks.
5

Always read the status field

A 200 HTTP response means the request was processed — not that the payment succeeded. Read the status field in the body, and treat the webhook (or GET /transactions/{id}) as the source of truth for the final outcome.
HTTP 200 ≠ payment success. winam-payments returns 200 whenever the request is processed, regardless of the transaction outcome. A merchant-initiated deposit rejected by the operator at initiation comes back as 200 with status: "failed" (reason in state_reason). Never treat the HTTP status alone as confirmation — always inspect the body status and rely on the webhook for terminal states.

Base URLs

End-to-end deposit flow

Deposits

Initiate a Mobile Money deposit

Collection modes

How each operator collects a deposit

Withdrawals

Initiate a Mobile Money withdrawal

Webhooks

Receive and verify payment notifications

State machine

Transaction lifecycle diagram