Une seule API pour chaque
e-mail que vous envoyez.

Transactionnel ou marketing, un message ou cent, envoyés via la même API Email, avec idempotence, suppression et webhooks intégrés. Transmettez du HTML brut ou utilisez vos 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..."

Vous envoyez déjà via SMTP ?

Conservez votre client SMTP existant et connectez-le au relais de Bird. Consultez la page de configuration SMTP pour les hôtes régionaux, les ports TLS et l'authentification. Si votre application doit recevoir et analyser des messages, commencez par l'e-mail entrant.

Envoyez votre premier e-mail en cinq minutes.

Depuis le langage que vous utilisez déjà.

L'envoi est le cœur de l<hub>Bird Email API</hub>. Votre premier envoi peut être adressé à une adresse sandbox (delivered@messagebird.dev), ce qui vous permet de tester lensemble de la plateforme (envois, webhooks, suppression) avant de vérifier un domaine.

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"

Cinq choses que vous n'avez pas à construire vous-même.

Le même contrat sur chaque canal Bird.

  1. 01

    Transactionnel + marketing.

    Le même endpoint envoie une réinitialisation de mot de passe ou une campagne. Un champ de catégorie détermine comment la suppression et les désinscriptions s'appliquent.

  2. 02

    Des templates à votre façon.

    Transmettez du HTML brut, compilez vos templates React Email en HTML dans votre application et envoyez le résultat, ou nommez un template stocké pour qu'il soit compilé pour vous. Votre chaîne d'outils, inchangée.

  3. 03

    Envoi par lot jusqu'à 100.

    Jusqu'à 100 messages indépendants par appel, chacun avec son propre destinataire et ses variables, validés comme une seule unité pour ne jamais envoyer à moitié.

  4. 04

    Idempotent par contrat.

    Chaque envoi accepte une clé d'idempotence : une requête relancée après un timeout renvoie le résultat original au lieu de doubler l'envoi.

  5. 05

    Un webhook à chaque changement d'état.

    Accepté, délivré, ouvert, cliqué, rebondi, signalé. Chacun signé par HMAC, protégé contre le rejeu, idempotent, la même enveloppe sur chaque canal.

Effectuez la première requête depuis votre application.

Créez un compte et une clé API, puis suivez le guide d'envoi avec un destinataire de test.

Commencer

Vous envoyez déjà ailleurs ? Migrez en un après-midi.

L'appel que vous faites déjà change à peine : remplacez le client, conservez vos templates, redirigez vos webhooks vers un seul endpoint. Les guides de migration couvrent SendGrid, Amazon SES, Mailgun et 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 message ou cent, un seul appel.

Regroupez jusqu'à 100 messages indépendants en une seule requête, chacun avec son propre destinataire et ses variables. Le lot est validé comme une unité : un seul message invalide rejette l'appel avec un 422, pour ne jamais envoyer à moitié. Une seule clé d'idempotence rend l'ensemble de la requête sûr à réessayer.

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

Associez votre propre contexte à chaque envoi.

Les tags sont une dimension de premier ordre, filtrable : segmentez la délivrabilité et l'engagement par campagne, template ou expérience dans les statistiques de l'API (jusqu'à 20 par message). Les métadonnées sont du JSON arbitraire, jusqu'à 2 Ko, qui fait l'aller-retour intact sur chaque lecture et webhook, pour que vos propres identifiants accompagnent le message.

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

Suivez chaque message tout au long de son cycle de vie.

Un envoi renvoie 202 immédiatement ; le résultat arrive sous forme de webhook par destinataire. Vérifiez une seule signature, filtrez par type : la même enveloppe que vous gérez déjà pour SMS, la voix et 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 });
}

Les rebonds définitifs et les plaintes mettent à jour les suppressions de destinataires. Les désabonnements enregistrent une préférence de retrait. Ces enregistrements sont vérifiés lors du traitement des envois suivants.

  • email.acceptedL'envoi a été accepté et est en cours de préparation pour la livraison.
  • email.processedMis en file d'attente pour le serveur de messagerie du destinataire.
  • email.deliveredLe serveur de messagerie du destinataire a accepté le message.
  • email.deferredRefusé temporairement, une nouvelle tentative sera effectuée.
  • email.bouncedÉchec permanent : type de rebond et code SMTP dans le payload.
  • email.openedLe destinataire a ouvert le message. Peut se déclencher plusieurs fois.
  • email.clickedLe destinataire a cliqué sur un lien suivi.
  • email.complainedLe destinataire a signalé le message comme spam.
  • email.unsubscribedLe destinataire s'est désinscrit via un lien de désinscription suivi.

