Routing

The path from send to handset.

Set up in:
Cursor

Bird reaches 150+ countries over 240 direct-to-carrier connections. When a carrier path degrades, we reselect the route in real time, before the next message goes out. And every send returns a carrier delivery receipt, so you always know whether the handset got it.

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

The layer your send rides on.

Routing is the layer beneath the Bird SMS API. You call one endpoint with a from, a to, and a text; underneath, we resolve the recipient's carrier, pick a connection, and hand the message off. When a path goes bad, the route changes and your code does not.

What the routing layer decides for you.

Resolved per message, behind one API call.

  1. 01

    Direct-to-carrier connections.

    240 connections wire us straight into the mobile operators across 150+ countries. No reseller chain sitting between your send and the carrier's SMSC.

  2. 02

    Real-time route reselection.

    We watch delivery and latency on every path. When a carrier route starts to degrade, the next message takes a healthier connection to the same operator. Failover happens before you notice.

  3. 03

    MNP lookup before send.

    We resolve the recipient's current carrier on every send, so a ported number routes to the operator that actually holds it instead of the one it was issued with.

  4. 04

    A delivery receipt for every message.

    The carrier's own DLR comes back as an sms.delivered or sms.failed webhook, carrying the network it landed on and how long it took. No guessing from your side.

  5. 05

    Least-cost or highest-quality, per route.

    Routing weighs cost against delivery quality for each destination. Transactional traffic favors the fastest, most reliable path; bulk traffic can lean toward least cost.

Why direct-to-carrier beats an aggregator chain.

A lot of SMS traffic passes through two or three resellers before it reaches an operator. Each hop adds a place for the message to stall, for the price to climb, and for the delivery receipt to get dropped or faked. A direct connection removes those middlemen: the message goes from Bird to the carrier, and the receipt comes back the same way. That is how about 40% of the world's commercial SMS already runs through this network, with 95% of messages delivered in under 2.5 seconds.

The delivery receipt, straight from the carrier.

A send returns 202; the outcome arrives as a signed webhook carrying the carrier's DLR. The payload tells you the network it landed on, the destination country, and the round-trip latency.

POST /webhooks/bird
signed
{
  "type": "sms.delivered",
  "id":   "evt_7jR42x...",
  "created_at": "2026-05-19T15:42:01.221Z",
  "data": {
    "sms_id":     "sms_4kT01Lq2m",
    "from":       "Bird",
    "to":         "+15005550006",
    "mcc_mnc":    "310-260",
    "country":    "US",
    "latency_ms": 1284
  }
}

mcc_mnc identifies the exact mobile network that took the message; a value that differs from the number's home carrier is your signal that the recipient ported.

  • sms.deliveredCarrier confirmed the handset received the message (DLR).
  • sms.failedCarrier rejected or could not deliver — with the reason attached.

Routing leans on number intelligence.

The MNP lookup that picks the right carrier is the same number intelligence you can call on its own with Lookup — line type, current operator, and portability before you send. Once a message is on the wire, wire up webhooks for the delivery receipt and read the error reference to handle each failure code, or check the deliverability guide for what the receipts tell you.

SMS routing FAQ

What does direct-to-carrier routing mean?+
Your message hands off straight to the mobile operator over one of our 240 direct connections, not through a chain of resellers. Fewer hops means fewer places for a message to stall or a delivery receipt to go missing.
What happens when a carrier route degrades?+
Bird reselects the route in real time. If a path starts dropping receipts or slowing down, the next message takes a healthier connection to the same operator, and the send you wrote never changes.
How do I know a message actually reached the handset?+
Every message returns a carrier delivery receipt as an sms.delivered or sms.failed webhook, carrying the mcc_mnc, country, and latency_ms. That is the operator's own confirmation, not an inference from our side.
Do you check the recipient's carrier before sending?+
Yes. We run an MNP lookup on every send to resolve the recipient's current operator, so a ported number routes to the carrier that actually holds it. For standalone number intelligence, see Lookup.
Can I choose least-cost over highest-quality routing?+
Routing balances cost and delivery quality per destination. Transactional traffic like one-time passcodes favors the highest-quality path; bulk traffic can lean toward least cost. The selection happens per message, behind the same API call.

Routing you never have to think about.

Coverage, carrier connectivity, failover, and delivery receipts are one capability of the Bird SMS API, on infrastructure we've run for a decade.

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