Kirim email

Satu API untuk setiap email yang Anda kirim.

Siapkan dalam:

Transaksional atau marketing, satu pesan atau seratus, dikirim melalui Email API yang sama, dengan idempotensi, supresi, dan webhook yang sudah terpasang. Kirim HTML mentah atau render template React Email Anda.

welcome.tsx
200 · 1.2s
import { BirdClient } from "@messagebird/sdk";
import { render } from "@react-email/render";
import { WelcomeEmail } from "./emails/welcome";

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

const { data, error } = await bird.email.send({
  from:    "Bird <hello@bird.com>",
  to:      ["ada@example.com"],
  subject: "Your invite is ready",
  html:    await render(<WelcomeEmail name="Ada" />),
}).safe();

if (error) throw error;
console.log(data.id);
// → "em_2bX91Yk8h..."

Kirim email pertama Anda dalam lima menit.

Dari bahasa yang sudah Anda gunakan.

Pengiriman adalah inti dari Bird Email API. Pengiriman pertama bisa ditujukan ke alamat uji resmi (delivered@messagebird.dev), sehingga Anda bisa mencoba seluruh platform (pengiriman, webhook, supresi) sebelum memverifikasi domain.

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

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

const { data, error } = await bird.email.send({
  from:    "you@yourdomain.com",
  to:      ["delivered@bird.dev"],
  subject: "Hello from Node",
  html:    "<p>It works.</p>",
}).safe();

Lima hal yang tidak perlu Anda bangun sendiri.

Kontrak yang sama di setiap kanal Bird.

  1. 01

    Transaksional + marketing.

    Endpoint yang sama mengirim reset kata sandi maupun campaign. Field category menentukan bagaimana supresi dan unsubscribe diterapkan.

  2. 02

    Template sesuai cara Anda.

    Kirim HTML mentah, atau render template React Email menjadi HTML di aplikasi Anda dan kirim hasilnya. Toolchain Anda tetap sama.

  3. 03

    Batch hingga 100.

    Hingga 100 pesan independen per panggilan, masing-masing dengan recipient dan variabelnya sendiri, divalidasi sebagai satu kesatuan sehingga Anda tidak akan pernah mengirim setengah jalan.

  4. 04

    Idempoten secara kontrak.

    Setiap pengiriman menerima sebuah idempotency key, sehingga permintaan yang diulang setelah kehabisan waktu mengembalikan hasil asli alih-alih mengirim ganda.

  5. 05

    Webhook di setiap perubahan status.

    Accepted, delivered, opened, clicked, bounced, complained. Masing-masing ditandatangani HMAC, terlindungi dari replay, idempoten, dengan envelope yang sama di setiap channel.

Sudah mengirim di tempat lain? Beralih dalam satu sore.

Panggilan yang sudah Anda gunakan nyaris tidak berubah: ganti client, pertahankan template Anda, arahkan webhook ke satu endpoint. Panduan migrasi mencakup SendGrid, Amazon SES, Mailgun, dan Resend.

sendgrid.ts
SendGrid
import sgMail from "@sendgrid/mail";

sgMail.setApiKey(process.env.SENDGRID_API_KEY!);

await sgMail.send({
  from:    "hello@bird.com",
  to:      "ada@example.com",
  subject: "Your invite is ready",
  html:    "<p>Welcome aboard, Ada.</p>",
});
bird.ts
Bird
import { BirdClient } from "@messagebird/sdk";

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

await bird.email.send({
  from:    "hello@bird.com",
  to:      ["ada@example.com"],
  subject: "Your invite is ready",
  html:    "<p>Welcome aboard, Ada.</p>",
});

Satu pesan atau seratus, dalam satu panggilan.

Kirim hingga 100 pesan independen dalam satu request, masing-masing dengan recipient dan variabel sendiri. Batch divalidasi sebagai satu kesatuan: satu pesan yang buruk akan menolak panggilan dengan 422, jadi Anda tidak pernah mengirim sebagian. Satu idempotency key membuat seluruh request aman untuk diulang.

digest.ts
202 · batch
import { BirdClient } from "@messagebird/sdk";
import { render } from "@react-email/render";
import { Digest } from "./emails/digest";

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

const messages = await Promise.all(
  users.map(async (u) => ({
    from:    "Bird <hello@bird.com>",
    to:      [u.email],
    subject: "Your weekly digest",
    html:    await render(<Digest user={u} />),
  })),
);

const { data: batch, error } = await bird.email
  .sendBatch(messages, { idempotencyKey: `digest-${runId}` })
  .safe();

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

Lampirkan konteks Anda sendiri ke setiap pengiriman.

Tag adalah dimensi kelas satu yang dapat difilter: pilah delivery dan engagement berdasarkan campaign, template, atau eksperimen di stats API (hingga 20 per pesan). Metadata berupa JSON arbitrer, hingga 2 KB, yang dikembalikan utuh pada setiap pembacaan dan webhook, sehingga ID milik Anda sendiri ikut menyertai pesan.

tagged.ts
await bird.email.send({
  from:     "Bird <hello@bird.com>",
  to:       ["ada@example.com"],
  subject:  "Your invite is ready",
  html:     "<p>Welcome aboard, Ada.</p>",
  tags:     [{ name: "campaign", value: "spring-2026" }],
  metadata: { user_id: "u_2bX91", order_id: "ord_5512" },
});

