E-mail verzenden

Één API voor elke e-mail die je verstuurt.

Aan de slag in:
Cursor

Transactioneel of marketing, één bericht of honderd, verstuurd via dezelfde Email API, met idempotency, suppressie en webhooks ingebouwd. Geef ruwe HTML door of render je 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..."

Verstuur je eerste e-mail in vijf minuten.

Vanuit de taal die je al gebruikt.

Verzenden is de kern van de Bird Email API. Uw eerste verzending kan naar een sandbox-adres gaan (delivered@messagebird.dev), zodat u het hele platform kunt testen (verzendingen, webhooks, onderdrukking) voordat u een domein verifieert.

1
2
3
4
5
6
7
const msg = await bird.email.send({
  from: { email: "onboarding@messagebird.dev", name: "Bird" },
  to: ["delivered@messagebird.dev"],
  subject: "Hello from Bird",
  html: "<p>My first Bird email.</p>",
});
console.log(msg.id, msg.status); // "em_…", "accepted"

Vijf dingen die je niet zelf bouwt.

Hetzelfde contract op elk Bird-kanaal.

  1. 01

    Transactioneel + marketing.

    Hetzelfde endpoint verstuurt een wachtwoordherstel of een campagne. Een category-veld bepaalt hoe suppressie en unsubscribes worden toegepast.

  2. 02

    Templates op jouw manier.

    Geef ruwe HTML mee, render React Email-templates naar HTML in uw app en verstuur het resultaat, of geef een opgeslagen template op en laat deze voor u renderen. Uw toolchain, ongewijzigd.

  3. 03

    Batch tot 100.

    Tot 100 onafhankelijke berichten per aanroep, elk met een eigen ontvanger en variabelen, als één geheel gevalideerd zodat je nooit half verstuurt.

  4. 04

    Idempotent per contract.

    Elke send accepteert een idempotency-key, zodat een opnieuw geprobeerd verzoek na een time-out het oorspronkelijke resultaat teruggeeft in plaats van dubbel te versturen.

  5. 05

    Een webhook bij elke statuswijziging.

    Accepted, delivered, opened, clicked, bounced, complained. Elk HMAC-ondertekend, replay-beveiligd, idempotent, dezelfde envelope op elk kanaal.

Verstuur je al ergens anders? Schakel over in een middag.

De call die je al doet verandert nauwelijks: wissel de client, behoud je templates, richt je webhooks op één endpoint. De migratiegidsen behandelen SendGrid, Amazon SES, Mailgun en Resend.

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

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

await sgMail.send({
  from:    "hello@yourdomain.com",
  to:      "delivered@messagebird.dev",
  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@yourdomain.com",
  to:      ["delivered@messagebird.dev"],
  subject: "Your invite is ready",
  html:    "<p>Welcome aboard, Ada.</p>",
});

Eén bericht of honderd, één call.

Batch tot 100 onafhankelijke berichten in één request, elk met een eigen ontvanger en variabelen. De batch valideert als één geheel: één fout bericht laat de call afketsen met een 422, zodat je nooit half verstuurt. Eén idempotency key maakt het hele request veilig om opnieuw te proberen.

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:    "Acme <hello@yourdomain.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`);

Voeg je eigen context toe aan elke send.

Tags zijn een eersteklas, filterbare dimensie: splits levering en engagement uit per campagne, template of experiment in de stats-API (tot 20 per bericht). Metadata is willekeurige JSON, tot 2 KB, die ongewijzigd terugkomt bij elke read en webhook, zodat je eigen ID's met het bericht meereizen.

tagged.ts
await bird.email.send({
  from:     "Acme <hello@yourdomain.com>",
  to:       ["delivered@messagebird.dev"],
  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" },
});

Volg elk bericht gedurende zijn hele levensloop.

Een send geeft direct 202 terug; de uitkomst komt binnen als een webhook per ontvanger. Verifieer één signature, switch op de type: dezelfde envelope die je al verwerkt voor SMS, voice en 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 bounces, complaints en unsubscribes werken ook automatisch je suppressielijst bij, zodat een slecht adres je reputatie nooit twee keer kost.

  • email.acceptedDe verzending is geaccepteerd en wordt voorbereid voor aflevering.
  • email.processedIn de wachtrij voor de mailserver van de ontvanger.
  • email.deliveredDe mailserver van de ontvanger heeft het bericht geaccepteerd.
  • email.deferredTijdelijk geweigerd, we proberen het opnieuw.
  • email.bouncedPermanent mislukt: bouncetype en SMTP-code in de payload.
  • email.openedDe ontvanger heeft het bericht geopend. Kan meer dan één keer worden geactiveerd.
  • email.clickedDe ontvanger heeft op een getrackte link geklikt.
  • email.complainedDe ontvanger heeft het bericht als spam gemeld.
  • email.unsubscribedDe ontvanger heeft zich afgemeld via een getrackte uitschrijflink.

Test elke uitkomst voordat je live gaat.

In de sandbox bepaalt het adres van de ontvanger het resultaat, zodat uw accountstatus dat niet hoeft te doen. Verstuur naar delivered@messagebird.dev voor een schone aflevering, of naar bounce@, softbounce@, deferred@, complaint@ en suppressed@ om elk faalpad door de echte pipeline en de echte webhooks te sturen. Geen domein om te verifiëren, geen risico voor uw reputatie. Productie is bewust afgeschermd: u verifieert eerst een domein, en een nieuw domein of dedicated IP doorloopt een opwarmperiode voordat het volledig volume draagt.

Verdiep je in de documentatie.

Lees de verzendgids, koppel e-mailevents en webhooks, of, als je van een andere provider komt, volg een migratiegids van SendGrid, SES, Mailgun of Resend.

Ongeveer 40% van de commerciële e-mail wereldwijd draait al op Bird.

Transactionele en marketing-e-mail op infrastructuur die we al tien jaar draaien. Verzenden is één van de mogelijkheden van de Bird Email API: deliverability, dedicated IP's, suppressie en analytics horen er standaard bij.

Begin met één kanaal.
Voeg de rest toe wanneer je er klaar voor bent.

Een test-API-key is direct beschikbaar. Productietoegang wordt ontgrendeld zodra je een betaalmethode toevoegt en een afzender verifieert.

Gebruik je Claude Code, Cursor of Codex? Kopieer een setup-prompt en je agent installeert de Bird CLI en skills voor je. Kies de jouwe:

Cursor