API and delivery

Rate limits and monthly usage

There are two counters, they are not the same number, and only one of them looks like a bill.

4 min read · updated 2026-10-13

Submission rate is per tenant

Every path that submits — API, console, bulk, scheduled — draws on one tenant-level budget. Over the limit returns HTTP 429 with code 42900, and the client is expected to back off.

PlanReqs/secChannelsLog retention
FREE1017 days
GROWTH5037 days
PRO1001030 days
ULTRA500unlimited90 days
Scope. Figures above are the current published plan limits. Check the pricing page for what applies to your account.

There is a second limiter in front

An edge limiter also runs, keyed on client IP and set far above any plan tier. It exists to absorb abnormal traffic rather than to shape normal use.

It returns the same HTTP 429 and the same code 42900, so distinguish it by the message text: the edge limiter's message begins with "edge rate limit exceeded".

Two counters, and the one that matters

The usage endpoint reports both, and they will never be equal.

FieldWhat it counts
messageCountHow many times you submitted
billedSegmentsHow many billable messages you produced — long messages count as more than one, and only provider-accepted ones count
periodBilling period key, UTC yyyyMM
plan / qpsCurrent plan and its submission ceiling; zero or less means unlimited

Why long messages cost more than they look

A single logical message can bill as several segments once it crosses the encoding limit, and that limit depends on the alphabet used. Non-GSM characters move the whole message to a wider encoding with a smaller per-segment budget.

The platform does not store message bodies, so segments cannot be recomputed after the fact. The segment count returned with each message is the only record — reconcile from it, not from the text.

Keep reading

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 →

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 →