DEV Community

Cover image for Como Usar APIs Brevo (ex Sendinblue) para SMS Marketing?
Lucas
Lucas

Posted on • Originally published at apidog.com

Como Usar APIs Brevo (ex Sendinblue) para SMS Marketing?

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.

Experimente o Apidog hoje

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

  1. Faça login na Brevo
  2. Acesse SMTP & API → Chaves de API
  3. Crie uma nova chave com permissões adequadas
  4. 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"
Enter fullscreen mode Exit fullscreen mode

URL base da API

Use sempre:

https://api.brevo.com/v3/
Enter fullscreen mode Exit fullscreen mode

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."
  }'
Enter fullscreen mode Exit fullscreen mode

Resposta esperada:

{
  "messageId": "<20260324123456.123456@relay.brevo.com>"
}
Enter fullscreen mode Exit fullscreen mode

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"
    }
  }'
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

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
      }
    ]
  })
})
Enter fullscreen mode Exit fullscreen mode

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"
  }'
Enter fullscreen mode Exit fullscreen mode

Enviar imediatamente

curl -X POST "https://api.brevo.com/v3/emailCampaigns/{campaignId}/sendNow" \
  -H "api-key: sua-chave-api"
Enter fullscreen mode Exit fullscreen mode

Obter estatísticas da campanha

curl -X GET "https://api.brevo.com/v3/emailCampaigns/{campaignId}" \
  -H "api-key: sua-chave-api"
Enter fullscreen mode Exit fullscreen mode

Resposta:

{
  "statistics": {
    "delivered": 4850,
    "opened": 1455,
    "clicked": 291,
    "unsubscribed": 12,
    "bounces": 150
  }
}
Enter fullscreen mode Exit fullscreen mode

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
  }'
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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"]
  }'
Enter fullscreen mode Exit fullscreen mode

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"]
  }'
Enter fullscreen mode Exit fullscreen mode

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
  }'
Enter fullscreen mode Exit fullscreen mode

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"
  }'
Enter fullscreen mode Exit fullscreen mode

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"
  }'
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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:

  • delivered
  • opened
  • clicked
  • bounced
  • spam
  • unsubscribed

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')
})
Enter fullscreen mode Exit fullscreen mode

Testando com Apidog

APIs de e-mail têm casos de falha complexos. Teste modelos, bounces e webhooks usando Apidog.

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>/)
})
Enter fullscreen mode Exit fullscreen mode

Apidog

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"
}
Enter fullscreen mode Exit fullscreen mode

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')
})
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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"
}
Enter fullscreen mode Exit fullscreen mode

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')
}
Enter fullscreen mode Exit fullscreen mode

404 Contato não encontrado

Causa: Contato não existe.

Solução: Use updateEnabled: true ao criar contatos:

{
  "email": "novo@example.com",
  "updateEnabled": true
}
Enter fullscreen mode Exit fullscreen mode

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-key para 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:

  1. Crie conta na Brevo e obtenha uma chave de API
  2. Envie um e-mail transacional
  3. Crie um modelo no editor visual
  4. Implemente handlers de webhook para bounces/cancelamentos
  5. 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>
Enter fullscreen mode Exit fullscreen mode

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"
}
Enter fullscreen mode Exit fullscreen mode

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)