The most common MTN MoMo API errors are: 401 Unauthorized (wrong API credentials or expired token), 400 Bad Request (malformed payload or invalid parameters), callback not received (server not publicly accessible or URL misconfigured), timeout (customer did not confirm), and 500 Internal Server Error (MoMo-side issue, retry later). Most errors during development are caused by incorrect sandbox credentials, a callback URL that is not publicly reachable, or missing required fields in the request payload.
401 Unauthorized
The most common error during setup. Causes:
403 Forbidden
You are authenticated but not authorized for this operation. Causes:
400 Bad Request
Your request is malformed. Common causes:
409 Conflict
A resource with the same ID already exists. Common when creating API users in the sandbox: if you reuse a reference ID, you get a 409. Generate a new UUID for each attempt.
422 Unprocessable Entity
The request is syntactically correct but semantically invalid. Check the response body for specific error details. Common cause: amount format issues (some APIs expect a string, others expect a number).
Get weekly developer tips
Join 25,000+ developers. Practical guides, job tips, and new content — straight to your inbox.
No spam. Unsubscribe anytime.
Callback problems are the most frustrating category because the error is silent: nothing happens. Your server does not receive the expected POST request, and you have no error message to debug.
"My callback is not being received"
Checklist:
ngrok http 3000) to get a public URL. Verify ngrok is running and your URL is current (ngrok URLs change on restart with the free tier)."I receive callbacks in sandbox but not in production"
Your production server must be deployed with HTTPS. The callback URL registered during production onboarding must match exactly. Verify your production server is accepting POST requests from external sources.
These errors come back in the callback or when you poll the transaction status.
FAILED: PAYER_NOT_FOUND (or similar)
The phone number does not have a MoMo account. Verify the number is correct and has an active MoMo wallet.
FAILED: NOT_ENOUGH_FUNDS
The customer does not have enough money in their MoMo wallet. Show a friendly message suggesting they top up and try again. Do not reveal the customer's balance.
FAILED: TRANSACTION_TIMED_OUT
The customer did not confirm the payment within the timeout period. They may not have seen the prompt, or they chose not to confirm. Allow them to retry.
FAILED: INTERNAL_PROCESSING_ERROR
An error on MoMo's side. This is not your fault. Implement retry logic with exponential backoff. If it persists, check MoMo's status page or contact their developer support.
PENDING (not transitioning to success or failure)
The transaction is stuck. This can happen if the USSD prompt was sent but the customer has not responded. Implement a timeout in your application (60 to 120 seconds) and show the customer a retry option. Also poll the status endpoint as a fallback.
When something is broken in your MoMo integration, follow this order:
Detailed logging during development is the single most effective debugging tool. Every mobile money integration we have built at McTaba starts with comprehensive request and response logging. When something breaks (and it will), the logs tell you exactly where and why.
If you want structured, mentored support through this process, the McTaba mobile money integration course (approximately RWF 100,000) walks you through building a complete integration with error handling built in from the start. The debugging strategies you learn apply to MoMo, M-Pesa, Airtel Money, and any future mobile money API you encounter.
Create a free McTaba Academy account. Access starter lessons, join the community, and explore at your own pace.
Create Free Account