Skip to Content
GuidesAPI changes

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. carrier was 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 detail messages. 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–0145 and 0180–0189 came 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_recipients instead.
  • carrier added to messages, showing the network a number looks like it belongs to.
  • POST /sms/coverage added — 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.

Last updated on