MTN Direct Debit
Create and manage recurring debit mandates on MTN Mobile Money wallets. A mandate must be approved by the customer before scheduled debits can run.
Direct debit is asynchronous. Create and update requests return a processing response. Use the mandate creation and debit callbacks to confirm final status.
Endpoints
| Action | Endpoint | Use For |
|---|---|---|
| Create Mandate | /api/v1.0/new_mtn_recurring_create_mandate/ |
Start a new recurring debit approval request. |
| Update Mandate | /api/v1.0/new_mtn_recurring_update_mandate/ |
Change amount, dates, or frequency for an existing mandate. |
| Cancel Mandate | /api/v1.0/new_mtn_recurring_cancel_mandate/ |
Cancel an existing approved mandate. |
| Cancel Pre-approval | /api/v1.0/new_mtn_recurring_cancel_pre_approval/ |
Cancel a customer's pending pre-approval before the mandate becomes active. |
Create Mandate
POST
https://testxchange.korba365.com/api/v1.0/new_mtn_recurring_create_mandate/
| Parameter | Required | Description |
|---|---|---|
| client_id | Mandatory | Your Client ID from the Korba Xchange dashboard. |
| customer_number | Mandatory | Customer MTN wallet number in the format 233xxxxxxxxx. |
| transaction_id | Mandatory | Unique reference from your system for the mandate creation request. |
| amount | Mandatory | Amount to debit on each scheduled cycle. |
| frequency_type | Mandatory | Schedule type. Supported values are Daily, Weekly, Monthly, and Yearly. |
| frequency | Mandatory | Interval for the selected frequency type, for example 1 for every month. |
| start_date, end_date | Mandatory | Mandate start and end dates. |
| debit_day | Mandatory | Day on which scheduled debits should be attempted. |
| mandate_creation_call_back_url | Mandatory | Callback URL for the customer's approval or rejection of the mandate. |
| debit_customer_call_back_url | Mandatory | Callback URL for each scheduled debit result. |
| description, payer_name | Optional | Metadata stored against the mandate transaction. |
Create Request
curl -X POST https://testxchange.korba365.com/api/v1.0/new_mtn_recurring_create_mandate/ \ -H "Authorization: HMAC YOUR_CLIENT_KEY:YOUR_SIGNATURE" \ -H "Content-Type: application/json" \ -d '{ "client_id": 2, "customer_number": "233241234567", "transaction_id": "DD-20260626-001", "amount": "20.00", "frequency_type": "Monthly", "frequency": "1", "start_date": "2026-07-01", "end_date": "2027-06-30", "debit_day": "30", "mandate_creation_call_back_url": "https://yourapp.com/callbacks/mandate-created/", "debit_customer_call_back_url": "https://yourapp.com/callbacks/mandate-debit/", "description": "Monthly subscription" }'
Update Mandate
POST
https://testxchange.korba365.com/api/v1.0/new_mtn_recurring_update_mandate/
Update an existing mandate by passing its mandate_id and the full replacement schedule values.
| Parameter | Required | Description |
|---|---|---|
| client_id | Mandatory | Your Client ID from the dashboard. |
| mandate_id | Mandatory | Identifier of the mandate to update. |
| transaction_id | Mandatory | Unique reference for this update request. |
| amount | Mandatory | New debit amount for each scheduled cycle. |
| frequency_type, frequency, start_date, end_date, debit_day | Mandatory | Replacement schedule values for the mandate. |
| description, payer_name, extra_info | Optional | Metadata stored against the update request. |
Update Request
{ "client_id": 2, "mandate_id": "009", "transaction_id": "DD-20260626-002", "amount": "25.00", "frequency_type": "Monthly", "frequency": "1", "start_date": "2026-08-01", "end_date": "2027-07-31", "debit_day": "30" }
Cancel Mandate
POST
https://testxchange.korba365.com/api/v1.0/new_mtn_recurring_cancel_mandate/
Cancel Mandate Request
{ "client_id": 2, "mandate_id": "009" }
Cancel Pre-approval
POST
https://testxchange.korba365.com/api/v1.0/new_mtn_recurring_cancel_pre_approval/
Cancel Pre-approval Request
{ "client_id": 2, "customer_number": "233241234567" }
Responses
200 OK
{ "success": true, "results": "Transaction is being processed.", "error_code": null }
400 Bad Request
{ "success": false, "error_code": 405, "error_message": "Duplicate Transaction ID" }
Callbacks
Korba Xchange calls your callback URLs with the original transaction_id, a status of SUCCESS or FAILED, and a message describing the outcome.
Callback Example
https://yourapp.com/callbacks/mandate-created/?transaction_id=DD-20260626-001&status=SUCCESS&message=Mandate%20approved