SSoftLinkSMSDocs

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.ilIexampleSecretPortionNeverShownAgain

Copy 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.

Next steps

On this page