Quickstart
Get an API key and send your first SMS in five minutes.
Create an account and top up
Sign up at app.softlinksms.co.ke, create an account, and add funds under Settings → Billing. Every send is paid from this wallet, so it needs a balance before your first request.
Generate an API key
In the dashboard, open Settings → Developer tools and choose Generate key. Confirm your password, then enter the code we email you.
Your key looks like this, and is shown once:
bsk_9fcc4guB2yD.ilIexampleSecretPortionNeverShownAgainCopy it into your secret manager or an environment variable now. We store only a hash, so a lost key can't be recovered, only replaced.
export SOFTLINK_API_KEY="bsk_..."Send an SMS
Replace the number with your own and run:
curl https://api.softlinksms.co.ke/api/v1/sms \
-H "X-Api-Key: $SOFTLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"recipients": ["+254712345678"],
"body": "Hello from SoftLinkSMS"
}'You get 201 Created with the send's batch_id, its total price, and one message per recipient. Each starts as pending:
{
"batch_id": "1c9d7f2a-55e3-4b8e-9a61-0f2d3c4b5a69",
"recipients": 1,
"total_price": "0.50",
"currency": "KES",
"messages": [
{
"id": "3fae8b8e-9c3a-4e9a-9d3a-7e8e9c3a4e9a",
"body": "Hello from SoftLinkSMS",
"traffic_class": "promotional",
"sender_id": "SOFTLINK",
"price": "0.50",
"currency": "KES",
"batch_id": "1c9d7f2a-55e3-4b8e-9a61-0f2d3c4b5a69",
"message_id": null,
"recipient": "+254712345678",
"response_code": null,
"response_description": null,
"status": "pending",
"duration_ms": null,
"created_at": "2026-10-19T08:15:00.412000Z",
"updated_at": "2026-10-19T08:15:00.412000Z"
}
]
}Check that it arrived
Within a few seconds the network confirms delivery. Fetch the message by the id in messages:
curl https://api.softlinksms.co.ke/api/v1/sms/3fae8b8e-9c3a-4e9a-9d3a-7e8e9c3a4e9a \
-H "X-Api-Key: $SOFTLINK_API_KEY"status moves from pending to sent (the network accepted it) to delivered (it reached the handset). Polling is fine while you're testing. In production, let webhooks tell you instead.