Quickstart
Step 1: Sign up
Create your MALIPOPAY account at app.malipopay.co.tz.
Step 2: Get your API key
In the dashboard, go to Settings → API Keys and copy your secret key. It looks like mp_sk_prod_... and goes in the apiToken header on every request.
Step 3: Add a test recipient
Until your account is approved for go-live, you can only transact with numbers you have registered under Settings → Test Recipients (up to three), and each direction is capped at TZS 100,000 per day. Add the phone number you are going to charge before you make the call. See Testing.
Step 4: Make your first collection request
curl -X POST https://core-prod.malipopay.co.tz/api/v2/payment/collection \
-H "apiToken: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"reference": "ORDER-001",
"description": "Payment for Order #001",
"amount": 50000,
"service": "mobile",
"account": "255712345678",
"amountType": "FULL"
}'
You do not need to say which network the number belongs to. For service: "mobile" the MNO is detected from the number, and 0712345678 is accepted just as readily as 255712345678. To charge a bank account or a till instead, change service to account or merchant and add provider (for example "provider": "CRDB").
The call returns as soon as the request reaches the channel. The customer has not paid yet:
{
"success": true,
"code": 1109,
"message": "Collection request sent successfully",
"data": {
"merchantAccountId": "Lockwood Technology",
"mode": "CHARGE",
"amountType": "FULL",
"reference": "ML008985",
"amount": 50000,
"paidAmount": 0,
"transactionFee": 1250,
"customer": {
"phoneNumber": "255712345678",
"firstname": "JOHN",
"lastname": "HAULE",
"mno": "Vodacom"
},
"description": "Payment for Order #001",
"link": "https://app.malipopay.co.tz/ref?ML008985",
"currency": "TZS",
"status": "PROCESSING",
"id": "6890f1c2a4b19e3f2c7d5a10",
"createdAt": "2026-08-18T08:15:32.000Z",
"updatedAt": "2026-08-18T08:15:32.000Z",
"available_channels": ["VODACOM", "AIRTEL", "TIGO", "CRDB"]
}
}
Store data.reference. It is how you match the webhook and how support traces the payment.
Step 5: Handle the webhook
Configure your webhook URL in the dashboard. MALIPOPAY POSTs to it when the payment reaches a final state:
{
"timestamp": "20260818081604",
"reference": "ML008985",
"customerReference": "ORDER-001",
"amount": 50000,
"merchantAccountId": "Lockwood Technology",
"status": "SUCCESSFUL",
"type": "CHARGE",
"customer": {
"firstname": "JOHN",
"lastname": "HAULE",
"phoneNumber": "255712345678",
"mno": "Vodacom"
},
"transactionId": "MP250001234567",
"payloadSignature": "b875460229adc88cef4bd9904b0b06ba4b2cb4...",
"event": "payment.confirmed",
"service": "Collection"
}
Verify the X-Malipopay-Signature header before trusting it. See Webhooks.
Step 6: Go live
Submit for go-live approval in the dashboard. Nothing about your integration changes: same base URL, same API key. Approval lifts the test-recipient restriction and raises your limits. See Going Live.