Pantau setiap pesan sepanjang seluruh hidupnya.

Pengiriman langsung mengembalikan 202; hasilnya tiba sebagai webhook per recipient. Verifikasi satu signature, lakukan switch berdasarkan type: envelope yang sama yang sudah Anda tangani untuk SMS, 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 "email.delivered":
      await markDelivered(event.data.email_id);
      break;
    case "email.bounced":
      await flag(event.data.recipient, event.data.bounce_type);
      break;
  }

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

Hard bounce, complaint, dan unsubscribe juga otomatis memperbarui suppression list Anda, sehingga alamat yang buruk tidak pernah merugikan reputasi Anda dua kali.

  • email.acceptedDiterima oleh API dan diantrekan untuk pengiriman.
  • email.processedDibuat dan diserahkan ke pipeline pengiriman.
  • email.deliveredServer email penerima menerima pesan tersebut.
  • email.deferredKegagalan sementara yang otomatis diulang oleh Bird.
  • email.bouncedKegagalan permanen: tipe bounce dan kode SMTP ada di payload.
  • email.openedTracking pixel dimuat (open yang tidak diprafetch dihitung).
  • email.clickedSebuah link yang dilacak diklik.
  • email.complainedPenerima melaporkan pesan tersebut sebagai spam.
  • email.unsubscribedPenerima berhenti berlangganan melalui link yang dilacak di badan pesan.

Uji setiap hasil sebelum Anda go live.

Di sandbox, alamatlah yang menentukan hasil, bukan status akun Anda. Kirim ke delivered@messagebird.dev untuk delivery yang bersih, atau ke bounce@, complaint@, dan suppressed@ untuk menjalankan masing-masing jalur kegagalan melalui pipeline dan webhook yang sebenarnya. Tidak ada domain yang perlu diverifikasi, tidak ada risiko terhadap reputasi Anda. Pengiriman produksi dibatasi sebagaimana mestinya: Anda memverifikasi domain terlebih dahulu, dan domain atau dedicated IP baru akan ditingkatkan secara bertahap melalui reputation warmup sebelum membawa volume penuh.

Pelajari lebih dalam di dokumentasi.

Baca panduan pengiriman, hubungkan email event dan webhook, atau, jika Anda datang dari provider lain, ikuti panduan migrasi dari SendGrid, SES, Mailgun, atau Resend.

FAQ Pengiriman

Bisakah saya mengirim email transaksional sekaligus marketing?+
Ya. Keduanya melewati API pengiriman yang sama; satu-satunya perbedaan adalah field category, yang menentukan bagaimana suppression dan unsubscribe diterapkan. Pilih transactional untuk reset kata sandi dan tanda terima, marketing untuk kampanye.
Apakah Anda mendukung template React Email?+
Render template React Email Anda menjadi HTML di dalam aplikasi Anda — fungsi render dari @react-email/render bekerja tanpa perubahan — lalu kirimkan hasilnya sebagai html body. Tidak ada yang berubah dalam toolchain template Anda.
Berapa banyak email yang bisa saya kirim dalam satu permintaan?+
Hingga 100 pesan independen per panggilan batch, masing-masing dengan recipient, subject, dan variabelnya sendiri. Batch divalidasi sebagai satu kesatuan, sehingga satu pesan yang tidak valid menolak seluruh panggilan dengan 422 — Anda tidak akan pernah mengirim setengah jalan. Satu pesan menampung 1–50 penerima di seluruh to, cc, dan bcc.
Apa yang terjadi jika sebuah permintaan kehabisan waktu dan saya mengulanginya?+
Kirimkan Idempotency-Key dengan setiap pengiriman logis. Jika permintaan asli berhasil tetapi responsnya hilang, mengulang dengan kunci yang sama akan mengembalikan hasil asli (ditandai dengan header Idempotency-Replay) alih-alih mengirim ulang.
Berapa batas lajunya?+
Pengiriman tunggal dan batch memiliki batas yang terpisah — pada tier gratis, 10 pengiriman tunggal dan 5 panggilan batch per menit (5 × 100 = 500 pesan/menit), naik menjadi 1,000 pengiriman dan 100 panggilan batch per menit pada Growth. Batas menghitung permintaan, bukan penerima, jadi batching adalah pengungkit volume.
Bagaimana cara menguji tanpa mengirim email sungguhan?+
Kirim ke alamat sandbox seperti delivered@messagebird.dev — hasilnya ditentukan oleh alamat, bukan oleh status akun Anda — sehingga Anda dapat menguji pengiriman, webhook, dan suppression sebelum memverifikasi sebuah domain. Alamat seperti bounce@ dan complaint@ mensimulasikan hasil tersebut melalui pipeline yang sesungguhnya.

Sekitar 40% email komersial dunia sudah berjalan di Bird.

Email transaksional dan marketing di atas infrastruktur yang telah kami jalankan selama satu dekade. Pengiriman hanyalah satu kemampuan dari Bird Email API: deliverability, dedicated IP, supresi, dan analitik sudah disertakan.

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: