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.
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..."You can sign in any time at bird.com/login.
Your test API key is on your dashboard, ready to send.
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.
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.
- 01
Transaksional + marketing.
Endpoint yang sama mengirim reset kata sandi maupun campaign. Field category menentukan bagaimana supresi dan unsubscribe diterapkan.
- 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.
- 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.
- 04
Idempoten secara kontrak.
Setiap pengiriman menerima sebuah idempotency key, sehingga permintaan yang diulang setelah kehabisan waktu mengembalikan hasil asli alih-alih mengirim ganda.
- 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.
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>",
});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.
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.
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.
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?+
Apakah Anda mendukung template React Email?+
Berapa banyak email yang bisa saya kirim dalam satu permintaan?+
Apa yang terjadi jika sebuah permintaan kehabisan waktu dan saya mengulanginya?+
Berapa batas lajunya?+
Bagaimana cara menguji tanpa mengirim email sungguhan?+
Bagian lain dari platform Email
Satu API, satu set kunci. Jelajahi kapabilitas lainnya.
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.