SelanimDocs

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/sms and GET /v1/sms/{messageId} — the message log and single-message status.
  • GET /v1/wallet/balance, GET /v1/wallet/transactions.
  • GET and POST /v1/sender-ids.
  • Contacts and groups: /v1/contacts, /v1/contacts/import, /v1/groups.
  • GET and PUT /v1/webhooks — delivery events signed with X-SBS-Signature.
  • POST /v1/keys/rotate — rotate the key you are calling with.
  • Idempotency-Key on 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-Remaining and X-RateLimit-Reset on every response; Retry-After on 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

ChangeWhere it goes
A new endpointv1 — no notice needed
A new optional request fieldv1 — no notice needed
A new response fieldv1 — parse leniently and ignore what you do not know
A new error.code valuev1 — 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 fieldv2
Changing a field's type or meaningv2
Making an optional field requiredv2

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.