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

# Node.js SDK Changelog

## August 10, 2026 — v6.0.3

### Added

* **Email Campaigns — UTM parameter customization** — `POST /emailCampaigns` and `PUT /emailCampaigns/{campaignId}` now accept optional `utmCampaign`, `utmContent`, and `utmTerm` fields to customize UTM tracking parameters in outgoing links. Campaign retrieval endpoints return these values along with `utmID`, `utmMedium`, and `utmSource` when UTM tracking is enabled.
* **Transactional Email — per-contact pixel tracking consent** — `POST /smtp/email` now accepts optional `contactPixelTrackingConsent` boolean field on individual recipients (`to`, `cc`, `bcc`, and `messageVersions` arrays) to control whether opens are tracked identifiably (`true`) or anonymized (`false`). When the per-contact pixel tracking consent feature is enabled for your account, this field determines tracking behavior per recipient.

Backward-compatible patch release. No breaking changes.

## July 3, 2026 — v6.0.2

### Added

* **Consent Groups Management** — new endpoints for managing contact consent groups:
  * `GET /contacts/consent-groups` — list all consent groups
  * `POST /contacts/consent-groups` — create a consent group
  * `GET /contacts/consent-groups/{id}` — retrieve consent group details
  * `PUT /contacts/consent-groups/{id}` — update consent group (name, description, signup mode)
  * `DELETE /contacts/consent-groups/{id}` — delete a consent group
* **Consent group support in contact operations** — `POST /contacts/import` now accepts optional `consentGroupIds` to add imported contacts to specified groups
* **Contact details enhancement** — `GET /contacts/{identifier}` now returns `consentGroups` array showing each group and subscription status (when feature enabled)
* **Wallet pass installation URLs** — `GET /wallet/passes/{passId}/installUrl/{contactId}` generates per-contact installation URLs for Apple Wallet and Google Wallet integration

### Fixed

* **Empty JSON object serialization** — `JsonSerializableType` now correctly serializes empty objects to `{}` instead of `[]`. Previously, objects with all optional properties unset would serialize as empty arrays, causing backend validation errors on strict type checkers. This affected both top-level objects and nested objects within parent types. The fix ensures proper JSON structure for all empty serializable objects.

Backward-compatible patch release. No breaking changes.

## May 14, 2026 — v6.0.0

### Breaking changes

* ⚠️ **`client.companies.getCompanies({ filters })`** — the `filters` parameter is renamed to the bracketed literal `"filters[attributes.name]"`. The old name still compiles but the filter is silently dropped server-side and you get an unfiltered list.
* **`client.event.createBatchEvents`** — events are now wrapped in `{ events: [...] }` instead of being passed as a raw array.
* **`client.balance.getActiveBalancesApi`** — response type replaced (`BalanceLimit` → `GetLoyaltyBalanceProgramsPidActiveBalanceResponse`); request parameters renamed from snake\_case to camelCase (`contact_id` → `contactId`, `balance_definition_id` → `balanceDefinitionId`, `sort_field` → `sortField`).
* **`client.balance.getContactBalances`** — new required `balanceDefinitionId` parameter.
* **`client.tasks.getCrmTasktypes`** — return type changed from a single object to `GetCrmTasktypesResponseItem[]`.
* Model fields removed: `GetWebhook.channel`, `GetProcessResponseInfo.export`, `GetEventsList.events[].source`, `GetExtendedCampaignOverview.utmIDActive` (replaced by `utmID: number`).
* Renamed: `ConversationsMessage.File.filename` → `name`, `.url` → `link`; `SendTransacSms.tag` is now `string | string[]` (was `{ field?: ... }`).
* Now-required fields on type literals: `GetContactDetails.whatsappBlacklisted`, `Note.text`, `Task.date`.

### Added

* `BrevoClient` accepts a new `auth` option for custom `AuthProvider` injection (existing `apiKey` continues to work unchanged).
* New optional fields and filters across `contacts.createContact`, `contacts.updateContact`, `emailCampaigns.getEmailCampaigns`, `ecommerce.getProducts`, and several other endpoints.

See the [Upgrading from v5.x guide](https://github.com/getbrevo/brevo-node#upgrading-from-v5x) for migration details and a one-line rollback pin.

## April 10, 2026 — v5.0.5

### Fixed

* **Process endpoints** — `duplicate_email_id` is now typed as a string (URL to a CSV file) instead of an integer. The legacy `in_process` status value is now handled correctly.
* **Event endpoints** — `contact_properties` and `event_properties` now accept boolean values in `createEvent` and `createBatchEvents`.
* **Contact endpoints** — `attributes` now accepts plain integers in `createContact` and `updateContact`.

## March 25, 2026 — v5.0.3

### Added

* `client.event.getEvents()` — retrieve a paginated list of custom events, filterable by `contact_id`, `event_name`, `object_type`, `startDate`, and `endDate`.
* `client.event.createBatchEvents()` — send multiple events in a single request. Returns a `BatchAcceptedResponse` with a confirmation message and queued event count.
* `client.companies.deleteAnAttribute()` — delete a CRM attribute by ID.
* `PatchCrmAttributesIdRequest` — update a CRM attribute's display label and selectable option labels, scoped to `companies` or `deals`.
* `GetProductDetails` response now includes `brand` and `description`.
* `CreateUpdateProductRequest` and batch product upsert now accept optional `brand` and `description` fields.
* Balance: `getActiveBalancesApi()`, `getContactBalances()`, and `getSubscriptionBalances()` now accept an optional `includeInternal` parameter.
* Balance: `getTransactionHistory()` now supports filtering by `status` and `transactionType`.

### Improved

* `meta` field on balance definition requests is now a typed object (`{ isInternal?: boolean }`) instead of a generic `Record<string, unknown>`.
* `metaInfo` size limit for products clarified: maximum **20,000 characters** total.
* `users` field on plan verticals is now nullable (`Item.Users | null`).

## March 12, 2026 — v5.0.1

### Fixed

* `GetCampaignStats`: `appleMppOpens` and `opensRate` are now typed as `number | null`. The API returns `null` when no data is available for the campaign period.
* `Order.products`: the full set of product fields is now exposed — `price`, `productId`, `variantId`, `quantity`, and `quantityFloat`. Previously only `quantity` was available.
* `GetAccountResponsePlanVerticalsItem.users`: now typed as optional/nullable, matching API behavior on certain plan types.
* `createContact()`: no longer throws a JSON parse error on `204 No Content` responses (returned when a contact already exists).

### Deprecated

* `transactionalSms.sendTransacSms()` — use `transactionalSms.sendTransacSmsAsync()` instead. The synchronous variant adds latency by waiting for carrier acknowledgment.

## February 11, 2026 — v4.0.1 beta release

Released a beta version of the Node.js SDK (v4.0.1) with a promise-based API, enhanced TypeScript types, standardized error handling, and improved retry logic.

```bash
npm install @getbrevo/brevo@^4.0.1
```