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

BehaviourTest mode
Message stored and visible in historyYes
Status transitions and delivery receiptsYes
Webhooks fired and signedYes
Idempotency, validation, rate limitsYes
Reaches a real handsetNo
Charged to your balanceNo

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 withOutcomeUse it for
0000DELIVERED after ~2sThe happy path
1111FAILED after ~2sYour failure handling
2222Stays SUBMITTEDPending states and timeouts
3333REJECTED immediatelyInvalid-number handling and refunds
anything elseDELIVERED after ~2sGeneral 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

  1. Get your account approved and your sender ID approved.
  2. Top up your wallet.
  3. Create a sk_live_ key and swap it in.

Nothing else changes — same URL, same request shape, same webhook format.