Testez chaque résultat avant de passer en production.

Dans le sandbox, c'est l'adresse du destinataire qui détermine le résultat, pas l'état de votre compte. Envoyez à delivered@messagebird.dev pour une livraison réussie, ou à bounce@, softbounce@, deferred@, complaint@ et suppressed@ pour simuler chaque scénario d'échec via le vrai pipeline et les vrais webhooks. Aucun domaine à vérifier, aucun risque pour votre réputation. Le passage en production est volontairement contrôlé : vous vérifiez d'abord un domaine, et un nouveau domaine ou une IP dédiée passe par une phase de montée en charge avant de supporter le volume complet.

Approfondissez dans la documentation.

Consultez le guide d'envoi, configurez les événements e-mail et webhooks, ou, si vous migrez depuis un autre fournisseur, suivez un guide de migration depuis SendGrid, SES, Mailgun ou Resend.

Testez le comportement autour de l'envoi.

Un appel d'envoi fonctionnel est le point de départ d'une intégration. Simulez des rebonds et des plaintes, gérez les livraisons de webhooks en double et décidez comment votre application planifie les messages ou reçoit les réponses.

161%

Augmentation des taux d'ouverture d'e-mails rapportée dans l'étude de cas Zillow.

Lire l'étude de cas Zillow

Conçu avec Bird

Quand le bon logement apparaît, l'e-mail doit arriver.

Zillow a confié ses alertes immobilières urgentes à Bird, avec la capacité d'absorber les pics d'envoi et les analyses pour comprendre l'engagement. Son équipe a rapporté une augmentation de 161 % des taux d'ouverture dès le premier mois.

Vous préparez une migration ou un envoi à plus fort volume ?

Contacter l’équipe commerciale

Questions sur l'envoi d'e-mails

Puis-je envoyer à la fois des e-mails transactionnels et marketing ?
Oui, les deux passent par la même API d'envoi. La seule différence est le champ category, qui détermine l'application des suppressions et des désinscriptions. Choisissez transactional pour les réinitialisations de mot de passe et les reçus, et marketing pour les campagnes.
Que se passe-t-il si une requête expire et que je la réessaie ?
Envoyez un en-tête Idempotency-Key avec chaque envoi logique. Si la première requête a réussi mais que vous n'avez jamais reçu la réponse, la rejouer avec la même clé vous renvoie le résultat original avec un en-tête Idempotency-Replay, au lieu d'envoyer l'e-mail deux fois.
Puis-je planifier un envoi pour plus tard ?
Définissez scheduled_at sur un horaire entre 30 secondes et 30 jours dans le futur. L'envoi est immédiatement accepté et reste planifié jusqu'à son expédition, vous pouvez donc l'annuler à tout moment avant.
Puis-je joindre des fichiers ?
Oui, en base64 dans le tableau attachments. Pour afficher une image en ligne, attribuez-lui un content_id et référencez-le dans votre HTML avec cid:. Maintenez les fichiers bruts à 15 Mo maximum afin que le message respecte la limite de 20 Mo une fois encodé, et notez que les types de contenu exécutables et de script sont refusés avant l'envoi.

Contactez notre équipe email

Créez votre prochaine intégration email.

Discutez de vos messages transactionnels, envois en masse et événements de livraison. Nous vous aiderons à planifier votre intégration, votre volume d'envoi et votre migration.

Créez votre compte, puis créez une clé API et envoyez un message de test.

Vos coordonnées

Produits d'intérêt

Facultatif

Évoluez sans
perdre le contrôle.

Organisez vos équipes en espaces de travail, contrôlez l'accès à l'API et tracez les modifications via les journaux d'audit.

BirdHarborOrganization
WorkspacesProductionSandbox

Delivery agent

API key · Customer operations team
Active
PermissionsAccess
EmailRead & write
SMSRead & write
ALAlex Lee AdminPermissions updated

Audit log

Production
Workspace
Production
Resource
Delivery agent
WhatsApp
ReadRead & write
Succeeded

Commencez avec Email.
Développez sur tous les canaux avec Bird.

Votre prochaine idée.
Prête à se connecter.