TL;DR
Las APIs de Brevo te permiten enviar correos electrónicos de marketing, correos transaccionales y mensajes SMS de forma programática. Te autenticas con una clave API, envías solicitudes a api.brevo.com y utilizas webhooks para rastrear la entrega y el engagement. Para pruebas, usa Apidog para validar cargas útiles, probar manejadores de webhooks y asegurarte de que tu integración maneje correctamente los rebotes y las cancelaciones de suscripción.
Introducción
Brevo (antes Sendinblue) procesa millones de correos electrónicos diariamente para más de 500,000 empresas. Ofrece campañas de marketing, correos electrónicos transaccionales, marketing por SMS y flujos de trabajo de automatización.
Las APIs de correo electrónico parecen simples: envías un mensaje y listo. Pero en producción debes manejar rebotes, quejas de spam, cancelaciones de suscripción y tiempos de entrega. Brevo abstrae esa complejidad para que puedas concentrarte en tu producto.
Casos de uso principales de la API:
- Campañas de marketing: envíos masivos a listas de contactos.
- Correos electrónicos transaccionales: para operaciones críticas (restablecimiento de contraseña, confirmaciones de pedido, notificaciones).
- Mensajes SMS: códigos de verificación, alertas, mensajes promocionales.
💡 Si integras correo electrónico en tu app, Apidog facilita probar plantillas, validar cargas útiles de webhooks y asegurar que tu integración funcione en todos los clientes. Simula respuestas de Brevo y prueba el manejo de errores sin enviar correos reales.
Autenticación y configuración
Obtener una clave API
- Inicia sesión en Brevo
- Ve a SMTP & API → Claves API
- Crea una nueva clave con los permisos necesarios
- Guarda la clave de forma segura
Incluye la clave API en el header api-key:
curl -X GET "https://api.brevo.com/v3/account" \
-H "accept: application/json" \
-H "api-key: tu-clave-api-aqui"
URL base de la API
Todas las solicitudes usan:
https://api.brevo.com/v3/
Límites de tasa
- Gratis: 300 solicitudes/minuto
- Starter: 600 solicitudes/minuto
- Business: 1200 solicitudes/minuto
Verifica el header X-RateLimit-Remaining para rastrear el uso.
Envío de correos electrónicos transaccionales
Los correos transaccionales son mensajes individuales activados por acciones del usuario (restablecimiento de contraseña, confirmaciones, bienvenidas, etc.).
Enviar un correo electrónico simple
curl -X POST "https://api.brevo.com/v3/smtp/email" \
-H "accept: application/json" \
-H "api-key: tu-clave-api" \
-H "content-type: application/json" \
-d '{
"sender": {
"name": "Tu Aplicación",
"email": "noreply@tuapp.com"
},
"to": [
{
"email": "usuario@ejemplo.com",
"name": "Juan Pérez"
}
],
"subject": "Bienvenido a Nuestra Plataforma",
"htmlContent": "<html><body><h1>¡Bienvenido!</h1><p>Gracias por registrarte.</p></body></html>",
"textContent": "¡Bienvenido! Gracias por registrarte."
}'
Respuesta esperada:
{
"messageId": "<20260324123456.123456@relay.brevo.com>"
}
Uso de plantillas
Crea plantillas en el editor visual de Brevo y envíalas por ID:
curl -X POST "https://api.brevo.com/v3/smtp/email" \
-H "api-key: tu-clave-api" \
-H "content-type: application/json" \
-d '{
"templateId": 15,
"to": [
{
"email": "usuario@ejemplo.com",
"name": "Juan Pérez"
}
],
"params": {
"name": "Juan",
"order_number": "ORD-12345",
"tracking_url": "https://seguimiento.ejemplo.com/ORD-12345"
}
}'
Variables de plantilla (usa dobles llaves):
<p>Hola {{params.name}},</p>
<p>Tu pedido {{params.order_number}} ha sido enviado.</p>
<p><a href="{{params.tracking_url}}">Rastrea tu paquete</a></p>
Enviar con adjuntos
const response = await fetch('https://api.brevo.com/v3/smtp/email', {
method: 'POST',
headers: {
'api-key': process.env.BREVO_API_KEY,
'content-type': 'application/json'
},
body: JSON.stringify({
sender: { name: 'Tu Aplicación', email: 'noreply@tuapp.com' },
to: [{ email: 'usuario@ejemplo.com' }],
subject: 'Tu Factura',
htmlContent: '<p>Adjunto encontrarás tu factura.</p>',
attachment: [
{
name: 'factura.pdf',
content: contenidoPdfCodificadoBase64
}
]
})
})
Campañas de marketing
Envía correos masivos a listas de contactos. Brevo añade enlaces de cancelación de suscripción, permite programar envíos y ofrece analíticas.
Crear una campaña
curl -X POST "https://api.brevo.com/v3/emailCampaigns" \
-H "api-key: tu-clave-api" \
-H "content-type: application/json" \
-d '{
"name": "Boletín de Marzo",
"subject": "Novedades de Marzo",
"sender": {
"name": "Tu Marca",
"email": "boletin@tumarea.com"
},
"type": "classic",
"htmlContent": "<html><body>Contenido del boletín aquí...</body></html>",
"recipients": {
"listIds": [12, 15]
},
"scheduledAt": "2026-03-25T09:00:00+00:00"
}'
Enviar inmediatamente
curl -X POST "https://api.brevo.com/v3/emailCampaigns/{campaignId}/sendNow" \
-H "api-key: tu-clave-api"
Obtener estadísticas de campaña
curl -X GET "https://api.brevo.com/v3/emailCampaigns/{campaignId}" \
-H "api-key: tu-clave-api"
Respuesta:
{
"statistics": {
"delivered": 4850,
"opened": 1455,
"clicked": 291,
"unsubscribed": 12,
"bounces": 150
}
}
Gestión de contactos
Organiza contactos en listas y añade atributos personalizados.
Crear un contacto
curl -X POST "https://api.brevo.com/v3/contacts" \
-H "api-key: tu-clave-api" \
-H "content-type: application/json" \
-d '{
"email": "nuevo.usuario@ejemplo.com",
"attributes": {
"FIRSTNAME": "Juana",
"LASTNAME": "Gómez",
"PLAN": "premium"
},
"listIds": [12, 15],
"updateEnabled": true
}'
updateEnabled: true actualiza si el contacto ya existe.
Obtener detalles del contacto
curl -X GET "https://api.brevo.com/v3/contacts/usuario@ejemplo.com" \
-H "api-key: tu-clave-api"
Añadir a la lista
curl -X POST "https://api.brevo.com/v3/contacts/lists/12/contacts/add" \
-H "api-key: tu-clave-api" \
-H "content-type: application/json" \
-d '{
"emails": ["usuario1@ejemplo.com", "usuario2@ejemplo.com"]
}'
Eliminar de la lista
curl -X DELETE "https://api.brevo.com/v3/contacts/lists/12/contacts/remove" \
-H "api-key: tu-clave-api" \
-H "content-type: application/json" \
-d '{
"emails": ["usuario@ejemplo.com"]
}'
Cancelar suscripción de un contacto
curl -X PUT "https://api.brevo.com/v3/contacts/usuario@ejemplo.com" \
-H "api-key: tu-clave-api" \
-H "content-type: application/json" \
-d '{
"emailBlacklisted": true
}'
Marketing por SMS
Envía SMS globalmente a través de la API de SMS de Brevo.
Enviar un SMS
curl -X POST "https://api.brevo.com/v3/transactionalSMS/sms" \
-H "api-key: tu-clave-api" \
-H "content-type: application/json" \
-d '{
"sender": "TuApp",
"recipient": "+15551234567",
"content": "Tu código de verificación es: 123456",
"type": "transactional"
}'
Enviar SMS de marketing
curl -X POST "https://api.brevo.com/v3/transactionalSMS/sms" \
-H "api-key: tu-clave-api" \
-H "content-type: application/json" \
-d '{
"sender": "TuMarca",
"recipient": "+15551234567",
"content": "¡Venta flash! 50% de descuento solo hoy. Responde STOP para cancelar suscripción.",
"type": "marketing"
}'
Obtener estadísticas de SMS
curl -X GET "https://api.brevo.com/v3/transactionalSMS/statistics?startDate=2026-03-01&endDate=2026-03-31" \
-H "api-key: tu-clave-api"
Webhooks para seguimiento
Los webhooks notifican a tu aplicación sobre eventos: entregado, abierto, clickeado, rebotado, cancelación de suscripción.
Configurar webhooks
En el panel de Brevo: Configuración → Webhooks → Añadir webhook.
Eventos típicos:
-
delivered: Correo entregado -
opened: Correo abierto -
clicked: Clic en un enlace -
bounced: Rebote (hard/soft) -
spam: Marcado como spam -
unsubscribed: Cancelación de suscripción
Manejar la carga útil del webhook
app.post('/webhooks/brevo', (req, res) => {
const event = req.body
switch (event.event) {
case 'delivered':
console.log(`Correo ${event.messageId} entregado a ${event.email}`)
break
case 'opened':
console.log(`Correo abierto por ${event.email} en ${event.date}`)
break
case 'bounced':
console.log(`Rebote: ${event.email} - ${event.reason}`)
markContactBounced(event.email)
break
case 'spam':
console.log(`Queja de spam de ${event.email}`)
removeFromAllLists(event.email)
break
case 'unsubscribed':
console.log(`Cancelación de suscripción: ${event.email}`)
break
}
res.status(200).send('OK')
})
Pruebas con Apidog
Las APIs de correo electrónico requieren pruebas robustas: plantillas, rebotes y webhooks. Apidog facilita estas validaciones.
1. Simular el envío de correos electrónicos
Durante el desarrollo, evita enviar correos reales. Simula la respuesta:
pm.test('La API de correo electrónico acepta una carga útil válida', () => {
const response = pm.response.json()
pm.expect(response).to.have.property('messageId')
pm.expect(response.messageId).to.match(/<.*@relay\.brevo\.com>/)
})
2. Probar el manejo de webhooks
Crea cargas útiles simuladas en Apidog:
{
"event": "bounced",
"email": "invalido@ejemplo.com",
"messageId": "<12345@relay.brevo.com>",
"reason": "hard_bounce",
"date": "2026-03-24T12:00:00Z",
"subject": "Bienvenido a Nuestra Plataforma"
}
Envía al endpoint de webhook y verifica el manejo en tu código.
3. Validar plantillas
Almacena las cargas útiles y prueba el reemplazo de variables:
pm.test('Las variables de plantilla son válidas', () => {
const payload = pm.request.body.toJSON()
pm.expect(payload.params).to.have.property('name')
pm.expect(payload.params).to.have.property('order_number')
})
4. Separación de entornos
Configura diferentes claves y remitentes para cada entorno:
# Desarrollo
BREVO_API_KEY: xkeysib-dev-xxx
BREVO_SENDER: dev@tuapp.com
# Producción
BREVO_API_KEY: xkeysib-prod-xxx
BREVO_SENDER: noreply@tuapp.com
Prueba las APIs de Brevo con Apidog – gratis.
Errores comunes y soluciones
400 Bad Request - Campo requerido faltante
Causa: Falta un campo obligatorio.
Solución: Revisa el mensaje de error:
{
"code": "invalid_parameter",
"message": "sender.email es requerido"
}
401 No autorizado
Causa: Clave API inválida o ausente.
Solución: Verifica que el header api-key esté correcto. Asegúrate de que la clave no haya sido revocada.
402 Pago requerido
Causa: Límite de cuenta o falta de créditos.
Solución:
- Email: Revisa los límites de tu plan.
- SMS: Compra créditos adicionales.
429 Demasiadas solicitudes
Causa: Exceso de solicitudes.
Solución: Implementa retroceso exponencial:
async function sendWithRetry(email, retries = 3) {
for (let i = 0; i < retries; i++) {
const response = await sendEmail(email)
if (response.status === 429) {
await sleep(Math.pow(2, i) * 1000)
} else {
return response
}
}
throw new Error('Límite de tasa excedido')
}
404 Contacto no encontrado
Causa: Intento de actualizar contacto inexistente.
Solución: Usa updateEnabled: true al crear:
{
"email": "nuevo@ejemplo.com",
"updateEnabled": true
}
Así creas o actualizas el contacto.
Alternativas y comparaciones
| Característica | Brevo | SendGrid | Mailchimp | Postmark |
|---|---|---|---|---|
| Precios | 300 correos/día gratis | 100 correos/día gratis | 500 correos/mes gratis | 100 correos/mes gratis |
| Correos de marketing | Sí | Sí | Sí | No |
| Correos transaccionales | Sí | Sí | Limitado | Sí (especializado) |
| SMS | Sí | No | No | No |
| Automatización | Sí | Sí | Sí | Limitado |
| Editor de plantillas | Visual + código | Código | Visual | Código |
Brevo destaca por su soporte combinado de correo electrónico y SMS con precios competitivos.
Casos de uso en el mundo real
Flujo de pedidos e-commerce: Una tienda online usa Brevo para confirmaciones de pedido, notificaciones de envío, recuperación de carritos y promociones semanales, todo vía API.
Onboarding SaaS: Herramientas SaaS automatizan bienvenidas, restablecimiento de contraseñas e invitaciones de equipo por API. El marketing promociona nuevas funciones a suscriptores.
Verificación por SMS: Apps fintech envían códigos de 2FA vía SMS y gestionan reintentos con webhooks para entrega fallida.
Conclusión
Resumen práctico:
- Las APIs de Brevo cubren marketing, correo transaccional y SMS.
- Autenticación vía header
api-key. - Usa plantillas para correos mantenibles.
- Gestiona contactos y listas para campañas dirigidas.
- Webhooks para rastrear entregas, aperturas, clics y rebotes.
- Prueba con Apidog antes de lanzar a usuarios reales.
Siguientes pasos recomendados:
- Crea cuenta Brevo y genera tu clave API.
- Envía tu primer correo transaccional.
- Diseña una plantilla en el editor visual.
- Implementa handlers de webhooks para rebotes y bajas.
- Prueba tu integración con Apidog en desarrollo.
Prueba las APIs de Brevo con Apidog – gratis.
Preguntas frecuentes
¿Cuál es la diferencia entre Brevo y Sendinblue?
Es el mismo producto, solo cambio de nombre. Sendinblue ahora es Brevo desde 2023. Las APIs usan api.brevo.com, pero puedes ver referencias a Sendinblue en documentación previa.
¿Cuántos correos puedo enviar gratis?
300 correos diarios en el plan gratuito (9,000 al mes). Si necesitas más, los planes pagados comienzan desde $25/mes por 20,000 correos.
¿Puedo usar Brevo para correos en frío?
Técnicamente sí, pero puede ser riesgoso. Los envíos en frío suelen generar rebotes y quejas de spam. Brevo monitorea la reputación. Altas tasas de queja pueden suspender tu cuenta. Calienta tu dominio y sigue buenas prácticas.
¿Cómo manejo los rebotes?
Escucha los webhooks de tipo bounced. Rebotes duros (correo inválido) deben eliminarse permanentemente. Rebotes suaves (problemas temporales) pueden ser reintentados. Mantén tu tasa de rebote por debajo de 5%.
¿Diferencia entre correos de marketing y transaccionales?
Los transaccionales son activados por el usuario (compras, registro) y van a un solo destinatario. Los de marketing son campañas masivas. Brevo los separa para mejor entregabilidad.
¿Cómo añado enlace de cancelación de suscripción?
Brevo añade enlaces automáticamente en campañas de marketing. Para transaccionales, agrega manualmente:
<a href="{{ unsubscribe_url }}">Cancelar suscripción</a>
¿Puedo enviar desde mi dominio?
Sí. Configura SPF, DKIM y DMARC en tu DNS. Brevo te da los valores en Configuración → Remitente & IP.
¿Cómo programo correos en zona horaria específica?
Usa el parámetro scheduledAt en formato ISO 8601:
{
"scheduledAt": "2026-03-25T09:00:00-05:00"
}
¿Qué pasa si llego al límite de tasa?
Recibirás error 429. Usa el header X-RateLimit-Reset para saber cuándo reintentar. Implementa retroceso exponencial o encola los envíos.


Top comments (0)