Skip to main content
1

Send it

sms.send takes one recipient in E.164 — a leading + and the country code — and either a template with variables or an inline body.topic marks a marketing send, which consent governs. Omit it for transactional, which only a suppression stops.
2

Your first one is probably blocked, and that is not an error

If the environment has no active carrier registration, or no number to send from, the message is stored and the reply answers status: "queued" with a blocked object beside it saying which, and what to check. It is not a failure: it sends once the channel opens.So do not poll its status waiting for it to change — it will not move until the registration clears. Read blocked on the reply and act on that instead. A send API that returned 200 and left you watching a status that will never move is the thing this is written to avoid.sms.registration.submit records a registration and sms.registration.get follows it. Sending the filing to the carrier from that call is not built yet; the SMS rules guide explains what is.
3

Billing counts segments, not messages

A text is billed per segment. A body that stays inside the GSM alphabet fits far more characters per segment than one that does not — a single emoji or curly quote switches the whole message to a different encoding and more than doubles the per-character cost.The reply says how many segments were counted, so the number is visible at send time rather than at the end of the month.
4

STOP is handled before you are called

A number that has replied STOP is recorded as suppressed rather than sent to — the audience policy is asked before the send, not after.Lath records STOP and START from the handset itself, so you do not have to implement the keywords, and you cannot accidentally text someone who opted out. The reply the person gets comes from the carrier’s own opt-out handling; Lath’s automatic replies are off by default, and turning one on while the carrier’s is still on sends the person two.
Last modified on September 23, 2026