API and delivery

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.

3 min read · updated 2026-10-13

What a key carries

A key is not just an identifier — it pairs a tenant with a set of permitted channels. The server checks both on every request, so a key is also the narrowest available way to scope what an integration can do.

Presenting the key

Either header works; there is no difference in behaviour between them.

HeaderValue
AuthorizationBearer sk_…
X-API-Keysk_…

Create a key

  1. Open Developer in the console

    This page lists existing keys and their bindings.

  2. Create the key

    The full value is displayed once, shaped sk_…. Store it the way you store any other production credential.

  3. Bind it to channels

    Select one or more channels the key may send over. Multiple bindings are allowed and are load-balanced.

Handling and rotation

Keys can be revoked and rotated from the console at any time. Because a key is bound to specific channels, rotating one is also how you narrow what a compromised integration is able to do.

  • A missing or invalid key returns HTTP 401 with code 40100.
  • A valid key bound to no channel is rejected with code 40000, not 401 — the key was fine, the permission was not.
  • Being bound to a channel that is not ACTIVE is also a 40000-class rejection.

Keep reading

Send a message with the API

One endpoint accepts asynchronously. A success code means the platform took the message — not that a handset received it.

Read this article →

What each message status means

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 →

Receive delivery receipts

The platform POSTs to a URL you configure, with a token you generate. Two implementation details decide whether you lose events.

Read this article →