Invio email

Un'unica API per ogni email che invii.

Configura in:
Cursor

Transazionale o di marketing, un solo messaggio o un centinaio, inviati attraverso la stessa Email API, con idempotenza, soppressione e webhook integrati. Passa HTML grezzo o renderizza i tuoi template 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..."

Invia la tua prima email in cinque minuti.

Dal linguaggio che già usi.

L'invio è il cuore della Bird Email API. Il tuo primo invio può essere indirizzato a un indirizzo sandbox (delivered@messagebird.dev), così puoi testare l'intera piattaforma (invii, webhook, soppressione) prima di verificare un dominio.

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"

Cinque cose che non devi costruire tu.

Lo stesso contratto su ogni canale Bird.

  1. 01

    Transazionale e marketing.

    Lo stesso endpoint invia un reset della password o una campagna. Un campo category determina come si applicano soppressione e disiscrizioni.

  2. 02

    Template a modo tuo.

    Passa HTML grezzo, esegui il rendering dei template React Email in HTML nella tua app e invia il risultato, oppure specifica un template salvato e lascia che venga renderizzato per te. La tua toolchain, invariata.

  3. 03

    Batch fino a 100.

    Fino a 100 messaggi indipendenti per chiamata, ciascuno con destinatario e variabili propri, validati come un'unica unità così da non inviare mai a metà.

  4. 04

    Idempotente per contratto.

    Ogni invio accetta una chiave di idempotenza, così una richiesta riprovata dopo un timeout restituisce il risultato originale invece di inviare due volte.

  5. 05

    Un webhook a ogni cambio di stato.

    Accettata, recapitata, aperta, cliccata, respinta, segnalata come spam. Ognuna firmata in HMAC, protetta dai replay, idempotente, con la stessa struttura su ogni canale.

Invii già da un'altra parte? Passa a Bird in un pomeriggio.

La chiamata che fai già cambia appena: sostituisci il client, mantieni i tuoi template, punta i tuoi webhook a un solo endpoint. Le guide alla migrazione coprono 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>",
});

Un messaggio o un centinaio, una sola chiamata.

Raggruppa fino a 100 messaggi indipendenti in una sola richiesta, ciascuno con il proprio destinatario e le proprie variabili. Il batch viene validato come un'unità: un solo messaggio errato fa fallire la chiamata con un 422, così non invii mai a metà. Una singola chiave di idempotenza rende l'intera richiesta sicura da ripetere.

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

Allega il tuo contesto a ogni invio.

I tag sono una dimensione filtrabile di prima classe: segmenta recapito e coinvolgimento per campagna, template o esperimento nella stats API (fino a 20 per messaggio). I metadata sono JSON arbitrario, fino a 2 KB, che torna intatto a ogni lettura e webhook, così i tuoi ID viaggiano insieme al messaggio.

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

Segui ogni messaggio per tutto il suo ciclo di vita.

Un invio restituisce subito un 202; l'esito arriva come webhook per ogni destinatario. Verifica una sola firma, distingui in base al type: la stessa struttura che già gestisci per SMS, voce 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 });
}

Anche gli hard bounce, le segnalazioni di spam e le disiscrizioni aggiornano automaticamente la tua lista di soppressione, così un indirizzo errato non ti costa la reputazione una seconda volta.

  • email.acceptedL'invio è stato accettato ed è in fase di preparazione per la consegna.
  • email.processedIn coda per il server di posta del destinatario.
  • email.deliveredIl server di posta del destinatario ha accettato il messaggio.
  • email.deferredRifiutato temporaneamente, riproveremo.
  • email.bouncedFallito permanentemente: tipo di bounce e codice SMTP nel payload.
  • email.openedIl destinatario ha aperto il messaggio. Può attivarsi più di una volta.
  • email.clickedIl destinatario ha cliccato un link tracciato.
  • email.complainedIl destinatario ha segnalato il messaggio come spam.
  • email.unsubscribedIl destinatario ha scelto di annullare l'iscrizione tramite un link di disiscrizione tracciato.

Testa ogni esito prima di andare in produzione.

Nella sandbox è l'indirizzo del destinatario a determinare il risultato, non lo stato del tuo account. Invia a delivered@messagebird.dev per una consegna pulita, oppure a bounce@, softbounce@, deferred@, complaint@ e suppressed@ per attivare ogni percorso di errore attraverso la pipeline reale e i webhook reali. Nessun dominio da verificare, nessun rischio per la tua reputazione. La produzione è volutamente controllata: prima verifichi un dominio, e un nuovo dominio o IP dedicato passa attraverso il warmup prima di gestire il volume completo.

Approfondisci nella documentazione.

Leggi la guida all'invio, configura gli eventi email e i webhook oppure, se arrivi da un altro provider, segui una guida alla migrazione da SendGrid, SES, Mailgun o Resend.

Circa il 40% delle email commerciali del mondo gira già su Bird.

Email transazionali e di marketing su un'infrastruttura che gestiamo da un decennio. L'invio è una delle funzionalità della Bird Email API: recapitabilità, IP dedicati, soppressione e analytics sono inclusi.

Inizia con un canale.
Aggiungi gli altri quando sei pronto.

Una chiave API di test è subito tua. La produzione si sblocca quando aggiungi un metodo di pagamento e verifichi un mittente.

Usi Claude Code, Cursor o Codex? Copia un prompt di configurazione e il tuo agente installerà la CLI e le skill di Bird per te. Scegli il tuo:

Cursor