Create, bind and rotate API keys
A key proves which tenant is calling and which channels it may use. It is shown in full once, and a key with no binding cannot send at all.
Read this article →The platform POSTs to a URL you configure, with a token you generate. Two implementation details decide whether you lose events.
Configure the callback URL and generate the callback token in the console, then expose an endpoint that accepts a JSON POST. The platform posts when a message reaches a terminal state.
Each request carries an X-Callback-Token header. Verify it server-side before trusting the body.
Console → Settings → Webhook. Use an HTTPS endpoint that is reachable from the public internet.
The token is what proves a request came from the platform. Store it server-side, not in client code.
Accept a JSON POST, verify the header, then acknowledge with a 2xx response.
| Field | Meaning |
|---|---|
| messageId | Platform message ID — your de-duplication key |
| status | delivered or failed, and nothing else |
| providerMessageId | Provider-side ID |
| rawStatus | The provider's own wording, e.g. Twilio delivered or Vonage expired |
| to / provider | Recipient and the provider that carried it |
| errorCode | Reason, on failure or refusal |
| encoding / segments | Encoding used and billed segments |
| timestamp | When the platform pushed it, ISO-8601 UTC |
A non-2xx response, or a timeout, is retried on a 1s / 5s / 15s backoff, three times. After that the platform gives up and records the delivery as failed.
That retry behaviour means you can legitimately receive the same event twice. De-duplicate on messageId rather than assuming exactly-once delivery.
Suppressed messages produce no callback. They were never handed to a provider, so delivered and failed do not apply — the outcome was fixed at acceptance.
A key proves which tenant is calling and which channels it may use. It is shown in full once, and a key with no binding cannot send at all.
Read this article →One endpoint accepts asynchronously. A success code means the platform took the message — not that a handset received it.
Read this article →Four states, and one of them does not belong in the same bucket as the others. Reading suppressed as a failure sends you looking in the wrong place.
Read this article →