Channels

Email, SMS, voice, and WhatsApp each have features the others don't — even though the API shape is the same. This page is about the differences. For the shared request/response shape, see send a message.

Email

Bird Email runs on the infrastructure that carries roughly 40% of global commercial email volume. The features that are specific to email:

  • React Email server-rendered in the SDK — pass a component directly as react:
  • BIMI logo signing alongside DKIM, SPF, and DMARC
  • Public share link for any sent email, valid for 48h
  • Batch send up to 500 distinct recipients per request, returning per-recipient IDs
  • Inbound parsing with HMAC-signed webhooks per recipient address
  • Managed dedicated IPs, automatically warmed against ISP reputation
  • Dynamic suppression list — bounces and complaints suppress the recipient on the next send
import { WelcomeEmail } from "./emails/welcome"

const { data, error } = await bird.email.send({
  to:    ["delivered@bird.dev"],
  from:  "Bird <hello@bird.dev>",
  subject: "Your invite is ready, Ada",
  react: <WelcomeEmail name="Ada" />,
})

react: is rendered inside the SDK to MIME-safe HTML + plain-text fallback before the request leaves your process. No build step, no separate render service.

SMS

Bird SMS routes through 240 direct-to-carrier connections in 150+ countries. The features that are specific to SMS:

  • A2P 10DLC registration handled in-dashboard for US routes
  • MNP (mobile number portability) lookup before send, automatically
  • Sender ID flexibility — long codes, short codes, toll-free, alphanumeric, sender pools
  • Two-way inbound — every reply is a sms.inbound webhook with the original message ID
  • Per-recipient opt-out (STOP / HELP) tracked by the platform across sends
  • Segment counting and Unicode handling baked into the SDK so you can see cost before send
// Outbound
const { data, error } = await bird.sms.send({
  to: "+15005550006",
  from: "+18885550101",
  text: "Your code is 482917. Reply STOP to opt out.",
});

// Inbound — your `sms.inbound` webhook handler
export async function POST(req: Request) {
  const { data: event, error: verifyError } = await bird.webhooks.verify(req);
  if (verifyError) return new Response(verifyError.message, { status: 400 });

  if (event.type === "sms.inbound") {
    const { from, text, in_reply_to } = event.data;
    // `in_reply_to` is the sms_* ID of the original outbound message
    await handleReply({ from, text, in_reply_to });
  }
  return new Response("ok");
}

Voice

Bird Voice is programmable call control in JSON — declarative flows, recording, transcription, streaming TTS, optional SIP termination. The features that are specific to voice:

  • Declarative call flows — say, play, gather, record, transfer, dial
  • Recording with automatic transcription in 40+ languages
  • Streaming TTS — sub-250ms first-byte audio over HTTP chunked or WebSocket
  • SIP termination — bring your own carrier or terminate to your PBX
  • Masked calls — caller and callee numbers never exposed to each other
  • Per-call events as webhooks (call.ringing, call.answered, call.completed)
const { data, error } = await bird.voice.calls.create({
  to: "+15005550010",
  from: "+18885550101",
  flow: [
    { say: "Hello. Please enter your account number, followed by the pound sign." },
    { gather: { digits: { min: 6, max: 12, terminator: "#" }, into: "account" } },
    { dial: "+18885550199", record: true, transcribe: true },
  ],
});

The same flow array works for inbound calls — point your inbound number at a flow URL and Bird fetches it per event.

WhatsApp

Bird is an official Meta Business Solution Provider. The features that are specific to WhatsApp:

  • Template approval — submit, track approval state, get a webhook on Meta's decision
  • Session-window awareness — the SDK surfaces whether free-form or template is allowed
  • Interactive messages — buttons, lists, flows, product cards
  • Click-to-WhatsApp Ads integration with Meta Ads Manager
  • Media — images, video, documents, location, contacts; rich link previews; reactions
  • Cross-channel fallback — if a WhatsApp send fails on session expiry, fall back to SMS in the same request
const { data, error } = await bird.whatsapp.send({
  to: "+15005550009",
  from: "+18885550101",
  template: "order_confirmed",
  variables: { name: "Ada", order_id: "A-2491", eta: "today, 4pm" },
  fallback: "sms",
});

fallback: "sms" re-routes the same message body to SMS when the WhatsApp send returns 424 session_window_expired or the template is unavailable in the recipient's locale. One request, two channels, one response.

Same shape on every channel

If you've integrated one Bird channel, the other three feel the same. Compare an email send and an SMS send side-by-side:

// Email
const { data, error } = await bird.email.send({
  to: ["delivered@bird.dev"],
  from: "Bird <hello@bird.dev>",
  subject: "Your code is 482917",
  text: "Your code is 482917. Don't share it.",
});
// SMS
const { data, error } = await bird.sms.send({
  to: "+15005550006",
  from: "+18885550101",
  text: "Your code is 482917. Don't share it.",
});

Same auth, same idempotency, same error envelope, same webhook shape. Adding a channel to a flow that already uses Bird is one new method call against the same client — same key, same error handling, same webhook handler.

Mulai dengan satu channel.
Tambahkan yang lain saat Anda siap.

API key uji coba langsung tersedia untuk Anda. Akses produksi terbuka setelah Anda menambahkan metode pembayaran dan memverifikasi pengirim.

Mulai sekarangBaca dokumentasiatau

Menggunakan Claude Code, Cursor, atau Codex? Arahkan ke MCP server kami — 141 tools, satu per API endpoint, dengan scoped agent keys.