TL;DR
As APIs da Brevo permitem que você envie e-mails de marketing, e-mails transacionais e mensagens SMS programaticamente. Você se autentica com uma chave de API, envia solicitações para api.brevo.com e usa webhooks para rastrear a entrega e o engajamento. Para testar, use o Apidog para validar payloads, testar manipuladores de webhook e garantir que sua integração lide corretamente com bounces e cancelamentos de inscrição.
Introdução
A Brevo (anteriormente Sendinblue) processa milhões de e-mails diariamente para mais de 500.000 empresas. Ela gerencia campanhas de marketing, e-mails transacionais, marketing por SMS e fluxos de trabalho de automação.
As APIs de e-mail parecem simples - envie uma mensagem, pronto. Mas os sistemas de e-mail em produção precisam lidar com bounces, reclamações de spam, cancelamentos de inscrição e tempo de entrega. A Brevo gerencia essa complexidade para que você não precise se preocupar.
A API cobre três casos de uso principais:
- Campanhas de marketing - E-mails em massa para listas de contatos
- E-mails transacionais - Redefinições de senha, confirmações de pedidos, notificações
- Mensagens SMS - Códigos de verificação, alertas, textos de marketing
Autenticação e configuração
Obter uma chave de API
- Faça login na Brevo
- Vá para SMTP & API → Chaves de API
- Crie uma nova chave com as permissões apropriadas
- Armazene-a de forma segura
A chave de API vai no cabeçalho api-key:
curl -X GET "https://api.brevo.com/v3/account" \
-H "accept: application/json" \
-H "api-key: sua-chave-api-aqui"
URL base da API
Todas as solicitações vão para:
https://api.brevo.com/v3/
Limites de taxa
A Brevo limita as solicitações por plano:
- Grátis: 300 solicitações/minuto
- Starter: 600 solicitações/minuto
- Business: 1200 solicitações/minuto
Verifique o cabeçalho X-RateLimit-Remaining para acompanhar o uso.
Envio de e-mails transacionais
E-mails transacionais são mensagens individuais acionadas por ações do usuário. Pense em redefinições de senha, confirmações de pedidos, e-mails de boas-vindas.
Enviar um e-mail simples
curl -X POST "https://api.brevo.com/v3/smtp/email" \
-H "accept: application/json" \
-H "api-key: sua-chave-api" \
-H "content-type: application/json" \
-d '{
"sender": {
"name": "Seu App",
"email": "noreply@seusite.com"
},
"to": [
{
"email": "usuario@example.com",
"name": "João Silva"
}
],
"subject": "Bem-vindo à Nossa Plataforma",
"htmlContent": "<html><body><h1>Bem-vindo!</h1><p>Obrigado por se inscrever.</p></body></html>",
"textContent": "Bem-vindo! Obrigado por se inscrever."
}'
Resposta:
{
"messageId": "<20260324123456.123456@relay.brevo.com>"
}
Usando modelos
Crie modelos no editor visual da Brevo e envie pelo ID:
curl -X POST "https://api.brevo.com/v3/smtp/email" \
-H "api-key: sua-chave-api" \
-H "content-type: application/json" \
-d '{
"templateId": 15,
"to": [
{
"email": "usuario@example.com",
"name": "João Silva"
}
],
"params": {
"name": "João",
"order_number": "PED-12345",
"tracking_url": "https://rastreamento.example.com/PED-12345"
}
}'
Variáveis de modelo usam chaves duplas:
<p>Olá {{params.name}},</p>
<p>Seu pedido {{params.order_number}} foi enviado.</p>
<p><a href="{{params.tracking_url}}">Rastreie seu pacote</a></p>
Enviar com anexos
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: 'Seu App', email: 'noreply@seusite.com' },
to: [{ email: 'usuario@example.com' }],
subject: 'Sua Fatura',
htmlContent: '<p>Por favor, encontre sua fatura anexada.</p>',
attachment: [
{
name: 'fatura.pdf',
content: base64EncodedPdfContent
}
]
})
})
Campanhas de marketing
E-mails de marketing vão para listas de contatos. A Brevo gerencia links de cancelamento de inscrição, agendamento e análises.
Criar uma campanha
curl -X POST "https://api.brevo.com/v3/emailCampaigns" \
-H "api-key: sua-chave-api" \
-H "content-type: application/json" \
-d '{
"name": "Newsletter de Março",
"subject": "Novidades em Março",
"sender": {
"name": "Sua Marca",
"email": "newsletter@suamarca.com"
},
"type": "classic",
"htmlContent": "<html><body>Conteúdo da newsletter aqui...</body></html>",
"recipients": {
"listIds": [12, 15]
},
"scheduledAt": "2026-03-25T09:00:00+00:00"
}'
Enviar imediatamente
curl -X POST "https://api.brevo.com/v3/emailCampaigns/{campaignId}/sendNow" \
-H "api-key: sua-chave-api"
Obter estatísticas da campanha
curl -X GET "https://api.brevo.com/v3/emailCampaigns/{campaignId}" \
-H "api-key: sua-chave-api"
A resposta inclui:
{
"statistics": {
"delivered": 4850,
"opened": 1455,
"clicked": 291,
"unsubscribed": 12,
"bounces": 150
}
}
Gerenciamento de contatos
Contatos são as pessoas para quem você envia e-mails. Organize-os em listas e adicione atributos personalizados.
Criar um contato
curl -X POST "https://api.brevo.com/v3/contacts" \
-H "api-key: sua-chave-api" \
-H "content-type: application/json" \
-d '{
"email": "novo.usuario@example.com",
"attributes": {
"FIRSTNAME": "Joana",
"LASTNAME": "Silva",
"PLAN": "premium"
},
"listIds": [12, 15],
"updateEnabled": true
}'
A flag updateEnabled: true atualiza contatos existentes em vez de falhar.
Obter detalhes do contato
curl -X GET "https://api.brevo.com/v3/contacts/usuario@example.com" \
-H "api-key: sua-chave-api"
Adicionar à lista
curl -X POST "https://api.brevo.com/v3/contacts/lists/12/contacts/add" \
-H "api-key: sua-chave-api" \
-H "content-type: application/json" \
-d '{
"emails": ["usuario1@example.com", "usuario2@example.com"]
}'
Remover da lista
curl -X DELETE "https://api.brevo.com/v3/contacts/lists/12/contacts/remove" \
-H "api-key: sua-chave-api" \
-H "content-type: application/json" \
-d '{
"emails": ["usuario@example.com"]
}'
Cancelar inscrição de um contato
curl -X PUT "https://api.brevo.com/v3/contacts/usuario@example.com" \
-H "api-key: sua-chave-api" \
-H "content-type: application/json" \
-d '{
"emailBlacklisted": true
}'
Marketing por SMS
A Brevo envia mensagens SMS globalmente através de sua API de SMS.
Enviar um SMS
curl -X POST "https://api.brevo.com/v3/transactionalSMS/sms" \
-H "api-key: sua-chave-api" \
-H "content-type: application/json" \
-d '{
"sender": "SeuApp",
"recipient": "+15551234567",
"content": "Seu código de verificação é: 123456",
"type": "transactional"
}'
Enviar SMS de marketing
curl -X POST "https://api.brevo.com/v3/transactionalSMS/sms" \
-H "api-key: sua-chave-api" \
-H "content-type: application/json" \
-d '{
"sender": "SuaMarca",
"recipient": "+15551234567",
"content": "Liquidação relâmpago! 50% de desconto hoje. Responda PARAR para cancelar.",
"type": "marketing"
}'
Obter estatísticas de SMS
curl -X GET "https://api.brevo.com/v3/transactionalSMS/statistics?startDate=2026-03-01&endDate=2026-03-31" \
-H "api-key: sua-chave-api"
Webhooks para rastreamento
Webhooks notificam seu aplicativo sobre eventos de e-mail: entregue, aberto, clicado, bounce, cancelado.
Configurar webhooks
No painel da Brevo: Configurações → Webhooks → Adicionar webhook
Eventos para rastrear:
delivered- E-mail chegou à caixa de entradaopened- Destinatário abriu o e-mailclicked- Destinatário clicou em um linkbounced- E-mail retornou (hard ou soft bounce)spam- Marcado como spamunsubscribed- Destinatário cancelou a inscrição
Manipular payload de webhook
app.post('/webhooks/brevo', (req, res) => {
const event = req.body
switch (event.event) {
case 'delivered':
console.log(`E-mail ${event.messageId} entregue para ${event.email}`)
break
case 'opened':
console.log(`E-mail aberto por ${event.email} em ${event.date}`)
break
case 'bounced':
console.log(`Bounce: ${event.email} - ${event.reason}`)
// Marcar contato como inválido
markContactBounced(event.email)
break
case 'spam':
console.log(`Reclamação de spam de ${event.email}`)
// Remover de todas as listas
removeFromAllLists(event.email)
break
case 'unsubscribed':
console.log(`Cancelado: ${event.email}`)
break
}
res.status(200).send('OK')
})
Testando com Apidog
APIs de e-mail têm modos de falha complexos. Você precisa testar modelos, bounces e webhooks. O Apidog ajuda.

