Bird
Bird

A world of possibilities.
One place to start.

BUILT FOR YOUR APPLICATION

SMS API.
Right on time.

Send updates and reminders, receive replies, and track delivery with the Bird SMS API. Build messaging into your application with a few lines of code.

BIRD / SMSIllustrative experience
Bird / SMS
FROM YOUR APPLICATION

A thoughtful reminder.

GSM-7 · 62 units · 1 estimated segment

To
Alex · +1 555 000 0142
Sender
Your supported number
12
f.Fieldnotes
Text Message • SMS
Yesterday 3:18 PM
You’re booked, Alex. Your studio visit is confirmed for Friday at 14:00. FN–1042.
Lovely. Looking forward to it!
Today 10:42 AM
Hi Alex, your studio visit is tomorrow at 14:00. See you soon!

Example content and data. Explore the workflow below; nothing is sent or changed in a live account.

Companies that trust Bird across their communications.

A real customer result30New countries for SMS in two months
Reported by Airwallex in its customer story on international SMS expansion.
Read Airwallex’s story
WHAT IT MEANS FOR YOUR CUSTOMER

A small message.
A much better day.

Keep the customer close to what is happening. From the first confirmation to the last delivery update, make every message earn its place.

01 / Keep them informed

The order is on its way.

A timely update answers the question before your customer has to ask it.

Transactional SMS ↗
02 / Make the next step easy

A reminder, with a reason.

Bring the appointment or collection back into view. For sign-in codes and account recovery, use a verification flow.

Verification flows ↗
03 / Keep the conversation going

A reply that reaches you.

Where your sender supports replies, bring the answer into the application or team that can help.

Two-way SMS ↗
READY WHEN YOU ARE

Start with a controlled test.

  1. 01Create your account ↗

    Create a workspace and server-side API key for its region.

  2. 02Check destination and sender ↗

    Enable each country, then check sender registration and two-way support for the message category.

  3. 03Send and follow ↗

    Use a sandbox recipient first. Then verify delivery and replies with an eligible production sender.

SMS API / FOR DEVELOPERS

From your code to their phone.

Use the REST API, an SDK or the CLI. Send one message, keep its ID and follow delivery through signed webhook events. Your API key stays on your server.

Send with bird sms send or the sms_send MCP tool, then inspect the message and its delivery events. Keep the message ID to reconcile an uncertain result.

npm install @messagebird/sdk
const msg = await bird.sms.send({
  from: "+15557654321",
  to: "+14155550100",
  text: "Your verification code is 123456.",
  category: "authentication",
});
console.log(msg.id, msg.status);

Use a key for your workspace region, enable the destination and prepare an eligible sender. Recipient +15005550006 simulates delivery. These sends use normal credentials, are billed and still require an eligible sender. Simulated SMS destinations ↗

Inspect segments, batches and signed events

Inspect the accepted encoding and segment count

GSM-7 capacity is 160 units for one segment or 153 per multipart segment; Unicode capacity is 70 or 67 UTF-16 units. GSM extensions and surrogate pairs can consume two units. Inspect the accepted response, then price the applicable carrier and destination separately.

segments.ts
const { data, error } = await bird.sms.send({
  from:     "Bird",
  to:       "+31612345678",
  text:     "Your code is 123456.",
  category: "authentication",
}).safe();
if (error) throw error;

console.log(data.segments);
// → { characters: 20, count: 1, encoding: "GSM_7BIT" }

Batch independent messages

Batch up to 100 messages. Invalid input rejects the request before enqueueing. After a 202 response, individual messages can succeed or fail separately. Use one idempotency key per logical request and reuse it for an identical retry within the documented retention window.

reminders.ts
const { data: batch, error } = await bird.sms
  .sendBatch(
    users.map((u) => ({
      from: "Bird",
      to:   u.phone,
      text: `Hi ${u.name}, your appointment is tomorrow at ${u.time}.`,
    })),
    { idempotencyKey: `reminders-${runId}` },
  )
  .safe();

if (error) throw error;
console.log(`queued ${batch.data.length} messages`);

Follow acceptance through the reported outcome

A 202 response records acceptance. Charging and carrier submission happen later and can still fail. Verify webhook signatures, deduplicate by webhook-id and use the event timestamp when events arrive out of order.

sms.accepted
Accepted by the API and queued for carrier handoff.
sms.sent
Submitted to the destination carrier.
sms.delivered
Carrier delivery receipt received.
sms.rejected
Refused during processing, before delivery was attempted.
sms.undelivered / sms.expired
The carrier reported non-delivery or stopped trying.
sms.failed
Terminal failure for this attempt; inspect the reason and timeline.
app/api/webhooks/bird/route.ts
import { bird } from "@/lib/bird";

export async function POST(req: Request) {
  const event = bird.webhooks.unwrap(
    await req.text(),
    Object.fromEntries(req.headers),
  );

  switch (event.type) {
    case "sms.delivered":
      await markDelivered(event.data.sms_id);
      break;
    case "sms.failed":
      await flag(event.data.to, event.data.error?.description);
      break;
  }

  return new Response(null, { status: 204 });
}

Supported STOP keywords and carrier opt-outs create suppressions. Other delivery failures do not automatically establish an opt-out.

Webhook verification · Idempotency and retry window · Error reference
Map an existing sending integration

Map request fields, sender registrations and event handling. Reconcile opt-outs and compare a controlled test before changing production routing.

twilio.ts
import twilio from "twilio";

const client = twilio(accountSid, authToken);

await client.messages.create({
  from: "+14155550172",
  to:   "+15005550006",
  body: "Your code is 123456.",
});
bird.ts
import { BirdClient } from "@messagebird/sdk";

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

await bird.sms.send({
  from:     "+14155550172",
  to:       "+15005550006",
  text:     "Your code is 123456.",
  category: "authentication",
});
Plan the migration ↗
SMS / INTERNATIONAL EXPANSION
AIRWALLEX / CUSTOMER STORY

Local requirements, with a path through.

Airwallex’s story describes how Bird helped its engineering team navigate country requirements, replacing lengthy forms and vendor back-and-forth with a shorter SMS onboarding process.

SMS deliverability
89.6% → 94.4%
Average country onboarding
About 7 days
Read Airwallex’s story ↗A reported customer result; outcomes vary.
SMS / TRY IT YOURSELF

Know what happened.
Know what to do next.

Inspect delivery, a permanent failure, an incoming reply or a missing receipt. Keep the event and your next application decision together.

Illustrative outcome: Delivered

MESSAGE / sms_example_fn1042
  1. 01
    AcceptedExample accepted by Bird.
  2. 02
    SentExample handed to the carrier.
  3. 03
    DeliveredRead the event and the next application step.
Message & customer context
Alex LeeFN–1042 · Tomorrow, 14:00Same customer. Same booking. One message ID.

Hi Alex, your studio visit is tomorrow at 14:00. See you soon!

EVENT / YOUR APPLICATION
sms.delivered

Follow your application outcome separately. A delivery receipt does not establish reading or confirm the studio booking.

Inspect the example event payload
{
  "type": "sms.delivered",
  "timestamp": "2026-09-18T10:42:00Z",
  "data": {
    "sms_id": "sms_example_fn1042",
    "workspace_id": "ws_example",
    "from": "+15550001042",
    "to": "+15550000142",
    "metadata": {
      "booking": "FN–1042"
    },
    "tags": null,
    "cost": null
  }
}

Interactive illustration. Fictional customer and results. No messages are sent.

Segment counts in the composer are estimates. Bird calculates billable segments when accepting a real send; sender, destination and account requirements still apply.

READY FOR PRODUCTION

A clear path into your next market.

SENDER & COUNTRY READINESS

Build around the destinations you serve.

Start with the countries you serve. Check the destination allowlist, sender type, registration, reply support, and message category before following delivery events.

Check country requirements ↗
MIGRATION & SCALE

Keep the customer journey intact.

Map numbers, sender IDs, callbacks and consent before switching. Plan a measured rollout with representative traffic and a rollback path.

Plan the migration ↗
The details behind your setup

Choose the destination first.

Enable each country in your workspace allowlist, then check sender type, registration, reply support, and message category there. A US application long code follows 10DLC; an alphanumeric sender cannot receive replies.

Count segments, not just messages.

GSM-7 extension characters use two units; Unicode and multipart headers reduce capacity. The local composer estimates segments only. Bird rejects more than 12 segments; check current destination rates and carrier fees separately.

