Enviar email
Una API para cada email que envías.
Transaccional o de marketing, un mensaje o cien, enviados a través de la misma Email API, con idempotencia, supresión y webhooks integrados. Pasa HTML sin procesar o renderiza tus plantillas de React Email.
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..."
You can sign in any time at bird.com/login.
Your test API key is on your dashboard, ready to send.
Envía tu primer email en cinco minutos.
Desde el lenguaje que ya usas.
El envío es el núcleo de la Bird Email API. Tu primer envío puede dirigirse a una dirección de sandbox (delivered@messagebird.dev), para que puedas probar toda la plataforma (envíos, webhooks, supresión) antes de verificar un dominio.
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 cosas que no construyes tú mismo.
El mismo contrato en cada canal de Bird.
- 01
Transaccional y de marketing.
El mismo endpoint envía un restablecimiento de contraseña o una campaña. Un campo de categoría decide cómo se aplican la supresión y las bajas.
- 02
Plantillas a tu manera.
Envía HTML sin procesar, renderiza plantillas de React Email a HTML en tu aplicación y envía el resultado, o indica el nombre de una plantilla almacenada y deja que se renderice por ti. Tu stack de herramientas, sin cambios.
- 03
Lotes de hasta 100.
Hasta 100 mensajes independientes por llamada, cada uno con su propio destinatario y variables, validados como una unidad para que nunca envíes a medias.
- 04
Idempotente por contrato.
Cada envío acepta una clave de idempotencia, de modo que una solicitud reintentada tras un tiempo de espera agotado devuelve el resultado original en lugar de enviar por duplicado.
- 05
Un webhook en cada cambio de estado.
Aceptado, entregado, abierto, con clic, rebotado, marcado como spam. Cada uno firmado con HMAC, protegido contra repetición, idempotente, el mismo envelope en cada canal.
¿Ya envías desde otra plataforma? Cámbiate en una tarde.
La llamada que ya haces apenas cambia: cambia el cliente, conserva tus plantillas, apunta tus webhooks a un solo endpoint. Las guías de migración cubren SendGrid, Amazon SES, Mailgun y Resend.
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>",
});
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 mensaje o cien, en una sola llamada.
Agrupa hasta 100 mensajes independientes en una sola petición, cada uno con su propio destinatario y variables. El lote se valida como una unidad: un mensaje incorrecto rechaza la llamada con un 422, así nunca envías a medias. Una sola clave de idempotencia hace que toda la petición sea segura de reintentar.
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`);
Añade tu propio contexto a cada envío.
Las etiquetas son una dimensión filtrable de primera clase: segmenta la entrega y la interacción por campaña, plantilla o experimento en la API de estadísticas (hasta 20 por mensaje). Los metadatos son JSON arbitrario, hasta 2 KB, que se conserva intacto en cada lectura y webhook, de modo que tus propios IDs viajan junto con el mensaje.
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" },
});
Observa cada mensaje durante toda su vida.
Un envío devuelve 202 de inmediato; el resultado llega como un webhook por destinatario. Verifica una firma, conmuta según el type: el mismo envelope que ya gestionas para SMS, voz y WhatsApp.
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 });
}
Los rebotes definitivos, las quejas y las bajas también actualizan tu lista de supresión automáticamente, así una dirección incorrecta nunca te cuesta reputación dos veces.
email.acceptedEl envío fue aceptado y se está preparando para la entrega.email.processedEn cola para el servidor de correo del destinatario.email.deliveredEl servidor de correo del destinatario aceptó el mensaje.email.deferredRechazado temporalmente; volveremos a intentarlo.email.bouncedFallo permanente: tipo de rebote y código SMTP en el payload.email.openedEl destinatario abrió el mensaje. Puede activarse más de una vez.email.clickedEl destinatario hizo clic en un enlace rastreado.email.complainedEl destinatario marcó el mensaje como spam.email.unsubscribedEl destinatario se dio de baja a través de un enlace de cancelación de suscripción rastreado.
Prueba cada resultado antes de salir a producción.
En el sandbox, la dirección del destinatario determina el resultado, sin que el estado de tu cuenta tenga que intervenir. Envía a delivered@messagebird.dev para una entrega limpia, o a bounce@, softbounce@, deferred@, complaint@ y suppressed@ para activar cada ruta de fallo a través del pipeline real y los webhooks reales. Sin dominio que verificar, sin riesgo para tu reputación. El paso a producción es deliberadamente controlado: primero verificas un dominio, y un dominio nuevo o una IP dedicada pasan por un proceso de calentamiento antes de manejar el volumen completo.
Profundiza en la documentación.
Lee la guía de envío, configura los eventos de email y webhooks, o, si vienes de otro proveedor, sigue una guía de migración de SendGrid, SES, Mailgun o Resend.
El resto de la plataforma de Email
Una API, un único juego de claves. Explora las demás capacidades.
Alrededor del 40% del correo comercial del mundo ya funciona sobre Bird.
Email transaccional y de marketing sobre una infraestructura que operamos desde hace una década. El envío es una de las capacidades de la Bird Email API: capacidad de entrega, IPs dedicadas, supresión y analíticas vienen incluidas.