1. Simular envio de e-mail
Durante o desenvolvimento, não envie e-mails reais. Simule a resposta:
pm.test('Email API accepts valid payload', () => {
const response = pm.response.json()
pm.expect(response).to.have.property('messageId')
pm.expect(response.messageId).to.match(/<.*@relay\.brevo\.com>/)
})

2. Testar manipulação de webhook
Crie payloads de webhook simulados no Apidog:
{
"event": "bounced",
"email": "invalid@example.com",
"messageId": "<12345@relay.brevo.com>",
"reason": "hard_bounce",
"date": "2026-03-24T12:00:00Z",
"subject": "Bem-vindo à Nossa Plataforma"
}
Envie para o seu endpoint de webhook e verifique se o seu código o manipula.
3. Validar modelos
Armazene payloads de modelo e teste se as variáveis são substituídas corretamente:
pm.test('Template variables are valid', () => {
const payload = pm.request.body.toJSON()
pm.expect(payload.params).to.have.property('name')
pm.expect(payload.params).to.have.property('order_number')
})
4. Separação de ambiente
# Desenvolvimento
BREVO_API_KEY: xkeysib-dev-xxx
BREVO_SENDER: dev@seusite.com
# Produção
BREVO_API_KEY: xkeysib-prod-xxx
BREVO_SENDER: noreply@seusite.com
Teste as APIs de e-mail da Brevo com Apidog - grátis
Erros comuns e soluções
400 Bad Request - Campo obrigatório ausente
Causa: Payload sem campos obrigatórios.
Solução: Verifique a mensagem de erro para detalhes:
{
"code": "invalid_parameter",
"message": "sender.email é obrigatório"
}
401 Não autorizado
Causa: Chave de API inválida ou ausente.
Solução: Verifique se o cabeçalho api-key está configurado corretamente. Verifique se a chave não foi revogada.
402 Pagamento Necessário
Causa: Conta excedeu limites ou faltam créditos.
Solução:
- Para e-mail: Verifique os limites de e-mail do seu plano
- Para SMS: Compre créditos de SMS
429 Muitas Solicitações
Causa: Limite de taxa excedido.
Solução: Implemente um backoff 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('Limite de taxa excedido')
}
404 Contato não encontrado
Causa: Tentando atualizar um contato que não existe.
Solução: Use updateEnabled: true ao criar contatos:
{
"email": "novo@example.com",
"updateEnabled": true
}
Isso cria ou atualiza o contato.
Alternativas e comparações
| Recurso | Brevo | SendGrid | Mailchimp | Postmark |
|---|---|---|---|---|
| Preços | 300 e-mails/dia grátis | 100 e-mails/dia grátis | 500 e-mails/mês grátis | 100 e-mails/mês grátis |
| E-mails de marketing | Sim | Sim | Sim | Não |
| E-mails transacionais | Sim | Sim | Limitado | Sim (especializado) |
| SMS | Sim | Não | Não | Não |
| Automação | Sim | Sim | Sim | Limitado |
| Editor de modelos | Visual + código | Código | Visual | Código |
A Brevo se destaca pelo suporte combinado de e-mail e SMS a preços competitivos.
Casos de uso reais
Fluxo de pedidos de e-commerce. Uma loja online usa a Brevo para: confirmação de pedido (transacional), notificação de envio (transacional), recuperação de carrinho abandonado (automação de marketing) e promoções semanais (campanhas de marketing). Tudo a partir de uma única integração.
Onboarding SaaS. Uma ferramenta de gerenciamento de projetos envia e-mails de boas-vindas, redefinições de senha e convites de equipe via API transacional. E-mails de marketing anunciam novos recursos para usuários opt-in.
Verificação por SMS. Um aplicativo fintech usa a API de SMS da Brevo para códigos de autenticação de dois fatores. O endpoint de SMS transacional entrega códigos em segundos, e webhooks rastreiam falhas de entrega para lógica de nova tentativa.
Conclusão
Aqui está o que você aprendeu:
- As APIs da Brevo lidam com marketing, e-mail transacional e SMS
- Autentique-se com o cabeçalho
api-key - Use modelos para e-mails consistentes e de fácil manutenção
- Gerencie contatos e listas para campanhas direcionadas
- Webhooks rastreiam entregas, aberturas, cliques e bounces
- Teste com Apidog antes de enviar para usuários reais
Seus próximos passos:
- Crie uma conta Brevo e obtenha uma chave de API
- Envie seu primeiro e-mail transacional
- Crie um modelo no editor visual
- Configure manipuladores de webhook para bounces e cancelamentos de inscrição
- Teste com Apidog no desenvolvimento
Teste as APIs de e-mail da Brevo com Apidog - grátis
FAQ
Qual a diferença entre Brevo e Sendinblue?Mesmo produto, novo nome. A Sendinblue mudou a marca para Brevo em 2023. As APIs ainda usam api.brevo.com, mas você verá referências à Sendinblue em documentações mais antigas.
Quantos e-mails posso enviar gratuitamente?300 e-mails por dia no plano gratuito. Isso dá 9.000 e-mails por mês. Para mais, faça upgrade para um plano pago a partir de $25/mês para 20.000 e-mails.
Posso usar a Brevo para cold emails?Tecnicamente sim, mas é arriscado. Cold emails têm altas taxas de bounce e spam. A Brevo monitora a reputação do remetente. Altas taxas de reclamação podem suspender contas. Aqueça seu domínio primeiro e siga as melhores práticas de e-mail.
Como lidar com bounces de e-mail?Monitore webhooks de bounced. Hard bounces (e-mail inválido) devem remover contatos permanentemente. Soft bounces (caixa de entrada cheia, problemas temporários) podem ser retentados. Acompanhe a taxa de bounce - se exceder 5%, sua reputação de remetente cai.
Qual a diferença entre e-mails de marketing e transacionais?E-mails transacionais são acionados por ações do usuário (compras, cadastros) e vão para um destinatário. E-mails de marketing são campanhas enviadas para muitos destinatários simultaneamente. A Brevo os separa por motivos de entregabilidade e conformidade.
Como adicionar um link de cancelamento de inscrição?A Brevo adiciona automaticamente links de cancelamento de inscrição a e-mails de marketing. Para e-mails transacionais, adicione seu próprio link:
<a href="{{ unsubscribe_url }}">Cancelar inscrição</a>
Posso enviar e-mails do meu próprio domínio?Sim. Configure registros SPF, DKIM e DMARC. A Brevo fornece os valores em Configurações → Remetente & IP. Sem a autenticação adequada, os e-mails podem cair na caixa de spam.
Como agendar e-mails em um fuso horário específico?Use o parâmetro scheduledAt com um timestamp ISO 8601:
{
"scheduledAt": "2026-03-25T09:00:00-05:00"
}
O que acontece se eu atingir o limite de taxa?Você receberá um erro 429. A resposta inclui o cabeçalho X-RateLimit-Reset com os segundos até o reset. Implemente um backoff exponencial ou enfileire os e-mails para mais tarde.