Keep consent and opt-outs connected.

Supported STOP keywords create sender-and-subscriber suppressions. Keep consent records, marketing permissions and suppression handling in your application’s sending flow.

Opt-outs and keyword handling ↗
SMS / PRICING

The right reach.
A clear cost.

Pay for the segments you send. Compare the destination and sender you need, then include carrier fees, number rental and registration in your rollout budget.

See SMS rates ↗
PUBLISHED PAY-AS-YOU-GO RATES

Start with your destination.

Outbound SMS · USD per segment

United StatesLong code
$0.0035
United KingdomAlphanumeric
$0.050
NetherlandsAlphanumeric
$0.085

Carrier fees, number rental and registration are additional. These examples are destination rates, not a worldwide price.

THE COMPLETE BIRD PLATFORM

One booking. Keep the context.

Send the detailed receipt by email, the timely update by SMS, and handle a question on WhatsApp. Your application connects the steps around the same customer.

12
f.Fieldnotes
Today · 9:41
Your studio visit is tomorrow at 14:00. Booking FN–1042.
Thank you. See you there!
02

SMS This step

The same booking becomes a timely reminder, with SMS permission.

A FEW USEFUL ANSWERS

SMS API,
answered.

What is an SMS API?

An SMS API lets your application send text messages, receive replies on supported numbers and read delivery events. Use it for order updates, reminders or service conversations. Bird also offers campaign tools when your team needs to manage an audience and schedule a broadcast. Explore SMS campaigns ↗

Can I test the API before sending to a real phone?

Yes. Simulated recipients produce documented delivery, failure and opt-out outcomes. They use your normal API credentials and are billed. Destination enablement and sender validation still apply. A simulation does not establish real carrier performance or handset delivery. Use simulated SMS destinations ↗

How much does the SMS API cost?

Outbound SMS is priced per segment, with rates depending on destination and sender type. Include applicable carrier fees, number rental and registration. A long message or an emoji can change the segment count. Check your actual markets and traffic mix when comparing providers. See current SMS pricing ↗

Which countries and sender types can I use?

Check the country reference for supported sender types, registration, message categories and reply support. Enable the destination in your workspace before sending. US application long codes follow A2P 10DLC registration; an alphanumeric sender ID cannot receive replies. Check country requirements ↗

Can customers reply to my SMS?

Yes, with a supported two-way number in an eligible destination. Bird emits sms.received with the incoming message. Match the sender to your customer and route the reply into your application. An inbound reply is a separate message with its own ID. Build a two-way SMS flow ↗

Does delivered mean the customer read the message?

A delivery event reports a carrier receipt. It does not establish reading or completion of an action in your app. If no final receipt arrives, keep the outcome pending and inspect the message log before applying your retry policy. Read the delivery event contract ↗

Can I send SMS in bulk?

The batch endpoint accepts up to 100 independent messages per request. After acceptance, each message can succeed or fail separately. For an audience campaign, use the broadcast tools. Consent, sender requirements and opt-outs apply to the messages you send. Read batch sending ↗

How are STOP replies and opt-outs handled?

Supported stop keywords record a sender-and-subscriber suppression and still emit an incoming-message event. Keep those signals connected to your consent records and sending flow. A delivery failure alone does not establish an opt-out. Read opt-outs and keyword rules ↗

Can Bird support an enterprise rollout or migration?

Work with sales on your destinations, sender registrations, volumes and rollout plan. Review security, data handling and the support terms for your agreement. Confirm any throughput or service commitments for your specific setup before launch. Review security and trust ↗

YOUR NEXT CONNECTION

Your first message.
Your next market.

Start building with your API key. For a production rollout, bring your destinations, sender types and volumes to our team.

Find SMS setup and delivery guides ↗

Starten Sie mit einem Kanal.
Fügen Sie die anderen hinzu, wenn Sie bereit sind.

Ein Test-API-Key steht Ihnen sofort zur Verfügung. Der Produktivzugang wird freigeschaltet, sobald Sie eine Zahlungsmethode hinzufügen und einen Absender verifizieren.

Dokumentation lesen
Sie nutzen Claude Code, Cursor oder Codex? Kopieren Sie einen Setup-Prompt und Ihr Agent installiert die Bird CLI und Skills für Sie. Wählen Sie Ihren:
Cursor