Envoyer des e-mails

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

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

Des équipes qui créent des logiciels de classe mondiale nous font confiance au quotidien

Découvrir plus de témoignages clients

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 au cœur de l<hub>API Email Bird</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 ne construisez pas vous-même.

Le même contrat sur chaque canal Bird.

  1. 01

    Transactionnel et marketing.

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

  2. 02

    Des modèles à votre façon.

    Transmettez du HTML brut, effectuez le rendu de templates React Email en HTML dans votre application et envoyez le résultat, ou nommez un template stocké et laissez-nous le rendre 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 un seul ensemble pour ne jamais envoyer à moitié.

  4. 04

    Idempotent par contrat.

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

  5. 05

    Un webhook à chaque changement d'état.

    Accepté, délivré, ouvert, cliqué, rejeté (bounce), signalé comme spam. Chacun signé en HMAC, protégé contre le rejeu, idempotent, la même enveloppe sur tous les canaux.

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.

Commencez gratuitement

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

L'appel que vous faites déjà change à peine : remplacez le client, gardez vos templates, pointez 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 dans une seule requête, chacun avec son propre destinataire et ses variables. Le lot est validé comme un tout : un seul message incorrect rejette l'appel avec un 422, vous n'envoyez donc jamais à moitié. Une seule clé d'idempotence rend toute la requête rejouable en toute sécurité.

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

Attachez votre propre contexte à chaque envoi.

Les tags sont une dimension filtrable de première classe : segmentez la délivrabilité et l'engagement par campagne, template ou expérimentation dans l'API de stats (jusqu'à 20 par message). Les métadonnées sont du JSON arbitraire, jusqu'à 2 Ko, restitué intact à 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 sa vie.

Un envoi renvoie immédiatement un 202 ; le résultat arrive sous forme de webhook par destinataire. Vérifiez une signature, branchez selon le type : la même enveloppe que vous gérez déjà pour SMS, 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.processedEn file d'attente pour le serveur de messagerie du destinataire.
  • email.deliveredLe serveur de messagerie du destinataire a accepté le message.
  • email.deferredTemporairement refusé, nous réessaierons.
  • 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ésabonnement 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 à travers le pipeline réel et les webhooks réels. Aucun domaine à vérifier, aucun risque pour votre réputation. La production est volontairement contrôlée : 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 (warmup) avant de supporter le volume complet.

Allez plus loin dans la documentation.

Lisez le guide d'envoi, branchez les événements e-mail et webhooks, ou, si vous venez d'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.

Mettez-le en pratique.

Poursuivez avec la documentation, les guides et les exemples sur ce sujet. Les ressources sont en anglais.

Essayez la pratique et obtenez un guide d'implémentation

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 les ventes

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

Tous les champs de contact sont obligatoires.

Pour que notre équipe puisse vous contacter au sujet de votre démo.

Produits d'intérêt

Facultatif

Nous vous contacterons pour organiser votre démo.
Politique de confidentialité

Commencez avec un seul canal.
Ajoutez les autres quand vous êtes prêt.

Une clé API de test est disponible immédiatement. L'accès production se débloque dès que vous ajoutez un moyen de paiement et vérifiez un expéditeur.

Vous utilisez Claude Code, Cursor ou Codex ? Copiez un prompt de configuration et votre agent installe la CLI Bird et les compétences pour vous. Choisissez le vôtre :

Cursor