Node.js SDK Changelog

Release history for the @getbrevo/brevo Node.js SDK.

August 10, 2026 — v6.0.3

Added

  • Email Campaigns — UTM parameter customizationPOST /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 consentPOST /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 operationsPOST /contacts/import now accepts optional consentGroupIds to add imported contacts to specified groups
  • Contact details enhancementGET /contacts/{identifier} now returns consentGroups array showing each group and subscription status (when feature enabled)
  • Wallet pass installation URLsGET /wallet/passes/{passId}/installUrl/{contactId} generates per-contact installation URLs for Apple Wallet and Google Wallet integration

Fixed

  • Empty JSON object serializationJsonSerializableType 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 (BalanceLimitGetLoyaltyBalanceProgramsPidActiveBalanceResponse); request parameters renamed from snake_case to camelCase (contact_idcontactId, balance_definition_idbalanceDefinitionId, sort_fieldsortField).
  • 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.filenamename, .urllink; 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 for migration details and a one-line rollback pin.

April 10, 2026 — v5.0.5

Fixed

  • Process endpointsduplicate_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 endpointscontact_properties and event_properties now accept boolean values in createEvent and createBatchEvents.
  • Contact endpointsattributes 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.

$npm install @getbrevo/brevo@^4.0.1