Platform
Chatbot Builder Bulk Messaging Team Inbox Mini CRM API & Webhooks AI Integration WhatsApp Flows
Industries
E-commerce & D2C Real Estate Education Healthcare Finance & BFSI Logistics Hospitality Retail
Integrations 📚 Learn 📝 Blog 🗂 Codex Pricing Start Free Trial →
HomeConnect › Connect Brevo to WhatsApp
Brevo Integration Guide · Marketing / Email

Connect Brevo to WhatsApp

Add every WhatsApp opt-in to your Brevo contact list automatically, look up whether a customer is already subscribed before sending a campaign, and keep both channels in sync without any manual CSV work.

Published 23 June 2026  ·  6 min read  ·  Marketing / Email

Before following this guide, read the External API Request step foundation guide. It covers every field in the step interface so this guide can stay focused on Brevo-specific values.

Brevo uses api-key as the header name, not Authorization

Unlike most APIs in this series that use Authorization: Bearer or Authorization: Basic, Brevo uses a custom header: api-key: YOUR_API_KEY. The header name is literally api-key. Using Authorization will return a 401 error.

Step 1: Generate your Brevo API key

1
Go to app.brevo.com and log in.
2
Click your profile name (top right) → SMTP & APIAPI Keys tab.
3
Click Generate a new API key. Give it a name such as "WA.Expert". Copy the key immediately. It is shown only once.
Official docs

Brevo API v3 reference: developers.brevo.com

Step 2: Get your Contact List ID

Brevo organises contacts into lists. List IDs are integers. Fetch them once and store the ID of the list you want WhatsApp opt-ins to join.

External API Request Step · WA.Expert
Select Method
GET
Request URL
https://api.brevo.com/v3/contacts/lists
Select Auth Type
No Auth (api-key header below)
Header Parameters
api-keyYOUR_BREVO_API_KEY
Content-Typeapplication/json
Acceptapplication/json
Select Body Type
None (GET, no body)
Choose Response Type
JSON
GET /contacts/lists response
{{
  "lists": [
    {{
      "id": 2,
      "name": "WhatsApp Opt-Ins",
      "totalSubscribers": 1204,
      "folderId": 1
    }}
  ],
  "count": 1
}}

Copy: lists[0].id = 2  (integer, not a string)
Use this integer in the listIds array when adding contacts.

Step 3: Add a WhatsApp opt-in contact to Brevo

When a customer opts in on WhatsApp, push their details to Brevo in the same automation flow. Setting updateEnabled: true makes this an upsert: creates if new, updates if they already exist.

External API Request Step · WA.Expert
Select Method
POST
Request URL
https://api.brevo.com/v3/contacts
Select Auth Type
No Auth (api-key header below)
Header Parameters
api-keyYOUR_BREVO_API_KEY
Content-Typeapplication/json
Acceptapplication/json
Select Body Type
JSON
Body
{{"email":"{{{{customer_email}}}}","attributes":{{"FIRSTNAME":"{{{{customer_name}}}}","PHONE":"{{{{customer_phone}}}}"}},"listIds":[2],"updateEnabled":true}}
Choose Response Type
JSON
POST /contacts body and response
Body:
{{
  "email":         "{{customer_email}}",
  "attributes": {{
    "FIRSTNAME": "{{customer_name}}",
    "PHONE":     "{{customer_phone}}"
  }},
  "listIds":       [2],
  "updateEnabled": true
}}

Response (new contact created):
{{"id": 42}}

Response (existing contact updated):
HTTP 204 No Content (empty body, success)

Key points:
  - attributes keys are UPPERCASE (FIRSTNAME, LASTNAME, PHONE)
  - listIds is an array of integers [2], not strings
  - updateEnabled: true prevents 400 on duplicate email
  - 204 No Content on update is normal and means success
Attribute names are UPPERCASE

Brevo predefined contact attributes use all-caps names: FIRSTNAME, LASTNAME, PHONE, COMPANY. Custom attributes use whatever case you defined in the Brevo dashboard. Always match the case exactly or the field will be silently ignored.

Step 4: Look up a contact by email

To check whether a WhatsApp contact is already in your Brevo list before deciding what to send them, fetch their contact record by email address.

