Changelog
What changed, and what we consider a breaking change.
v1 is stable
It will only ever gain optional fields and new endpoints. An existing field will not change type, change meaning, or disappear. Anything that would break a working integration goes to
/v2 instead, and /v1 keeps working for at least twelve months after that.Unreleased
Added
POST /v1/sms/send— up to 1,000 recipients, per-recipient personalisation, optional scheduling.GET /v1/smsandGET /v1/sms/{messageId}— the message log and single-message status.GET /v1/wallet/balance,GET /v1/wallet/transactions.GETandPOST /v1/sender-ids.- Contacts and groups:
/v1/contacts,/v1/contacts/import,/v1/groups. GETandPUT /v1/webhooks— delivery events signed withX-SBS-Signature.POST /v1/keys/rotate— rotate the key you are calling with.Idempotency-Keyon every POST. The same key with the same body within 24 hours returns the original response instead of sending twice.X-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Reseton every response;Retry-Afteron a 429.- Test keys (
sbs_test_) — the full request path, simulated delivery, nothing billed.
Campaigns are not in this release
/v1/campaigns was described here before it was built. The reference no longer documents it, and it will arrive with its own entry on this page. For large audiences today, import contacts into a group and send from the dashboard.How versioning works
| Change | Where it goes |
|---|---|
| A new endpoint | v1 — no notice needed |
| A new optional request field | v1 — no notice needed |
| A new response field | v1 — parse leniently and ignore what you do not know |
| A new error.code value | v1 — always have a fallback branch |
| A new enum member (a message status, an event) | v1 — treat unknown members as not final |
| Removing or renaming a field | v2 |
| Changing a field's type or meaning | v2 |
| Making an optional field required | v2 |
Write a tolerant client
The rules above only protect you if your parser ignores fields it does not recognise and has a default branch for unknown enum values. A client that throws on an unexpected
status will break on a change this page calls non-breaking — and it will be right that something changed, and wrong that it was our fault.
