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

# SDK updates: Node.js v5.0.1, PHP v4.0.10, Python v4.0.7

Bug fixes, type corrections, and a deprecation across all three SDKs.

## Node.js — [`@getbrevo/brevo` v5.0.1](https://github.com/getbrevo/brevo-node/releases/tag/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.

## PHP — [`getbrevo/brevo-php` v4.0.10](https://github.com/getbrevo/brevo-php/releases/tag/v4.0.10)

**Added**

* Batch events endpoint: `$client->event->createBatchEvents()` to track multiple contact interactions in a single request.
* `getEmailCampaign()` accepts a new optional `excludeHtmlContent` flag to omit the HTML body from the response.

**Fixed**

* `UpdateContactRequest` and `CreateContactRequest`: boolean values in union-typed attribute maps now serialize correctly. Previously threw `JsonException: Cannot serialize value of type boolean`.
* `Order::products`: `OrderProductsItem` now exposes all product fields — `price`, `productId`, `variantId`, `quantity`, `quantityFloat`.
* `GetCampaignStats`: `appleMppOpens` and `opensRate` are now correctly typed as nullable (`?int`, `?float`).

**Deprecated**

* `sendTransacSms()` — use `sendAsyncTransactionalSms()` instead.

## Python — [`brevo-python` v4.0.7](https://github.com/getbrevo/brevo-python/releases/tag/v4.0.7)

**Fixed**

* `GetCampaignStats`: `apple_mpp_opens` and `opens_rate` are now correctly typed as nullable.
* `Order.products`: all product fields are now accessible — `price`, `product_id`, `variant_id`, `quantity`, `quantity_float`.
* `create_contact()`: correctly handles `204 No Content` responses without raising a deserialization error.

**Deprecated**

* `transactional_sms.send_transac_sms()` — use `transactional_sms.send_transac_sms_async()` instead.