Envie email

Uma API para cada email que você envia.

Configure em:
Cursor

Transacional ou de marketing, uma mensagem ou cem, enviadas pela mesma Email API, com idempotência, supressão e webhooks integrados. Passe HTML bruto ou renderize seus templates React Email.

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

Envie o seu primeiro email em cinco minutos.

A partir da linguagem que você já usa.

O envio é o núcleo da Bird Email API. O seu primeiro envio pode ser para um endereço sandbox (delivered@messagebird.dev), permitindo testar toda a plataforma (envios, webhooks, supressão) antes de verificar um domínio.

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"

Cinco coisas que você não constrói sozinho.

O mesmo contrato em todos os canais da Bird.

  1. 01

    Transacional + marketing.

    O mesmo endpoint envia uma redefinição de senha ou uma campanha. Um campo category decide como a supressão e os cancelamentos de inscrição se aplicam.

  2. 02

    Templates do seu jeito.

    Envie HTML puro, renderize templates React Email para HTML na sua aplicação e envie o resultado, ou indique um template armazenado e deixe que seja renderizado por si. A sua toolchain, inalterada.

  3. 03

    Lote de até 100.

    Até 100 mensagens independentes por chamada, cada uma com seu próprio destinatário e variáveis, validadas como uma única unidade para que você nunca envie pela metade.

  4. 04

    Idempotente por contrato.

    Todo envio aceita uma chave de idempotência, então uma requisição repetida após um timeout retorna o resultado original em vez de enviar em duplicidade.

  5. 05

    Um webhook a cada mudança de estado.

    Aceito, entregue, aberto, clicado, devolvido, marcado como spam. Cada um assinado com HMAC, protegido contra replay, idempotente, o mesmo envelope em todos os canais.

Já envia em outro lugar? Mude em uma tarde.

A chamada que você já faz quase não muda: troque o cliente, mantenha seus templates, aponte seus webhooks para um único endpoint. Os guias de migração cobrem SendGrid, Amazon SES, Mailgun e 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>",
});

Uma mensagem ou cem, uma chamada.

Agrupe até 100 mensagens independentes em uma requisição, cada uma com seu próprio destinatário e variáveis. O lote é validado como uma unidade: uma mensagem inválida rejeita a chamada com um 422, então você nunca envia pela metade. Uma única chave de idempotência torna a requisição inteira segura para repetir.

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

Anexe seu próprio contexto a cada envio.

As tags são uma dimensão filtrável de primeira classe: segmente entrega e engajamento por campanha, template ou experimento na API de stats (até 20 por mensagem). Metadata é JSON arbitrário, até 2 KB, que circula intacto em cada leitura e webhook, então seus próprios IDs acompanham a mensagem.

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

Acompanhe cada mensagem por toda a sua vida útil.

Um envio retorna 202 imediatamente; o resultado chega como um webhook por destinatário. Verifique uma assinatura, faça switch no type: o mesmo envelope que você já trata para SMS, voz e 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, reclamações e cancelamentos de inscrição também atualizam sua lista de supressão automaticamente, então um endereço inválido nunca custa sua reputação duas vezes.

  • email.acceptedO envio foi aceite e está a ser preparado para entrega.
  • email.processedEm fila para o servidor de e-mail do destinatário.
  • email.deliveredO servidor de e-mail do destinatário aceitou a mensagem.
  • email.deferredTemporariamente recusado, e vamos tentar novamente.
  • email.bouncedFalha permanente: tipo de bounce e código SMTP no payload.
  • email.openedO destinatário abriu a mensagem. Pode ser acionado mais do que uma vez.
  • email.clickedO destinatário clicou num link rastreado.
  • email.complainedO destinatário denunciou a mensagem como spam.
  • email.unsubscribedO destinatário cancelou a subscrição através de um link de unsubscribe rastreado.

Teste cada resultado antes de entrar no ar.

No sandbox, o endereço do destinatário determina o resultado, sem depender do estado da sua conta. Envie para delivered@messagebird.dev para uma entrega limpa, ou para bounce@, softbounce@, deferred@, complaint@ e suppressed@ para acionar cada caminho de falha através do pipeline real e dos webhooks reais. Sem domínio para verificar, sem risco para a sua reputação. A produção é intencionalmente controlada: primeiro verifica um domínio, e um novo domínio ou IP dedicado passa por um processo de aquecimento antes de suportar o volume total.

Aprofunde-se na documentação.

Leia o guia de envio, conecte eventos de e-mail e webhooks, ou, se você está vindo de outro provedor, siga um guia de migração do SendGrid, SES, Mailgun ou Resend.

Cerca de 40% do e-mail comercial do mundo já roda na Bird.

E-mail transacional e de marketing em uma infraestrutura que operamos há uma década. O envio é uma das capacidades da Bird Email API: entregabilidade, IPs dedicados, supressão e analytics vêm junto.

Comece com um canal.
Adicione os outros quando estiver pronto.

Uma chave API de teste é sua imediatamente. A produção é desbloqueada quando você adiciona um método de pagamento e verifica um remetente.

Usa Claude Code, Cursor ou Codex? Copie um prompt de configuração e o seu agente instala o Bird CLI e as skills por si. Escolha o seu:

Cursor