API changes
How this API changes, what we promise not to break, and what you should do to stay safe.
There’s no version in the URL
Endpoints are plain — https://api.wakalisms.com/sms/send, with no /v1/ or
/v2/. That’s deliberate. Rather than ask you to migrate between versions, we
only make changes that existing integrations survive.
“Wakali SMS v2” refers to the platform and these docs, not a second API. Your existing calls keep working.
What we promise
- Existing fields keep their meaning. We won’t repurpose a field or change its type.
- Existing fields don’t disappear without a long, announced deprecation.
- Status codes stay put for the same conditions.
- New behaviour is opt-in — a new capability arrives as a new endpoint or a new optional parameter, never as a change to what an old call does.
What we may do at any time
These are the changes you should expect, and your integration needs to tolerate:
- Add fields to responses.
carrierwas added to messages this way. - Add optional request parameters.
- Add new endpoints.
- Add new values to a list — a new
status, a new network name. - Change wording in
detailmessages. They’re for humans; don’t match on them.
Don’t match on error text. detail is written for people and gets
reworded. Branch on the HTTP status, and on documented fields like
invalid_recipients.
Writing an integration that survives
Ignore fields you don’t recognise. Most JSON parsers do this already; strict schema validation that rejects unknown keys will break the first time we add one.
// Fine — extra fields are ignored
const { status, cost_kes } = await res.json();
// Fragile — fails the day a field is added
assertExactShape(body, ["status", "cost_kes", "job_id"]);Treat unknown enum values as “something new”, not an error.
const FINAL = new Set(["delivered", "failed", "skipped"]);
const settled = FINAL.has(message.status); // unknown values are "still going"Branch on status codes, not strings.
if (res.status === 402) await topUpAndAlert();Read invalid_recipients. A partial failure returns 202, so a success
check alone will hide it.
How you’ll hear about changes
Anything that could affect a working integration is emailed to account owners before it ships, and noted below. Additive changes ship without ceremony.
Recent changes
October 2026
- Twenty mobile ranges were being wrongly rejected. Numbers in
0116–0119,0140–0145and0180–0189came back as invalid because our validation used a fixed list that predated those allocations. They now work. If you filtered them out as a workaround, you can stop. See Phone numbers. - Landlines are now rejected rather than accepted and charged. They can’t
receive an SMS. They appear in
invalid_recipientsinstead. carrieradded to messages, showing the network a number looks like it belongs to.POST /sms/coverageadded — check which networks a list of recipients falls on before sending. See Sender IDs.
Getting notified
Breaking changes are rare and announced by email to the account owner. If you’d like a second technical contact on the account, email support@wakalisms.com.