Transaktional oder Marketing, eine Nachricht oder hundert, über dieselbe Email API versendet, mit Idempotenz, Suppression und Webhooks von Haus aus. Übergib rohes HTML oder rendere deine React-Email-Templates.
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.
Versende deine erste E-Mail in fünf Minuten.
In der Sprache, die du schon nutzt.
Der Versand ist das Herzstück der Bird Email API. Der erste Versand kann an eine freigegebene Testadresse gehen (delivered@messagebird.dev), sodass du die ganze Plattform ausprobieren kannst (Versände, Webhooks, Suppression), bevor du eine Domain verifizierst.
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();Fünf Dinge, die du nicht selbst baust.
Derselbe Vertrag auf jedem Bird-Kanal.
- 01
Transaktional + Marketing.
Derselbe Endpoint sendet einen Passwort-Reset oder eine Kampagne. Ein Feld category bestimmt, wie Suppression und Abmeldungen angewendet werden.
- 02
Templates nach deiner Wahl.
Übergib rohes HTML oder rendere React-Email-Templates in deiner App zu HTML und sende das Ergebnis. Dein Toolchain, unverändert.
- 03
Batch bis zu 100.
Bis zu 100 unabhängige Nachrichten pro Call, jede mit eigenem Empfänger und eigenen Variablen, als eine Einheit validiert, damit du nie halb sendest.
- 04
Idempotent per Vertrag.
Jeder Versand akzeptiert einen Idempotency-Key, sodass ein nach einem Timeout wiederholter Request das ursprüngliche Ergebnis zurückgibt, statt doppelt zu senden.
- 05
Ein Webhook bei jeder Statusänderung.
Accepted, delivered, opened, clicked, bounced, complained. Jeder einzelne HMAC-signiert, replay-geschützt, idempotent, derselbe Envelope auf jedem Kanal.
Sendest du schon woanders? Wechsle an einem Nachmittag.
Der Call, den du ohnehin schon machst, ändert sich kaum: tausch den Client, behalte deine Templates, richte deine Webhooks auf einen Endpoint. Die Migrationsguides decken SendGrid, Amazon SES, Mailgun und Resend ab.
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>",
});Eine Nachricht oder hundert, ein Call.
Bündele bis zu 100 unabhängige Nachrichten in einem Request, jede mit eigenem Empfänger und eigenen Variablen. Der Batch wird als Einheit validiert: eine fehlerhafte Nachricht lehnt den Call mit einem 422 ab, also sendest du nie halb. Ein einziger Idempotency-Key macht den gesamten Request sicher wiederholbar.
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`);Häng deinen eigenen Kontext an jeden Versand.
Tags sind eine erstklassige, filterbare Dimension: schlüssele Zustellung und Engagement nach Kampagne, Template oder Experiment in der Stats-API auf (bis zu 20 pro Nachricht). Metadata ist beliebiges JSON, bis zu 2 KB, das bei jedem Read und Webhook unverändert mitläuft, sodass deine eigenen IDs an der Nachricht hängen bleiben.
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" },
});Verfolge jede Nachricht über ihren gesamten Lebenszyklus.
Ein Versand gibt sofort 202 zurück; das Ergebnis kommt als Webhook pro Empfänger. Verifiziere eine Signatur, verzweige über den type: derselbe Envelope, den du schon für SMS, Voice und WhatsApp verarbeitest.
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 Bounces, Beschwerden und Abmeldungen aktualisieren außerdem automatisch deine Suppression-Liste, sodass dich eine schlechte Adresse nie zweimal Reputation kostet.
email.acceptedVon der API akzeptiert und für die Zustellung eingereiht.email.processedErzeugt und an die Sende-Pipeline übergeben.email.deliveredDer empfangende Mailserver hat die Nachricht akzeptiert.email.deferredEin vorübergehender Fehler, den Bird automatisch wiederholt.email.bouncedDauerhafter Fehler: Bounce-Typ und SMTP-Code im Payload.email.openedTracking-Pixel geladen (nicht vorgeladene Öffnungen zählen).email.clickedEin getrackter Link wurde geklickt.email.complainedDer Empfänger hat die Nachricht als Spam gemeldet.email.unsubscribedDer Empfänger hat sich über einen getrackten Link im Nachrichtentext abgemeldet.
Teste jedes Ergebnis, bevor du live gehst.
In der Sandbox entscheidet die Adresse über das Ergebnis, nicht der Zustand deines Accounts. Sende an delivered@messagebird.dev für eine saubere Zustellung oder an bounce@, complaint@ und suppressed@, um jeden Fehlerpfad durch die echte Pipeline und die Webhooks zu treiben. Keine Domain zu verifizieren, kein Risiko für deine Reputation. Der Produktivversand ist so abgesichert, wie es sein sollte: du verifizierst zuerst eine Domain, und eine neue Domain oder dedizierte IP fährt über Reputations-Warmup hoch, bevor sie volles Volumen trägt.
Geh tiefer in die Docs.
Lies den Sende-Guide, verkabele E-Mail-Events und Webhooks oder, wenn du von einem anderen Anbieter kommst, folge einem Migrationsguide von SendGrid, SES, Mailgun oder Resend.
FAQ zum Versand
Kann ich sowohl transaktionale als auch Marketing-E-Mails versenden?+
Unterstützt ihr React-Email-Templates?+
Wie viele E-Mails kann ich in einem Request versenden?+
Was passiert, wenn ein Request abläuft und ich ihn wiederhole?+
Wie sind die Rate-Limits?+
Wie teste ich, ohne echte E-Mails zu versenden?+
Der Rest der E-Mail-Plattform
Eine API, ein Satz Keys. Entdecke die anderen Funktionen.
Rund 40 % der kommerziellen E-Mails weltweit laufen bereits über Bird.
Transaktionale und Marketing-E-Mails auf einer Infrastruktur, die wir seit einem Jahrzehnt betreiben. Der Versand ist eine Funktion der Bird Email API: Zustellbarkeit, dedizierte IPs, Suppression und Analytics kommen gleich mit.