Payouts sandbox testing
Test payouts in the sandbox with designated recipients
The transfers sandbox lets you test the full payout (transfers) flow on the test environment without sending any real money or calling real providers. When you use the test base URLs, every transfer is simulated end to end.
The scenario a transfer follows is chosen from the recipient number you send. Pick a number from the tables below to force a specific outcome (success, timeout, invalid recipient, or insufficient funds).
Note
Sandbox only runs on the test environment. Use the test base URLs (https://test-fep.kashier.io) with your test secret key. Real provider calls never happen here.
How it works
The sandbox simulates the transfer at two points, so the whole lifecycle behaves like production without any external call:
| Stage | What is simulated |
|---|---|
| Balance check | Insufficient-funds outcomes are decided before any provider is contacted. |
| Provider send & reconcile | The send and reconcile calls to the providers (EBC, Axis Pay, OctoCard) are mocked, returning success, a timeout, or an invalid-recipient failure. |
Any recipient number that is not listed in the tables below is treated as unknown: the send fails and the transfer ends up FAILED.
Scenarios
Four scenarios can be triggered. Each test number below maps to exactly one of them.
| Scenario | Flow | Final status |
|---|---|---|
| SUCCESS | Send succeeds, reconcile confirms the transfer. | TRANSFERRED |
| TIMEOUT | Send succeeds, reconcile returns 504 and is retried until max retries. | IN_TRANSIT |
| INVALID | Send succeeds, reconcile reports an invalid recipient, balance is reversed. | FAILED |
| INSUFFICIENT_FUNDS | Balance check fails before the provider is called. | FAILED |
Mobile wallet numbers
Use these as the recipientNumber with method set to wallet. The same numbers work for wallet transfers and instant wallet transfers.
| Recipient Number | Scenario |
|---|---|
| 01111111111 | SUCCESS |
| 01111111112 | TIMEOUT |
| 01111111113 | INVALID |
| 01111111114 | INSUFFICIENT_FUNDS |
Card numbers
Use these as the recipientNumber with method set to card. The sandbox matches on the masked form exactly as written below — send the asterisks, not a full card number. A full PAN is a different string and matches no scenario, so the transfer is treated as an unknown recipient and ends up FAILED.
| Recipient Number | Scenario |
|---|---|
5123********2346 | SUCCESS |
5123********2347 | TIMEOUT |
5123********2348 | INVALID |
5123********2349 | INSUFFICIENT_FUNDS |
For method: card, recipientNumber identifies the recipient only — the card being paid out to is passed separately as cardToken, alongside recipientBank. Both are required on card transfers.
Bank account numbers
Use these as the recipientNumber with method set to bank.
| Recipient Number | Scenario |
|---|---|
| 78901234567890 | SUCCESS |
| 78901234567891 | TIMEOUT |
| 78901234567892 | INVALID |
| 78901234567893 | INSUFFICIENT_FUNDS |
OctoCard (national ID) numbers
Use these as the recipientNumber for OctoCard transfers identified by national ID.
| Recipient Number | Scenario |
|---|---|
| 29901011234567 | SUCCESS |
| 29901011234568 | TIMEOUT |
| 29901011234569 | INVALID |
| 29901011234560 | INSUFFICIENT_FUNDS |
Example requests
Send these to the test create-transfer endpoint https://test-fep.kashier.io/v3/transfers/single with your test secret key in the Authorization header.
Trigger a successful wallet transfer:
{
"amount": 100,
"method": "wallet",
"recipientName": "Test User",
"merchantTransferId": "sandbox-success-1",
"recipientNumber": "01111111111"
}Trigger an insufficient-funds failure:
{
"amount": 100,
"method": "wallet",
"recipientName": "Test User",
"merchantTransferId": "sandbox-insufficient-1",
"recipientNumber": "01111111114"
}