Test mode
A sk_test_ key runs the complete pipeline without reaching a handset and without charging you.
There is no separate sandbox host. The same base URL serves both — the key prefix decides.
What test mode does
| Behaviour | Test mode |
|---|---|
| Message stored and visible in history | Yes |
| Status transitions and delivery receipts | Yes |
| Webhooks fired and signed | Yes |
| Idempotency, validation, rate limits | Yes |
| Reaches a real handset | No |
| Charged to your balance | No |
Test keys work immediately, even while your account is under review — so you can finish your integration before approval comes through.
Forcing an outcome
The last four digits of the recipient decide what happens, so you can test your error handling without waiting for a real failure.
| Ends with | Outcome | Use it for |
|---|---|---|
0000 | DELIVERED after ~2s | The happy path |
1111 | FAILED after ~2s | Your failure handling |
2222 | Stays SUBMITTED | Pending states and timeouts |
3333 | REJECTED immediately | Invalid-number handling and refunds |
| anything else | DELIVERED after ~2s | General testing |
Shell
# Delivers
curl -X POST https://api.jkasms.com/api/v1/sms/send \
-H "Authorization: Bearer sk_test_..." \
-H "X-JKASMS-Org-Id: $JKASMS_ORG_ID" \
-H "Content-Type: application/json" \
-d '{"sender":"JKASMS","message":"Test","recipients":["0241230000"]}'
# Fails, so you can check your webhook handler
curl -X POST https://api.jkasms.com/api/v1/sms/send \
-H "Authorization: Bearer sk_test_..." \
-H "X-JKASMS-Org-Id: $JKASMS_ORG_ID" \
-H "Content-Type: application/json" \
-d '{"sender":"JKASMS","message":"Test","recipients":["0241231111"]}'Going live
- Get your account approved and your sender ID approved.
- Top up your wallet.
- Create a
sk_live_key and swap it in.
Nothing else changes — same URL, same request shape, same webhook format.