External API Request Step · WA.Expert
Select Method
GET
Request URL
https://api.brevo.com/v3/contacts/{{{{customer_email}}}}
Select Auth Type
No Auth (api-key header below)
Header Parameters
api-keyYOUR_BREVO_API_KEY
Acceptapplication/json
Select Body Type
None (GET, no body)
Choose Response Type
JSON
GET /contacts/{email} response
{{
  "id": 42,
  "email": "priya@example.com",
  "attributes": {{
    "FIRSTNAME": "Priya",
    "PHONE":     "+919820000001"
  }},
  "listIds": [2, 5],
  "emailBlacklisted": false,
  "smsBlacklisted":   false,
  "createdAt": "2026-06-01T10:00:00Z"
}}

Map: id, email, attributes.FIRSTNAME, listIds, emailBlacklisted
If contact not found: Brevo returns HTTP 404.

Map these response paths to WhatsApp variables:

Variable nameResponse pathExample value
contact_idid42
contact_nameattributes.FIRSTNAMEPriya
contact_listslistIds[2, 5]
is_blacklistedemailBlacklistedfalse

If emailBlacklisted is true, Brevo will not send campaigns to this address. Check this before using their email for outreach.

Worked example: WhatsApp opt-in sync flow

Automation flow — sync WhatsApp opt-in to Brevo
Trigger: Customer messages 'JOIN' on WhatsApp.

Bot asks: 'Share your email to receive our newsletter.'
Customer: priya@example.com
Stored as {{customer_email}}, {{customer_name}} already captured.

Step 1 — Check existing (GET /contacts/email):
GET https://api.brevo.com/v3/contacts/priya@example.com
api-key: YOUR_API_KEY

Response: HTTP 200 -> contact exists; HTTP 404 -> new contact

Conditions:
  HTTP 200 -> 'You are already on our list. Thank you!'
  HTTP 404 -> run Step 2

Step 2 — Add contact (POST /contacts):
POST https://api.brevo.com/v3/contacts
api-key: YOUR_API_KEY
Body: {{email: 'priya@example.com', attributes: {{FIRSTNAME: 'Priya'}},
        listIds: [2], updateEnabled: true}}

Response: {{id: 42}} or HTTP 204

Bot replies:
'You are now subscribed, Priya! You will receive our latest updates
at priya@example.com.'

Troubleshooting

SymptomLikely causeFix
401 UnauthorizedWrong header name or invalid keyUse api-key as the header name, not Authorization. Confirm the key value is correct and was not truncated.
400 on POST: duplicate contactupdateEnabled not setAdd updateEnabled: true to the POST body. This makes the call an upsert instead of a create-only.
Attribute value not savedWrong attribute name caseBrevo attribute names are case-sensitive. Use FIRSTNAME, LASTNAME, PHONE exactly. Custom attributes must match the name you defined in the dashboard.
listIds not workingPassing string instead of integerList IDs must be integers in the array: [2], not ['2']. Copy the integer id from GET /contacts/lists.
404 on contact lookupContact not in BrevoContact does not exist yet. Use the POST step to add them. A 404 here is expected for new contacts.
204 No Content on updateNormal success responseA 204 on POST /contacts with updateEnabled: true means the existing contact was updated successfully. It is not an error.

Common questions

What header does Brevo use for auth?
+
api-key: YOUR_API_KEY. The header name is literally api-key, not Authorization. This is unique to Brevo.
Where do I find my API key?
+
app.brevo.com -> profile name -> SMTP and API -> API Keys tab -> Generate a new API key. Copy immediately; shown only once.
Why does my contact update return a 400 duplicate error?
+
Set updateEnabled: true in the POST body. Without it, Brevo rejects any email that already exists in your account.
What format are list IDs in?
+
Integers, not strings. Pass [2] not ['2']. Get IDs from GET /v3/contacts/lists.
Can I look up a contact by email?
+
Yes. GET /v3/contacts/{email} returns the full contact record. Returns 404 if the contact does not exist.
Does this incur extra WA.Expert charges?
+
One automation action per External API Request call. Included on the Complete plan. Starter: from Rs. 49 per 1,000 actions.

Connect Mailchimp to WhatsApp

Mailchimp API: data centre prefix, anystring Basic Auth, subscriber sync.

Read guide →

Connect Klaviyo to WhatsApp

Klaviyo API: Bearer token, profile lookup, list subscription.

Read guide →

External API Request Step

Master every field in WA.Expert's HTTP action step.

Read foundation guide →

Connect Brevo to WhatsApp today

Free trial, no credit card. If you get stuck, we answer live on WhatsApp.

Start Free Trial → Book a Demo
1