DEV Community

Cover image for Comment utiliser les APIs Brevo pour le SMS Marketing ?
Antoine Laurent
Antoine Laurent

Posted on • Originally published at apidog.com

Comment utiliser les APIs Brevo pour le SMS Marketing ?

EN BREF

Les API Brevo permettent d'automatiser l'envoi d'e-mails marketing, d'e-mails transactionnels et de messages SMS. Authentifiez-vous via une clé API, effectuez les requêtes sur api.brevo.com et utilisez les webhooks pour suivre les livraisons, ouvertures, rebonds et désinscriptions. Pour vérifier vos intégrations, validez les charges utiles et testez les webhooks avec Apidog.

Essayez Apidog dès aujourd’hui

Introduction

Brevo (ex-Sendinblue) délivre chaque jour des millions d’e-mails pour plus de 500 000 entreprises, couvrant campagnes marketing, e-mails transactionnels, SMS et automatisation.

Même si l’envoi d’e-mails via API paraît simple, une intégration robuste doit gérer les rebonds, désinscriptions, délais, et plaintes. Brevo gère ces aspects pour vous.

Principaux cas d’usage API :

  • Campagnes marketing : envoi groupé à des listes
  • E-mails transactionnels : confirmations, notifications, réinitialisations
  • Messages SMS : OTP, alertes, campagnes promotionnelles

💡 Astuce : Pour tester vos intégrations e-mail, Apidog permet de valider les modèles, simuler les réponses de Brevo, tester les webhooks et la gestion des erreurs sans envoyer de vrais e-mails.

Authentification et configuration

Obtenir une clé API

  1. Connectez-vous à Brevo.
  2. Naviguez vers SMTP & API → Clés API.
  3. Créez une clé avec les permissions nécessaires.
  4. Stockez-la de manière sécurisée.

Utilisez la clé dans l’en-tête api-key :

curl -X GET "https://api.brevo.com/v3/account" \
  -H "accept: application/json" \
  -H "api-key: your-api-key-here"
Enter fullscreen mode Exit fullscreen mode

URL de base de l'API

Toutes les requêtes utilisent :

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

Limites de débit

  • Gratuit : 300 requêtes/minute
  • Starter : 600 requêtes/minute
  • Business : 1200 requêtes/minute

Surveillez X-RateLimit-Remaining dans les headers.

Envoi de mails transactionnels

Les e-mails transactionnels sont déclenchés par des actions utilisateur (ex : confirmation de commande).

Envoyer un e-mail simple

curl -X POST "https://api.brevo.com/v3/smtp/email" \
  -H "accept: application/json" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "sender": {
      "name": "Your App",
      "email": "noreply@yourapp.com"
    },
    "to": [
      {
        "email": "user@example.com",
        "name": "John Doe"
      }
    ],
    "subject": "Welcome to Our Platform",
    "htmlContent": "<html><body><h1>Welcome!</h1><p>Thanks for signing up.</p></body></html>",
    "textContent": "Welcome! Thanks for signing up."
  }'
Enter fullscreen mode Exit fullscreen mode

Réponse attendue :

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

Utilisation de modèles

Créez vos modèles dans Brevo, puis envoyez-les via leur ID :

curl -X POST "https://api.brevo.com/v3/smtp/email" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "templateId": 15,
    "to": [
      {
        "email": "user@example.com",
        "name": "John Doe"
      }
    ],
    "params": {
      "name": "John",
      "order_number": "ORD-12345",
      "tracking_url": "https://tracking.example.com/ORD-12345"
    }
  }'
Enter fullscreen mode Exit fullscreen mode

Variables dans le modèle :

<p>Bonjour {{params.name}},</p>
<p>Votre commande {{params.order_number}} a été expédiée.</p>
<p><a href="{{params.tracking_url}}">Suivez votre colis</a></p>
Enter fullscreen mode Exit fullscreen mode

Envoyer avec des pièces jointes

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: 'Your App', email: 'noreply@yourapp.com' },
    to: [{ email: 'user@example.com' }],
    subject: 'Your Invoice',
    htmlContent: '<p>Veuillez trouver votre facture ci-jointe.</p>',
    attachment: [
      {
        name: 'invoice.pdf',
        content: base64EncodedPdfContent
      }
    ]
  })
})
Enter fullscreen mode Exit fullscreen mode

Campagnes marketing

Envoyez des e-mails groupés à des listes, avec gestion automatique des liens de désinscription et gestion des statistiques.

Créer une campagne

curl -X POST "https://api.brevo.com/v3/emailCampaigns" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "name": "Newsletter de Mars",
    "subject": "Nouveautés de Mars",
    "sender": {
      "name": "Votre Marque",
      "email": "newsletter@yourbrand.com"
    },
    "type": "classic",
    "htmlContent": "<html><body>Contenu de la newsletter ici...</body></html>",
    "recipients": {
      "listIds": [12, 15]
    },
    "scheduledAt": "2026-03-25T09:00:00+00:00"
  }'
