> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developers.brevo.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developers.brevo.com/_mcp/server.

# Create and Send a WhatsApp campaign

POST https://api.brevo.com/v3/whatsappCampaigns
Content-Type: application/json

You can use this API for WhatsApp only if you have setup your WhatsApp account on Brevo platform. To setup your WhatsApp account, follow the steps in the guide below.
[Activating Whatsapp](https://developers.brevo.com/docs/whatsapp-campaigns-1) in your accountThis API requires the List and Segment ids as recipients in Body params.You can use the below Contact endpoints to get the required information.
[Get all the Lists](https://developers.brevo.com/reference/getlists-1)
[Get all the Segments](https://developers.brevo.com/reference/getsegments)

Reference: https://developers.brevo.com/reference/create-whats-app-campaign

## Authentication

- `api-key` header (required) — The API key should be passed in the request headers as `api-key` for authentication.

## Request

### Body (application/json)

This endpoint expects an object.

- `name` (string, required) — Name of the WhatsApp campaign creation
- `recipients` (object, required) — Segment ids and List ids to include/exclude from campaign
  - `excludedListIds` (list of long, optional) — List ids to exclude from the campaign
  - `listIds` (list of long, optional) — **Mandatory if scheduledAt is not empty**. List Ids to send the campaign to
  - `segments` (list of long, optional) — **Mandatory if listIds are not used**. Segment ids to send the campaign to.
- `scheduledAt` (string, required) — Sending UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). **Prefer to pass your timezone in date-time format for accurate result.For example: **2017-06-01T12:30:00+02:00**
- `templateId` (integer, required) — Id of the WhatsApp template in **approved** state

## Response

### 201

successfully created

- `id` (long, required) — ID of the object created

## Errors

### 400 Bad Request Error

bad request

- `code` (enum, required) — Error code displayed in case of a failure
  - Allowed values: `invalid_parameter`, `missing_parameter`, `out_of_range`, `campaign_processing`, `campaign_sent`, `document_not_found`, `not_enough_credits`, `permission_denied`, `duplicate_parameter`, `duplicate_request`, `method_not_allowed`, `unauthorized`, `account_under_validation`, `not_acceptable`, `bad_request`, `unprocessable_entity`, `Domain does not exist`, `Contact email not found`, `Attribute not found`, `Category id not found`, `Invalid parameters passed`, `Record(s) for identifier not found`, `Returned when query params are invalid`, `Returned when invalid data posted`, `Feed not found`, `Campaign ID not found`, `api-key not found`, `DMARC policy requires domain authentication`, `DNS records not properly configured`, `Invalid OTP code provided`, `OTP code has expired`, `Domain already exists in your account`, `The sum of all IP weights must equal 100`, `Authentication failed`, `Insufficient credits`, `Request already processed`
- `message` (string, required) — Readable message associated to the failure

## Examples

**Request**

```json
{
  "name": "Test Campaign",
  "scheduledAt": "2017-06-01T12:30:00+02:00",
  "templateId": 19
}
```

**Response**

```json
{
  "id": 5
}
```

**SDK Code**

```typescript
import { BrevoClient } from "@getbrevo/brevo";

async function main() {
    const client = new BrevoClient({
        apiKey: "YOUR_API_KEY_HERE",
    });
    await client.whatsAppCampaigns.createWhatsAppCampaign({
        name: "Test Campaign",
        scheduledAt: "2017-06-01T12:30:00+02:00",
        templateId: 19,
    });
}
main();

```

```python
from brevo import Brevo

client = Brevo(
    api_key="YOUR_API_KEY_HERE",
)

client.whats_app_campaigns.create_whats_app_campaign(
    name="Test Campaign",
    scheduled_at="2017-06-01T12:30:00+02:00",
    template_id=19,
)

```

```php
<?php

namespace Example;

use Brevo\Brevo;
use Brevo\WhatsAppCampaigns\Requests\CreateWhatsAppCampaignRequest;

$client = new Brevo(
    apiKey: 'YOUR_API_KEY_HERE',
);
$client->whatsAppCampaigns->createWhatsAppCampaign(
    new CreateWhatsAppCampaignRequest([
        'name' => 'Test Campaign',
        'scheduledAt' => '2017-06-01T12:30:00+02:00',
        'templateId' => 19,
    ]),
);

```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.brevo.com/v3/whatsappCampaigns"

	payload := strings.NewReader("{\n  \"name\": \"Test Campaign\",\n  \"scheduledAt\": \"2017-06-01T12:30:00+02:00\",\n  \"templateId\": 19\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("api-key", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.brevo.com/v3/whatsappCampaigns")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["api-key"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"name\": \"Test Campaign\",\n  \"scheduledAt\": \"2017-06-01T12:30:00+02:00\",\n  \"templateId\": 19\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.brevo.com/v3/whatsappCampaigns")
  .header("api-key", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"name\": \"Test Campaign\",\n  \"scheduledAt\": \"2017-06-01T12:30:00+02:00\",\n  \"templateId\": 19\n}")
  .asString();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.brevo.com/v3/whatsappCampaigns");
var request = new RestRequest(Method.POST);
request.AddHeader("api-key", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"name\": \"Test Campaign\",\n  \"scheduledAt\": \"2017-06-01T12:30:00+02:00\",\n  \"templateId\": 19\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "api-key": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [
  "name": "Test Campaign",
  "scheduledAt": "2017-06-01T12:30:00+02:00",
  "templateId": 19
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.brevo.com/v3/whatsappCampaigns")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```