E-Mails versenden

Eine API für jede E-Mail, die du sendest.

Eingerichtet in:

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.

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..."

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.

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();

Fünf Dinge, die du nicht selbst baust.

Derselbe Vertrag auf jedem Bird-Kanal.

  1. 01

    Transaktional + Marketing.

    Derselbe Endpoint sendet einen Passwort-Reset oder eine Kampagne. Ein Feld category bestimmt, wie Suppression und Abmeldungen angewendet werden.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

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>",
});

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.

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`);

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.

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" },
});

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.

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 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?+
Ja. Beide laufen über dieselbe Sende-API; der einzige Unterschied ist das Feld category, das bestimmt, wie Suppression und Abmeldungen angewendet werden. Wähle transactional für Passwort-Resets und Belege, marketing für Kampagnen.
Unterstützt ihr React-Email-Templates?+
Rendere deine React-Email-Templates in deiner Anwendung zu HTML — die render-Funktion aus @react-email/render funktioniert unverändert — und übergib das Ergebnis als HTML-Body. An deinem Template-Toolchain ändert sich nichts.
Wie viele E-Mails kann ich in einem Request versenden?+
Bis zu 100 unabhängige Nachrichten pro Batch-Call, jede mit eigenem Empfänger, Betreff und Variablen. Der Batch wird als Einheit validiert, also lehnt eine ungültige Nachricht den gesamten Call mit einem 422 ab — du sendest nie halb. Eine einzelne Nachricht erreicht 1–50 Empfänger über to, cc und bcc.
Was passiert, wenn ein Request abläuft und ich ihn wiederhole?+
Sende einen Idempotency-Key mit jedem logischen Versand. Wenn der ursprüngliche Request erfolgreich war, aber die Antwort verloren ging, gibt ein erneuter Versand mit demselben Key das ursprüngliche Ergebnis zurück (gekennzeichnet mit einem Idempotency-Replay-Header), statt erneut zu senden.
Wie sind die Rate-Limits?+
Einzelversände und Batches haben getrennte Limits — im kostenlosen Tarif 10 Einzelversände und 5 Batch-Calls pro Minute (5 × 100 = 500 Nachrichten/Min.), steigend auf 1.000 Versände und 100 Batch-Calls pro Minute bei Growth. Die Limits zählen Requests, nicht Empfänger, also ist Batching der Hebel für Volumen.
Wie teste ich, ohne echte E-Mails zu versenden?+
Sende an eine Sandbox-Adresse wie delivered@messagebird.dev — das Ergebnis bestimmt die Adresse, nicht der Zustand deines Accounts — sodass du Versände, Webhooks und Suppression ausprobieren kannst, bevor du eine Domain verifizierst. Adressen wie bounce@ und complaint@ simulieren diese Ergebnisse über die echte Pipeline.

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.

Starten Sie mit einem Kanal.
Fügen Sie die anderen hinzu, wenn Sie bereit sind.

Ein Test-API-Key steht Ihnen sofort zur Verfügung. Der Produktivzugang wird freigeschaltet, sobald Sie eine Zahlungsmethode hinzufügen und einen Absender verifizieren.

Sie nutzen Claude Code, Cursor oder Codex? Kopieren Sie einen Setup-Prompt und Ihr Agent installiert die Bird CLI und Skills für Sie. Wählen Sie Ihren: