Deliver transactional and marketing email from one API.

Send password resets, order receipts, and marketing campaigns from the same integration. Pass your own HTML, render React Email templates, or personalize stored templates at send time, with automatic bounce suppression, safe retries that prevent duplicate sends, and real-time delivery webhooks built in.

Already sending through SMTP?

Point your existing mailer or framework at Bird’s SMTP relay by swapping credentials without rewriting your application code. When your product also needs to route customer replies, support threads, or attachments back into your app, pair outbound sending with inbound email.

Send your first email in five minutes.

Test delivery before you configure DNS.

Build outbound email into your app with the Bird Email API using our SDKs, REST endpoint, CLI, or MCP. You can send your first test message to a built-in sandbox address right away, letting you verify webhook handling and bounce behavior in local development before you configure DNS records for your domain.

1
2
3
4
5
6
7
8
9
10
// Install the SDK
// npm install @messagebird/sdk

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"

Built-in safeguards for production email.

Ship reliable email delivery without building retry locks, bounce lists, or template pipelines from scratch.

  1. 01

    Separate transactional and marketing rules.

    Send password resets and promotional campaigns through one integration. Bird automatically enforces unsubscribe preferences on marketing mail and still delivers critical account alerts and receipts to your users.

  2. 02

    Templates, attachments, and scheduled sends.

    Render React Email components in your codebase, pass raw HTML directly, or populate stored templates with dynamic recipient data at send time. Attach PDFs or inline images and schedule future deliveries up to 30 days ahead without running your own cron queue.

  3. 03

    Atomic batch sending for up to 100 messages.

    Trigger up to 100 personalized emails in a single API call, each with its own recipient and template variables. Bird validates the entire batch upfront so a malformed entry rejects the request cleanly instead of leaving a partial send.

  4. 04

    Safe network retries without duplicate emails.

    Network timeouts happen in production. Attach a unique request key when your worker sends an email so automatic retries return the original send status instead of emailing your customer twice.

  5. 05

    Signed webhooks for real-time delivery tracking.

    Follow each message from server acceptance and inbox delivery to opens, link clicks, bounces, and spam complaints. Signed, replay-protected webhooks use the same event format across Bird Email, SMS, WhatsApp, and Voice.

Make the first request from your application.

Create an account and API key, then follow the sending guide with a test recipient.

Get Started

Migrate from your current email provider in an afternoon.

Keep your existing HTML or React Email templates and swap the send call in a few lines of code. Step-by-step migration guides walk you through moving domains, webhooks, and suppression lists from SendGrid, Amazon SES, Mailgun, and 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>",
});

Send up to 100 personalized emails in a single request.

Whether you are sending weekly product digests, billing reminders, or team notifications, you can batch up to 100 independent emails in one API call with per-recipient personalization. Bird validates the entire batch before accepting it, so an invalid message rejects the request cleanly instead of leaving a partial send that is hard to recover from.

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

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

Correlate deliveries with your own database records and campaigns.

Label emails with up to 20 tags to break down delivery, open, and bounce rates by feature, onboarding flow, or campaign. You can also attach up to 2 KB of custom metadata such as an order ID, invoice number, or user ID, which returns unchanged on API reads and webhook events so your backend can match status updates without maintaining a lookup table.

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

Track delivery, bounces, and engagement in real time.

Know when a customer’s mail server accepts an email, when a mailbox is temporarily full, or why an address bounced. Verify a single webhook signature and handle events using the same payload structure across Email, SMS, Voice, and 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 and spam complaints automatically add the recipient to your suppression list, and unsubscribes record an opt-out preference so future sends respect recipient choices automatically.

  • email.acceptedBird accepted your send request and queued the message for processing.
  • email.processedThe message is rendered and ready for handoff to the recipient’s mail server.
  • email.deliveredThe recipient’s mail server accepted the message for delivery.
  • email.deferredThe receiving server temporarily delayed acceptance; Bird automatically retries delivery.
  • email.bouncedDelivery failed permanently, with the bounce classification and diagnostic reason included.
  • email.openedThe recipient opened the email and loaded the tracking pixel.
  • email.clickedThe recipient clicked a tracked link in the email body.
  • email.complainedThe recipient marked the email as spam in their mailbox.
  • email.unsubscribedThe recipient opted out via a tracked unsubscribe link or header.

Test bounces, deferrals, and complaints safely before launch.

Use Bird’s built-in sandbox addresses to simulate successful deliveries, hard bounces, soft bounces, temporary deferrals, spam complaints, and suppressed recipients without emailing real customers or risking your sender reputation. Each test send runs through the real event pipeline and triggers signed webhooks to your local or staging server. When you are ready for production, verify your sending domain and let managed warmup ramp traffic safely.

Explore the developer guides.

Follow the email sending guide to send HTML, templates, and attachments from your backend, configure delivery events and webhooks to sync message status with your database, or use a provider migration guide to switch from SendGrid, Amazon SES, Mailgun, or Resend.

Build the workflows around outbound email.

Once your application can send its first email, you can schedule future deliveries up to 30 days ahead, cancel queued messages before they go out, attach files or inline images, and rehearse bounce handling in staging.

161%

Increase in email open rates reported in Zillow’s customer story.

Read the Zillow story

Built with Bird

When the right home appears, the email needs to arrive.

Zillow brought time-sensitive property alerts to Bird, with the capacity to handle sending surges and the analytics to understand engagement. Its team reported a 161% increase in open rates in the first month.

Planning a migration or a higher-volume send?

Contact Sales

Questions about sending email

Can I send both transactional and marketing email?
Yes, both go through the same send API. The only difference is the category field, which decides how suppressions and unsubscribes apply. Pick transactional for password resets and receipts, and marketing for campaigns.
What happens if a request times out and I retry it?
Send an Idempotency-Key header with each logical send. If the first request succeeded but you never saw the response, replaying it with the same key gives you the original result back with an Idempotency-Replay header, rather than sending the email twice.
Can I schedule a send for later?
Set scheduled_at to any time between 30 seconds and 30 days ahead. The send comes back accepted straight away and stays scheduled until it goes out, so you can cancel it at any point before then.
Can I attach files?
Yes, as base64 in the attachments array. To show an image inline, give it a content_id and reference that from your HTML with cid:. Keep the raw files at or below 15 MB so the message still fits the 20 MB cap once it is encoded, and note that executable and script content types are refused before the send.

Talk to our email team

Build your next email integration.

Talk through transactional messages, batch sends and delivery events. We’ll help you plan your integration, sending volume and migration.

Create your account, then create an API key and send a test message.

Your details
Products (optional)
Email

Privacy policy

Scale without losing control.

Separate production and sandbox traffic into dedicated workspaces, scope API keys to the exact channels each service or agent needs, and track permission changes in the audit log.

Start with Email.
Build across channels with Bird.

Start building with Bird in minutes.