Changelog
Every change to the API, newest first.
2026-10-19
Added
- Webhooks. Signed
sms.delivered,sms.failed,email.delivered,email.bouncedandemail.failedevents, with retries over 45 hours, a 30-day event log and redelivery. See Webhooks. - Idempotency keys.
Idempotency-KeyonPOST /smsandPOST /emailmakes retries safe. See Idempotency. - Rate limits. 30 sends and 100 reads per second per account, with
429andRetry-After. See Rate limits. - Delivery tracking. SMS now move to
deliveredorfailedas networks report back, usually within seconds.
Changed
- Send responses are an object.
POST /smsandPOST /emailnow return{ batch_id, recipients, total_price, currency, messages }instead of a bare array; the messages are undermessages, and each includesbatch_id. - Money is a decimal string plus
currency.priceis"0.60"with"currency": "KES"beside it, on messages, send responses and webhook events, instead of"KES 0.6". Webhook events renamedcosttoprice. - One name per field. The SMS text is
body(as for email);messageis still accepted on requests. Webhook events renamedtotorecipient, matching the API. - Times are UTC. Every timestamp ends in
Z. Times you send without an offset are read as UTC. - Webhook scopes. Webhook endpoints now need
webhooks:read(to view the endpoint and event log) orwebhooks:write(to change the endpoint, rotate its secret, test or redeliver) instead ofaccount:manage. Existing keys withaccount:managewere given both, so nothing breaks. See Authentication. - Per-customer pricing. Prices are now set per customer, across all their accounts, instead of from a public list. Each message's
priceis what your wallet was charged. See Pricing and segments. - A message longer than 3 segments now returns
400 message_too_longinstead of500. - Validation errors now report the specific
codeof the first problem (for examplerequired) instead of alwaysinvalid. - Send requests no longer list server-set fields (
status,message_id, …) as inputs in the schema.
2026-10-18
Added
- Sending access.
traffic_classon sends,GET /sending-profile, and403 traffic_class_not_permitted. Transactional SMS go out from your own approved sender ID. See Sending access.
Changed
- Email is transactional-only and needs approval.
- The API is served from
api.softlinksms.co.ke.