Enter fullscreen mode Exit fullscreen mode

Envoyer immédiatement

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

Obtenir les statistiques de campagne

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

Réponse :

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

Gestion des contacts

Organisez vos contacts par listes et ajoutez des attributs personnalisés.

Créer un contact

curl -X POST "https://api.brevo.com/v3/contacts" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "email": "new.user@example.com",
    "attributes": {
      "FIRSTNAME": "Jane",
      "LASTNAME": "Smith",
      "PLAN": "premium"
    },
    "listIds": [12, 15],
    "updateEnabled": true
  }'
Enter fullscreen mode Exit fullscreen mode

Avec updateEnabled: true, les contacts existants sont mis à jour.

Obtenir les détails du contact

curl -X GET "https://api.brevo.com/v3/contacts/user@example.com" \
  -H "api-key: your-api-key"
Enter fullscreen mode Exit fullscreen mode

Ajouter à une liste

curl -X POST "https://api.brevo.com/v3/contacts/lists/12/contacts/add" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "emails": ["user1@example.com", "user2@example.com"]
  }'
Enter fullscreen mode Exit fullscreen mode

Retirer d'une liste

curl -X DELETE "https://api.brevo.com/v3/contacts/lists/12/contacts/remove" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "emails": ["user@example.com"]
  }'
Enter fullscreen mode Exit fullscreen mode

Désabonner un contact

curl -X PUT "https://api.brevo.com/v3/contacts/user@example.com" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "emailBlacklisted": true
  }'
Enter fullscreen mode Exit fullscreen mode

Marketing par SMS

Envoyez des SMS transactionnels ou marketing dans le monde entier via l’API.

Envoyer un SMS

curl -X POST "https://api.brevo.com/v3/transactionalSMS/sms" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "sender": "VotreApp",
    "recipient": "+15551234567",
    "content": "Votre code de vérification est : 123456",
    "type": "transactional"
  }'
Enter fullscreen mode Exit fullscreen mode

Envoyer un SMS marketing

curl -X POST "https://api.brevo.com/v3/transactionalSMS/sms" \
  -H "api-key: your-api-key" \
  -H "content-type: application/json" \
  -d '{
    "sender": "VotreMarque",
    "recipient": "+15551234567",
    "content": "Vente flash ! 50% de réduction aujourd''hui seulement. Répondez STOP pour vous désabonner.",
    "type": "marketing"
  }'
Enter fullscreen mode Exit fullscreen mode

Obtenir les statistiques SMS

curl -X GET "https://api.brevo.com/v3/transactionalSMS/statistics?startDate=2026-03-01&endDate=2026-03-31" \
  -H "api-key: your-api-key"
Enter fullscreen mode Exit fullscreen mode

Webhooks pour le suivi

Recevez en temps réel les événements e-mail (livré, ouvert, cliqué, rebondi, désinscrit).

Configurer les webhooks

Dans le dashboard Brevo : Paramètres → Webhooks → Ajouter.

Suivez ces événements :

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

Gérer la charge utile du webhook

app.post('/webhooks/brevo', (req, res) => {
  const event = req.body

  switch (event.event) {
    case 'delivered':
      console.log(`Email ${event.messageId} livré à ${event.email}`)
      break
    case 'opened':
      console.log(`Email ouvert par ${event.email} à ${event.date}`)
      break
    case 'bounced':
      console.log(`Rebond : ${event.email} - ${event.reason}`)
      markContactBounced(event.email)
      break
    case 'spam':
      console.log(`Plainte pour spam de ${event.email}`)
      removeFromAllLists(event.email)
      break
    case 'unsubscribed':
      console.log(`Désinscrit : ${event.email}`)
      break
  }

  res.status(200).send('OK')
})
Enter fullscreen mode Exit fullscreen mode

Tester avec Apidog

Les APIs e-mail sont sensibles aux erreurs et aux cas limites. Apidog facilite la simulation et la validation des charges utiles et webhooks.

Simulation e-mail

1. Simuler l'envoi d'e-mails

Pendant le développement, simulez les réponses pour éviter l’envoi réel :

