The order is on its way.
A timely update answers the question before your customer has to ask it.
Transactional SMS ↗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.
GSM-7 · 62 units · 1 estimated segments
sms_example_fn1042
The illustrative request was accepted by Bird.
The illustrative message was handed to the carrier.
sms.delivered
Record the carrier receipt. It does not establish that Alex read the message, replied, or confirmed the booking.
Local illustration. No request is made.
Inspect the message outcome ↗Record the carrier receipt. It does not establish that Alex read the message, replied, or confirmed the booking.
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 monthsKeep the customer close to what is happening. From the first confirmation to the last delivery update, make every message earn its place.
A timely update answers the question before your customer has to ask it.
Transactional SMS ↗Bring the appointment or collection back into view. For sign-in codes and account recovery, use a verification flow.
Verification flows ↗Where your sender supports replies, bring the answer into the application or team that can help.
Two-way SMS ↗Create a workspace and server-side API key for its region.
Enable each country, then check sender registration and two-way support for the message category.
Use a sandbox recipient first. Then verify delivery and replies with an eligible production sender.
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/sdkconst 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 ↗
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.
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 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.
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`);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.
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 referenceMap request fields, sender registrations and event handling. Reconcile opt-outs and compare a controlled test before changing production routing.
import twilio from "twilio";
const client = twilio(accountSid, authToken);
await client.messages.create({
from: "+14155550172",
to: "+15005550006",
body: "Your code is 123456.",
});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",
});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.
Inspect delivery, a permanent failure, an incoming reply or a missing receipt. Keep the event and your next application decision together.
Illustrative outcome: Delivered
Follow your application outcome separately. A delivery receipt does not establish reading or confirm the studio booking.
{
"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.
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 ↗Map numbers, sender IDs, callbacks and consent before switching. Plan a measured rollout with representative traffic and a rollback path.
Plan the migration ↗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 ↗Outbound SMS · USD per segment
Carrier fees, number rental and registration are additional. These examples are destination rates, not a worldwide price.
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.
Alex Lee · Friday, 14:00Alex receives the full receipt for booking FN–1042.
The same booking becomes a timely reminder, with SMS permission.
A question continues as a conversation. Your app preserves the booking context.
A practical path through setup, implementation, and the choices that matter.
Read the field guide →Evaluate sender support, delivery visibility and the cost of your actual traffic.
Map requests, registrations, callbacks and opt-outs before changing production traffic.
See how Unicode, emoji and long messages affect SMS segments.
A library for first sends, country rollout, delivery diagnosis and migration.
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 ↗
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 ↗
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 ↗
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 ↗
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 ↗
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 ↗
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 ↗
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 ↗
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 ↗
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 ↗测试 API 密钥即刻可用。添加支付方式并验证发送者身份后,即可解锁生产环境。
阅读文档