TL;DR
As APIs da Brevo permitem o envio programático de e-mails de marketing, e-mails transacionais e SMS. Autentique-se com uma chave de API, envie requisições para api.brevo.com e use webhooks para rastrear entrega e engajamento. Para testar, utilize o Apidog para validar payloads, testar handlers de webhook e garantir que sua integração lida corretamente com bounces e cancelamentos de inscrição.
Introdução
A Brevo (antes Sendinblue) processa milhões de e-mails diariamente para mais de 500.000 empresas, gerenciando campanhas de marketing, e-mails transacionais, SMS e automações.
Apesar da simplicidade aparente das APIs de e-mail, sistemas em produção precisam lidar com bounces, reclamações de spam, cancelamentos de inscrição e entrega. A Brevo abstrai essas complexidades.
Principais casos de uso da API:
- Campanhas de marketing: envio em massa para listas
- E-mails transacionais: redefinição de senha, confirmações, notificações
- Mensagens SMS: códigos de verificação, alertas, marketing
💡 Se você está integrando e-mail no seu app, o Apidog facilita testar modelos, validar payloads de webhook e garantir funcionamento em todos os clientes. Simule respostas da Brevo e teste erros sem enviar e-mails reais.
Autenticação e configuração
Obter uma chave de API
- Faça login na Brevo
- Acesse SMTP & API → Chaves de API
- Crie uma nova chave com permissões adequadas
- Armazene-a em local seguro
Inclua a chave de API no header 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
Use sempre:
https://api.brevo.com/v3/
Limites de taxa
Os limites variam por plano:
- Grátis: 300 req/min
- Starter: 600 req/min
- Business: 1200 req/min
Acompanhe pelo header X-RateLimit-Remaining.
Envio de e-mails transacionais
E-mails transacionais são enviados individualmente, acionados por eventos do usuário (ex: reset de senha, confirmação de pedido).
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 esperada:
{
"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"
}
}'
No template:
<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
Para envio em massa, utilize campanhas com agendamento, links de cancelamento e análise.
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"
Resposta:
{
"statistics": {
"delivered": 4850,
"opened": 1455,
"clicked": 291,
"unsubscribed": 12,
"bounces": 150
}
}
Gerenciamento de contatos
Organize contatos 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
}'
updateEnabled: true atualiza contatos existentes.
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
Envie SMS globalmente via API.
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 app sobre eventos: entregue, aberto, clicado, bounce, cancelado.
Configurar webhooks
No painel Brevo: Configurações → Webhooks → Adicionar webhook
Eventos:
deliveredopenedclickedbouncedspamunsubscribed
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}`)
markContactBounced(event.email)
break
case 'spam':
console.log(`Reclamação de spam de ${event.email}`)
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 casos de falha complexos. Teste modelos, bounces e webhooks usando Apidog.
1. Simular envio de e-mail
Durante o desenvolvimento, não envie e-mails reais. Simule respostas da API:
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
Envie payloads 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 seu endpoint e verifique o tratamento.
3. Validar modelos
Armazene payloads e teste substituição de variáveis:
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 faltando campos obrigatórios.
Solução: Verifique a mensagem de erro:
{
"code": "invalid_parameter",
"message": "sender.email é obrigatório"
}
401 Não autorizado
Causa: API key inválida ou ausente.
Solução: Confirme o header api-key e se a chave está ativa.
402 Pagamento Necessário
Causa: Limite excedido ou falta de créditos.
Solução:
- E-mail: revise limites do plano
- SMS: compre créditos
429 Muitas Solicitações
Causa: Limite de taxa excedido.
Solução: Implemente 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: Contato não existe.
Solução: Use updateEnabled: true ao criar contatos:
{
"email": "novo@example.com",
"updateEnabled": true
}
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 por suporte combinado de e-mail e SMS a preços competitivos.
Casos de uso reais
E-commerce: Confirmação de pedido, notificação de envio, recuperação de carrinho e promoções via Brevo — tudo em uma integração.
Onboarding SaaS: E-mails de boas-vindas, redefinições de senha e convites via API transacional; anúncios por e-mail marketing para opt-ins.
Verificação por SMS: Aplicativos fintech usam o SMS da Brevo para códigos 2FA, com webhooks para rastrear falhas e lógica de retry.
Conclusão
Resumo prático:
- APIs da Brevo cobrem marketing, e-mails transacionais e SMS
- Use o header
api-keypara autenticação - Modelos facilitam consistência e manutenção dos e-mails
- Gerencie contatos, listas e atributos para campanhas direcionadas
- Webhooks rastreiam entrega, abertura, clique e bounces
- Teste tudo com Apidog antes de colocar em produção
Próximos passos:
- Crie conta na Brevo e obtenha uma chave de API
- Envie um e-mail transacional
- Crie um modelo no editor visual
- Implemente handlers de webhook para bounces/cancelamentos
- 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 virou Brevo em 2023. As APIs continuam em api.brevo.com.
Quantos e-mails posso enviar gratuitamente?
300 e-mails/dia no plano grátis (9.000/mês). Para mais, faça upgrade.
Posso usar a Brevo para cold emails?
Tecnicamente sim, mas é arriscado. Altas taxas de bounce/spam podem suspender contas. Aqueça o domínio e siga boas práticas.
Como lidar com bounces?
Monitore webhooks de bounced. Hard bounces: remova o contato. Soft bounces: tente novamente. Se a taxa passar de 5%, sua reputação cai.
Qual a diferença entre marketing e transacional?
Transacional: acionado por ações do usuário, para um destinatário. Marketing: campanhas para muitos. A Brevo separa para entregabilidade.
Como adicionar link de descadastro?
A Brevo adiciona automaticamente em e-mails de marketing. Para transacional, adicione manualmente:
<a href="{{ unsubscribe_url }}">Cancelar inscrição</a>
Posso enviar do meu domínio?
Sim. Configure SPF, DKIM e DMARC. Acesse Configurações → Remetente & IP para detalhes.
Como agendar e-mail em fuso específico?
Use o parâmetro scheduledAt com timestamp ISO 8601:
{
"scheduledAt": "2026-03-25T09:00:00-05:00"
}
O que acontece se atingir o limite de taxa?
Receberá erro 429 e header X-RateLimit-Reset com segundos até o reset. Implemente backoff exponencial ou fila.


Top comments (0)