Opt-out

STOP means stop, automatically.

Every recipient can text STOP to opt out, HELP to get a help response, and START to opt back in. Bird honors these keywords automatically on every send and keeps a per-recipient suppression list you can query — no extra code on your side.

send-otp.ts
200 · 0.4s
import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

const code = generateOtp();

const { data, error } = await bird.sms.send({
  from: "Bird",
  to:   "+15005550006",
  text: `Your Bird verification code is ${code}. Reply STOP to opt out.`,
}).safe();

if (error) throw error;
console.log(data.id);
// → "sms_4kT01Lq2m..."

Today at 2:14 PM

Hey Ada — your Bird sign-in code is 482917. It'll expire in 10 minutes. Don't share it with anyone.
482917
Delivered

Opt-out is the one rule that's always on.

Opt-out handling is part of SMS compliance on the Bird SMS API, and unlike registration it applies everywhere you send, with no setup. The reserved keywords STOP, HELP, and START are recognized in inbound messages and acted on per recipient, so a person who opts out stays opted out across your sends until they choose to come back.

How the keywords behave.

Reserved keywords, enforced per recipient.

  1. 01

    STOP suppresses automatically.

    When a recipient texts STOP, Bird adds them to the suppression list and blocks further sends to that number without any action from you.

  2. 02

    HELP returns a help response.

    A recipient who texts HELP gets an automatic help reply, so you meet the carriers' help-keyword requirement without wiring a handler.

  3. 03

    START resubscribes them.

    Opt-out is reversible. A recipient who texts START is removed from suppression and can receive messages again — they're always in control.

  4. 04

    The suppression list is queryable, per recipient.

    Check whether a number is suppressed through the API before you build an audience, so an opted-out recipient never slips back into a send.

An opt-out arrives as a signed event.

When a recipient opts out, Bird suppresses them and notifies your webhook with an sms.opted_out event so your own records stay in sync. The event is HMAC-signed like every Bird webhook.

POST /webhooks/bird
sms.opted_out
{
  "type": "sms.opted_out",
  "data": {
    "from": "+15005550006",
    "keyword": "STOP",
    "suppressed": true
  }
}

Opt-out is an inbound flow.

STOP, HELP, and START arrive the same way any reply does — as inbound messages on two-way numbers. Bird intercepts the reserved keywords and acts on them before they reach your application logic, so you get the suppression behavior for free and still see everything else your recipients send.

Opt-out FAQ

Do I have to handle STOP myself?+
No. Bird recognizes STOP on every send, suppresses the recipient, and blocks further messages to that number. You don't write or maintain any keyword logic.
What do STOP, HELP, and START each do?+
STOP suppresses the recipient and stops messages. HELP returns an automatic help response. START reverses a prior opt-out and resubscribes the recipient. Each is acted on per recipient.
Can a recipient who opted out come back?+
Yes. Opt-out is reversible. A recipient who texts START is removed from the suppression list and can receive messages again. The choice stays with the recipient.
How do I check if a number is suppressed?+
The suppression list is a queryable API resource. Look up a number before you build an audience so an opted-out recipient never re-enters a send.

Honor every opt-out without writing a handler.

Opt-out is one regime of SMS compliance on Bird. STOP, HELP, and START are enforced on every send, with a suppression list you can query from the same API.

Start with one channel.
Add the others when you're ready.

A test API key is yours immediately. Production unlocks when you add a payment method and verify a sender.

Using Claude Code, Cursor, or Codex? Copy a setup prompt and your agent installs the Bird CLI and skills for you. Pick yours:

Cursor