JKASMS API

Send individual or bulk SMS, verify phone numbers with one-time codes, and get a delivery receipt for every recipient — over one REST API.

The API is HTTP with JSON request and response bodies. Every response carries a success boolean, and every error carries a stable machine-readable code you can branch on.

Shell
curl -X POST https://api.jkasms.com/api/v1/sms/send \
  -H "Authorization: Bearer $JKASMS_SECRET_KEY" \
  -H "X-JKASMS-Org-Id: $JKASMS_ORG_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "sender": "JKASMS",
    "message": "Your order is on the way.",
    "recipients": ["0241234567"]
  }'

What makes this different

You are told the cost before you commit

SMS is billed per segment, not per message, and a single character outside the GSM-7 alphabet — a curly apostrophe pasted from Word, an emoji — cuts capacity from 160 characters to 70. That is the most common unpleasant surprise in SMS billing.

POST /api/v1/sms/quote prices a send without sending it, using the same code path as the real send, so the quote and the charge cannot disagree.

Delivery is reported per recipient

Not just “batch accepted”. Every number resolves to DELIVERED, FAILED, REJECTED or EXPIRED, pushed to your webhook as it happens.

The routing underneath can change; your integration cannot

JKASMS routes across mobile networks and upstream carriers on your behalf. That routing changes as we negotiate rates and as carriers have outages. None of it reaches your code.

Voice works the same way as SMS

POST /api/v1/voice/send rings a list of phones and plays a recording — upload the audio in the request, reference one you saved earlier, or type the text and have us speak it. Same envelope, same error codes, same signed webhooks; the unit is seconds of call time rather than segments.

The field names follow the conventions most Ghanaian voice APIs use, so an existing integration can usually be repointed rather than rewritten.

Base URL

Shell
https://api.jkasms.com
There is no separate sandbox host. A sk_test_… key routes to test mode on the same URL — nothing is sent to a handset and nothing is charged. See Test mode.

Start here