pm.test('L\'API d\'e-mail accepte une charge utile valide', () => {
  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

Test webhook

2. Tester la gestion des webhooks

Créez une charge utile webhook simulée :

{
  "event": "bounced",
  "email": "invalid@example.com",
  "messageId": "<12345@relay.brevo.com>",
  "reason": "hard_bounce",
  "date": "2026-03-24T12:00:00Z",
  "subject": "Bienvenue sur Notre Plateforme"
}
Enter fullscreen mode Exit fullscreen mode

Envoyez-la à votre endpoint et vérifiez le traitement.

3. Valider les modèles

Stockez vos payloads de modèles et vérifiez les variables :

pm.test('Les variables de modèle sont valides', () => {
  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. Séparation des environnements

# Développement
BREVO_API_KEY: xkeysib-dev-xxx
BREVO_SENDER: dev@yourapp.com

# Production
BREVO_API_KEY: xkeysib-prod-xxx
BREVO_SENDER: noreply@yourapp.com
Enter fullscreen mode Exit fullscreen mode

Testez les API Brevo avec Apidog gratuitement.

Erreurs courantes et corrections

400 Bad Request - Champ requis manquant

Cause : Payload incomplet.

Correction : Vérifiez l’erreur retournée :

{
  "code": "invalid_parameter",
  "message": "sender.email est requis"
}
Enter fullscreen mode Exit fullscreen mode

401 Non autorisé

Cause : Clé API invalide ou absente.

Correction : Vérifiez l’en-tête api-key et la validité de la clé.

402 Paiement requis

Cause : Limite atteinte ou manque de crédits.

Correction :

  • Pour e-mails : vérifiez votre quota
  • Pour SMS : achetez des crédits

429 Trop de requêtes

Cause : Dépassement de la limite.

Correction : Implémentez un backoff exponentiel :

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 débit dépassée')
}
Enter fullscreen mode Exit fullscreen mode

404 Contact non trouvé

Cause : Mise à jour d’un contact inexistant.

Correction : Utilisez updateEnabled: true à la création :

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

Alternatives et comparaisons

Fonctionnalité Brevo SendGrid Mailchimp Postmark
Tarification 300 e-mails/jour gratuits 100 e-mails/jour gratuits 500 e-mails/mois gratuits 100 e-mails/mois gratuits
E-mails marketing Oui Oui Oui Non
E-mails transactionnels Oui Oui Limité Oui (spécialisé)
SMS Oui Non Non Non
Automatisation Oui Oui Oui Limitée
Éditeur de modèles Visuel + code Code Visuel Code

Brevo se distingue par l’envoi combiné e-mail/SMS à des tarifs compétitifs.

Cas d'utilisation réels

  • E-commerce : confirmations de commande, notifications d’expédition, relance panier, campagnes promos – tout via la même API.
  • Onboarding SaaS : e-mails de bienvenue, réinitialisations, invitations d’équipe (transactionnel), annonces de fonctionnalités (marketing).
  • Vérification SMS : une app fintech utilise l’API SMS Brevo pour 2FA et gère les échecs via webhook.

Conclusion

Synthèse opérationnelle :

  • Brevo gère marketing, transactionnel et SMS via API.
  • Authentifiez chaque requête avec api-key.
  • Utilisez des modèles pour la cohérence.
  • Exploitez listes et attributs pour cibler vos campagnes.
  • Branchez les webhooks pour suivre la délivrabilité.
  • Testez avec Apidog avant la mise en production.

Vos prochaines étapes :

  1. Créez un compte Brevo et récupérez une clé API.
  2. Envoyez un e-mail transactionnel test.
  3. Définissez un modèle avec l’éditeur.
  4. Ajoutez la gestion des webhooks rebonds/désinscriptions.
  5. Validez vos flux API avec Apidog en dev.

Testez les API d'e-mail Brevo avec Apidog gratuitement.

FAQ

Quelle est la différence entre Brevo et Sendinblue ?

Même produit, nouveau nom (depuis 2023). Les API sont sur api.brevo.com, mais la doc peut encore mentionner Sendinblue.

Combien d'e-mails puis-je envoyer gratuitement ?

300/jour sur le plan gratuit (9000/mois). Plus ? Passez sur un plan payant dès 25 $/mois pour 20 000 e-mails.

Puis-je utiliser Brevo pour les e-mails froids ?

Techniquement oui, mais c’est risqué (rebonds, spam). Brevo surveille la réputation expéditeur. Un taux de plainte élevé = suspension. Échauffez le domaine et respectez les bonnes pratiques.

Comment gérer les rebonds d'e-mails ?

Utilisez le webhook bounced. Supprimez les rebonds durs, réessayez les doux. Si le taux > 5%, votre réputation baisse.

Différence entre e-mails marketing et transactionnels ?

Transactionnel = 1 utilisateur, action déclenchée (commande, inscription). Marketing = campagne massive. Brevo sépare pour conformité/livrabilité.

Comment ajouter un lien de désinscription ?

Brevo l’ajoute d’office sur les e-mails marketing. Pour du transactionnel, ajoutez :

<a href="{{ unsubscribe_url }}">Se désinscrire</a>
Enter fullscreen mode Exit fullscreen mode

Puis-je envoyer des e-mails depuis mon propre domaine ?

Oui, configurez SPF, DKIM, DMARC dans Paramètres → Expéditeur & IP. Sans ça, risque de spam.

Programmer des e-mails dans un fuseau spécifique ?

Utilisez scheduledAt avec un ISO 8601 :

{
  "scheduledAt": "2026-03-25T09:00:00-05:00"
}
Enter fullscreen mode Exit fullscreen mode

Que se passe-t-il si j'atteins la limite de débit ?

Erreur 429, avec header X-RateLimit-Reset. Implémentez un backoff ou mettez en queue.

Top comments (0)