Kirim SMS

Satu API untuk setiap teks yang Anda kirim.

Siap dalam:
Cursor

Kirim satu pesan atau seratus melalui SMS API yang sama. SDK menghitung segment sebelum pengiriman, memilih GSM-7 atau Unicode untuk Anda, dan setiap pengiriman bersifat idempotent dengan webhook pada setiap status pengiriman.

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

Kirim SMS pertama Anda dalam lima menit.

Dari bahasa yang sudah Anda gunakan.

Pengiriman adalah inti dari Bird SMS API. Pengiriman pertama menuju penerima uji resmi (+15005550006), sehingga Anda bisa merilis cek CI dan memasang webhook sebelum memprovisikan nomor.

1
2
3
4
5
6
7
8
9
import { BirdClient } from "@messagebird/sdk";

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

const { data, error } = await bird.sms.send({
  from: "Bird",
  to:   "+15005550006",
  text: "Hello from Node.",
}).safe();

Lima hal yang tidak Anda bangun sendiri.

Kontrak yang sama di setiap channel Bird.

  1. 01

    Penghitungan segment sebelum pengiriman.

    SDK mengukur panjang yang dienkode dan memberitahu Anda berapa segment yang dibebankan sebuah pesan, sehingga sebuah karakter nyasar tidak pernah diam-diam memecah satu teks menjadi tiga.

  2. 02

    GSM-7 dan Unicode, diputuskan untuk Anda.

    Teks biasa menumpang GSM-7; sebuah emoji atau aksara non-Latin membalik seluruh pesan ke UCS-2. Bird memilih encoding dan memperingatkan Anda saat satu karakter mengubah biayanya.

  3. 03

    Batch dalam satu panggilan.

    Kirim banyak pesan independen dalam satu request, masing-masing dengan penerima dan text-nya sendiri, tervalidasi sebagai satu kesatuan sehingga Anda tidak pernah setengah-mengirim.

  4. 04

    Idempotent berdasarkan kontrak.

    Setiap pengiriman menerima idempotency key, sehingga request yang diulang setelah timeout mengembalikan hasil aslinya alih-alih mengirim teks ke seseorang dua kali.

  5. 05

    Webhook pada setiap perubahan status.

    Queued, sent, delivered, failed. Masing-masing bertanda HMAC, terlindungi replay, idempotent, amplop yang sama di setiap channel.

Sudah mengirim di tempat lain? Ganti client-nya, pertahankan panggilannya.

Bentuknya nyaris tidak berubah: tukar client, pertahankan from, to, dan text Anda, arahkan webhook Anda ke satu endpoint. Model auth yang sama dengan pengiriman email, voice, dan WhatsApp Anda.

twilio.ts
Twilio
import twilio from "twilio";

const client = twilio(accountSid, authToken);

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

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

await bird.sms.send({
  from: "Bird",
  to:   "+15005550006",
  text: "Your code is 123456.",
});

Ketahui biaya sebelum operator mengetahuinya.

Pesan GSM-7 muat 160 karakter per segment; satu emoji atau karakter non-Latin membalik seluruh pesan ke UCS-2 dan menurunkannya menjadi 70. SDK melaporkan encoding dan jumlah segment pada setiap pengiriman, sehingga penagihan tidak pernah mengejutkan dan pesan yang digabungkan selalu pilihan yang disengaja.

segments.ts
200 · 1 segment
const { data } = await bird.sms.send({
  from: "Bird",
  to:   "+15005550006",
  text: "Your code is 123456.",
}).safe();

console.log(data.encoding); // → "GSM-7"
console.log(data.segments); // → 1

Satu pesan atau seratus, satu panggilan.

Batch pesan independen dalam satu request, masing-masing dengan penerima dan text-nya sendiri. Batch tervalidasi sebagai satu kesatuan: satu nomor buruk menolak panggilan dengan 422, sehingga Anda tidak pernah setengah-mengirim. Satu idempotency key membuat seluruh request aman untuk diulang.

reminders.ts
202 · batch
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`);

Pantau setiap pesan sepanjang hidupnya.

Sebuah pengiriman mengembalikan 202 segera; hasilnya datang sebagai webhook. Verifikasi satu tanda tangan, branch pada type-nya: amplop yang sama yang sudah Anda tangani untuk email, voice, dan WhatsApp.

app/api/webhooks/bird/route.ts
signed
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.reason);
      break;
  }

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

Pengiriman yang gagal dan balasan STOP memperbarui daftar supresi Anda secara otomatis, sehingga nomor buruk tidak pernah membebani Anda dua kali.

  • sms.queuedDiterima API dan diantrekan untuk diserahkan ke operator.
  • sms.sentDikirimkan ke SMSC operator tujuan.
  • sms.deliveredDelivery receipt diterima dari operator (DLR).
  • sms.failedKegagalan permanen — penolakan operator, nomor tidak valid, atau terkena supresi.

Pelajari lebih dalam di dokumentasi.

Pasang webhook, buat setiap pengiriman aman untuk diulang dengan idempotency key, dan baca referensi error agar Anda menangani setiap kegagalan dengan cara yang tepat.

FAQ pengiriman SMS

Seberapa panjang sebuah SMS bisa?+
Pesan GSM-7 muat 160 karakter per segment; beralih ke Unicode (UCS-2) untuk emoji atau aksara non-Latin menurunkannya menjadi 70. Pesan yang lebih panjang digabungkan lintas segment, dan SDK melaporkan jumlahnya sebelum Anda mengirim.
Bisakah saya mengirim ke banyak penerima dalam satu request?+
Ya. Batch pesan independen dalam satu panggilan, masing-masing dengan penerima dan text-nya sendiri. Batch tervalidasi sebagai satu kesatuan, dan satu idempotency key mencakup seluruh request.
Apa yang terjadi jika saya mengulang pengiriman setelah timeout?+
Berikan idempotency key dan request yang diulang mengembalikan hasil aslinya alih-alih mengirim dua kali. Tanpanya, pengulangan diperlakukan sebagai pesan baru.
Bagaimana saya tahu apakah sebuah pesan terkirim?+
Setiap perubahan status memicu webhook bertanda HMAC — queued, sent, delivered, atau failed — membawa delivery receipt operator dan jumlah segment.

Sekitar 40% SMS komersial dunia sudah berjalan di Bird.

Pengiriman adalah salah satu kemampuan Bird SMS API: nomor, inbound dua arah, kepatuhan, routing, dan analitik hadir bersamanya, di atas infrastruktur yang telah kami jalankan selama satu dekade.

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.

Menggunakan Claude Code, Cursor, atau Codex? Salin prompt pengaturan dan agen Anda akan menginstal Bird CLI dan skill untuk Anda. Pilih milik Anda:

Cursor