> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kemypay.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Test mode

> Simulate every payment outcome without moving money

With a `sk_test_` key, payments are **simulated**. Nothing is sent to an operator and no money moves, but the flow is the same as in live mode: the payment is created, your test balance is credited, and your server receives the webhook.

* Your service can collect in test mode **while it is still `pending_review`**.
* The result is **immediate**: the response of `POST /mobile-money/collections` already has its final status (except for the "stays pending" number below).
* Test balances are separate from live balances.

## Choose the outcome with the phone number

The **last 3 digits** of `phone_number` decide the result:

| Last digits | Result | `failure_code` |
| - | - | - |
| `789` (and any number not listed) | `completed` | — |
| `019` | `failed` | `payer_limit_reached` |
| `029` | `failed` | `payer_not_found` |
| `039` | `failed` | `payment_not_approved` |
| `049` | `failed` | `insufficient_balance` |
| `069` | `failed` | `unknown_error` |
| `129` | stays `processing` for about 60 seconds, then `completed` | — |

Example: `237670000789` succeeds, `237670000049` fails for insufficient balance.

> [!TIP]
>
> Test the `129` case: it is the closest to real life, where a customer takes a few seconds to type their PIN. Your code must wait for the webhook, not for the response of the request.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.