> 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 categories in batch

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

Create or update multiple ecommerce categories in a single request. The `categories` array accepts up to 100 category objects, each requiring a unique `id`. When `updateEnabled` is `false` (the default), all categories are inserted as new; if any ID already exists, a `400` error is returned. When `updateEnabled` is `true`, existing categories are updated and new ones are created via upsert. Duplicate IDs within the same request payload are rejected. The response returns the count of created and updated categories.

Reference: https://developers.brevo.com/reference/create-update-batch-category

## Authentication

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

## Request

### Body (application/json)

- `categories` (list of object, required) — array of categories objects
  - `id` (string, required) — Unique Category ID as saved in the shop
  - `deletedAt` (string, optional) — UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ) of the category deleted from the shop's database
  - `isDeleted` (boolean, optional) — category deleted from the shop's database
  - `name` (string, optional) — **Mandatory in case of creation**. Name of the Category, as displayed in the shop
  - `url` (string, optional) — URL to the category
- `updateEnabled` (boolean, optional) — Facilitate to update the existing categories in the same request (updateEnabled = true)

## Response

### 201

Category created and updated

- `createdCount` (long, optional) — Number of the new created categories
- `updatedCount` (long, optional) — Number of the existing categories updated

## Examples

**Request**

```json
{
  "categories": [
    {
      "id": "CAT123"
    }
  ]
}
```

**Response**

```json
{
  "createdCount": 2,
  "updatedCount": 7
}
```

**SDK Code**

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

async function main() {
    const client = new BrevoClient({
        apiKey: "YOUR_API_KEY_HERE",
    });
    await client.ecommerce.createUpdateBatchCategory({
        categories: [
            {
                id: "CAT123",
            },
        ],
    });
}
main();

```

```python response
from brevo import Brevo
from brevo.ecommerce import CreateUpdateBatchCategoryRequestCategoriesItem

client = Brevo(
    api_key="YOUR_API_KEY_HERE",
)

client.ecommerce.create_update_batch_category(
    categories=[
        CreateUpdateBatchCategoryRequestCategoriesItem(
            id="CAT123",
        )
    ],
)

```

```php response
<?php

namespace Example;

use Brevo\Brevo;
use Brevo\Ecommerce\Requests\CreateUpdateBatchCategoryRequest;
use Brevo\Ecommerce\Types\CreateUpdateBatchCategoryRequestCategoriesItem;

$client = new Brevo(
    apiKey: 'YOUR_API_KEY_HERE',
);
$client->ecommerce->createUpdateBatchCategory(
    new CreateUpdateBatchCategoryRequest([
        'categories' => [
            new CreateUpdateBatchCategoryRequestCategoriesItem([
                'id' => 'CAT123',
            ]),
        ],
    ]),
);

```

```go response
package main

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

func main() {

	url := "https://api.brevo.com/v3/categories/batch"

	payload := strings.NewReader("{\n  \"categories\": [\n    {\n      \"id\": \"CAT123\"\n    }\n  ]\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 response
require 'uri'
require 'net/http'

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

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  \"categories\": [\n    {\n      \"id\": \"CAT123\"\n    }\n  ]\n}"

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

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

HttpResponse<String> response = Unirest.post("https://api.brevo.com/v3/categories/batch")
  .header("api-key", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"categories\": [\n    {\n      \"id\": \"CAT123\"\n    }\n  ]\n}")
  .asString();
```

```csharp response
using RestSharp;

var client = new RestClient("https://api.brevo.com/v3/categories/batch");
var request = new RestRequest(Method.POST);
request.AddHeader("api-key", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"categories\": [\n    {\n      \"id\": \"CAT123\"\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift response
import Foundation

let headers = [
  "api-key": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = ["categories": [["id": "CAT123"]]] as [String : Any]

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

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