> 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.

# Creates an SMS campaign

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

Create a new SMS campaign with the required name, sender, and content fields. The sender name is limited to 11 alphanumeric characters or 15 numeric characters, and the content should stay within 160 characters per SMS segment. If a scheduledAt date is provided, listIds in recipients become mandatory; accounts under validation are limited to 4 total campaigns and campaigns with more than 10 recipients will be saved as draft.

Reference: https://developers.brevo.com/reference/create-sms-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.

- `content` (string, required) — Content of the message. The **maximum characters used per SMS is 160**, if used more than that, it will be counted as more than one SMS.
- `name` (string, required) — Name of the campaign
- `sender` (string, required) — Name of the sender. **The number of characters is limited to 11 for alphanumeric characters and 15 for numeric characters**
- `organisationPrefix` (string, optional) — A recognizable prefix will ensure your audience knows who you are. Recommended by U.S. carriers. This will be added as your Brand Name before the message content. **Prefer verifying maximum length of 160 characters including this prefix in message content to avoid multiple sending of same sms.**
- `recipients` (object, optional)
  - `listIds` (list of long, required) — Lists Ids to send the campaign to. **REQUIRED if scheduledAt is not empty**
  - `exclusionListIds` (list of long, optional) — List ids which have to be excluded from a campaign
- `scheduledAt` (string, optional) — UTC date-time on which the campaign has to run (YYYY-MM-DDTHH:mm:ss.SSSZ). **Prefer to pass your timezone in date-time format for accurate result.**
- `unicodeEnabled` (boolean, optional, default: false) — Format of the message. It indicates whether the content should be treated as unicode or not.
- `unsubscribeInstruction` (string, optional) — Instructions to unsubscribe from future communications. Recommended by U.S. carriers. Must include **STOP** keyword. This will be added as instructions after the end of message content. **Prefer verifying maximum length of 160 characters including this instructions in message content to avoid multiple sending of same sms.**

## 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
{
  "content": "Get a discount by visiting our NY store and saying : Happy Spring!",
  "name": "Spring Promo Code",
  "sender": "MyShop"
}
```

**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.smsCampaigns.createSmsCampaign({
        content: "Get a discount by visiting our NY store and saying : Happy Spring!",
        name: "Spring Promo Code",
        sender: "MyShop",
    });
}
main();

```

```python
from brevo import Brevo

client = Brevo(
    api_key="YOUR_API_KEY_HERE",
)

client.sms_campaigns.create_sms_campaign(
    content="Get a discount by visiting our NY store and saying : Happy Spring!",
    name="Spring Promo Code",
    sender="MyShop",
)

```

```php
<?php

namespace Example;

use Brevo\Brevo;
use Brevo\SmsCampaigns\Requests\CreateSmsCampaignRequest;

$client = new Brevo(
    apiKey: 'YOUR_API_KEY_HERE',
);
$client->smsCampaigns->createSmsCampaign(
    new CreateSmsCampaignRequest([
        'content' => 'Get a discount by visiting our NY store and saying : Happy Spring!',
        'name' => 'Spring Promo Code',
        'sender' => 'MyShop',
    ]),
);

```

```go
package main

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

func main() {

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

	payload := strings.NewReader("{\n  \"content\": \"Get a discount by visiting our NY store and saying : Happy Spring!\",\n  \"name\": \"Spring Promo Code\",\n  \"sender\": \"MyShop\"\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/smsCampaigns")

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  \"content\": \"Get a discount by visiting our NY store and saying : Happy Spring!\",\n  \"name\": \"Spring Promo Code\",\n  \"sender\": \"MyShop\"\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/smsCampaigns")
  .header("api-key", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"content\": \"Get a discount by visiting our NY store and saying : Happy Spring!\",\n  \"name\": \"Spring Promo Code\",\n  \"sender\": \"MyShop\"\n}")
  .asString();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.brevo.com/v3/smsCampaigns");
var request = new RestRequest(Method.POST);
request.AddHeader("api-key", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"content\": \"Get a discount by visiting our NY store and saying : Happy Spring!\",\n  \"name\": \"Spring Promo Code\",\n  \"sender\": \"MyShop\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "api-key": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [
  "content": "Get a discount by visiting our NY store and saying : Happy Spring!",
  "name": "Spring Promo Code",
  "sender": "MyShop"
] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://api.brevo.com/v3/smsCampaigns")! 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()
```