Skip to main content
POST
Initiate a Mobile Money deposit

How it works

1

Call POST /deposits

Your backend sends the player’s MSISDN, amount, and a unique reference.
2

USSD notification sent

winam-payments triggers a USSD collection on the merchant SIM. The player receives a phone notification asking them to enter their MoMo PIN.
3

Player confirms

The player confirms on their phone. winam-payments receives an SMS confirmation.
4

Webhook fired

Your callback_url receives a POST with event: "payment.succeeded" (or "payment.failed" if refused or timed out).

Notes

Use POST /api/v1/msisdn/detect to automatically detect the player’s operator from their phone number — no need to ask them. The deposit endpoint rejects with 422 any request whose msisdn prefix clearly contradicts operator (MTN: 67x/68x/650-654 · Orange: 69x/655-659).
The reference field is your idempotency key. Two calls with the same reference return the same transaction without creating a duplicate. Always use a different reference for each distinct payment. See Idempotency.
The expires_at timestamp in the response indicates when the USSD confirmation window closes (typically +10 minutes). If the player does not confirm before this deadline, the transaction transitions to expired.
HTTP 200 does not mean the deposit succeeded. A 200 only means the request was processed — always read the status field in the response body. The deposit USSD is initiated synchronously, so a deposit that the operator rejects at initiation (invalid number, amount below the operator minimum, USSD error…) comes back as 200 with status: "failed". The reason is available in the state_reason field of GET /api/v1/transactions/{winam_tx_id}.

Response states

Terminal states arrive via webhook:

Authorizations

X-API-Key
string
header
required

Body

application/json
player_id
string<uuid>
required

Player UUID on the sportsbook side

msisdn
string
required

Player MoMo number (E.164)

Example:

"+237670123456"

amount_xaf
integer
required

Amount in XAF (min 100). XAF has no sub-unit.

Required range: x >= 100
operator
string
required

MoMo operator

Examples:

"mtn"

"orange"

reference
string
required

Unique sportsbook reference (idempotency key). Same reference = same transaction returned.

Required string length: 1 - 128
callback_url
string | null

POST URL for notification when payment is confirmed or fails.

Example:

"https://sportsbook.example.com/webhooks/payments"

Response

Successful Response

winam_tx_id
string<uuid>
required

Winam internal transaction UUID. Use this with GET /api/v1/transactions/{id}.

reference
string
required

Your idempotency key, echoed back from the request

status
string
required

Initial state. Typically provider_acknowledged (USSD sent to player) or pending (being sent). Terminal states arrive via webhook.

Example:

"provider_acknowledged"

amount_xaf
integer
required

Amount in XAF

Example:

5000

operator
string
required

"mtn" or "orange"

Example:

"mtn"

expires_at
string<date-time> | null

USSD confirmation deadline (typically +10 minutes from creation). The transaction transitions to expired if the player does not confirm before this time.