Python SDK Changelog
Release history for the brevo-python SDK.
May 14, 2026 — v5.0.0
Breaking changes
- ⚠️
companies.get_companies(filters=...)— thefilterskeyword is renamed tofilters_attributes_name. The old keyword is silently dropped, the request still succeeds, and the server returns an unfiltered list. event.create_batch_events— keyword renamedrequest=→events=; item types renamed in lockstep (CreateBatchEventsRequestItem→CreateBatchEventsRequestEventsItemand 5 sub-types).balance.get_contact_balances— new requiredbalance_definition_idparameter.balance.get_active_balances_api— response type replaced withGetLoyaltyBalanceProgramsPidActiveBalanceResponse(different shape).balance.begin_transaction.event_time—str→datetime. Runtime-tolerant underskip_validation, but type-checkers will fail.tasks.get_all_task_types— return type changed fromGetCrmTasktypesResponsetoList[GetCrmTasktypesResponseItem]. Old.id/.titleaccess on the response fails (it’s a list now).webhooks.create_webhook—eventsargument moved from required to optional. Positional callers break; switch to keyword arguments.webhooks.*.message_id— type changed frominttostron history-fetch endpoints.- Response fields removed:
GetAccountResponse.date_time_preferences,GetWebhook.channel,GetProcessResponseInfo.export. - Shape collapses:
SendTransacSmsTagis nowUnion[str, List[str]](was a pydantic model);GetExtendedCampaignStats.links_statsis nowDict[str, int](was a pydantic class);ConversationsMessageAttachmentsItem:file_name→name,inline_id→link. - 21 names removed from top-level
from brevo import ...— most notablyCreateBatchEventsRequestItem*(6 names),GetWebhookChannel,GetAccountResponseDateTimePreferences,GetExtendedCampaignStatsLinksStats,SendTransacSmsTagField, andUpsertrecordsRequestRecordsItemAssociationsItemZero/One*(8 names).
Added
- New optional fields and filters across
contacts.create_contact,contacts.update_contact,email_campaigns.get_email_campaigns,ecommerce.get_products, and several other endpoints. - Both
Brevo(sync) andAsyncBrevoare affected symmetrically by every change above.
See the Upgrading from v4.x guide for migration details and a one-line rollback pin.
April 10, 2026 — v4.0.11
Fixed
- Process endpoints —
duplicate_email_idis now typed as a string (URL to a CSV file) instead of an integer. The legacyin_processstatus value is now handled correctly. - Event endpoints —
contact_propertiesandevent_propertiesnow accept boolean values increate_eventandcreate_batch_events. - Contact endpoints —
attributesnow accepts plain integers increate_contactandupdate_contact.
March 25, 2026 — v4.0.9
Added
client.event.get_events()— retrieve a paginated list of custom events with filters for contact, event name, object type, and date range.client.event.create_batch_events()— track multiple contact interactions in a single request.CreateUpdateProductRequestand batch product upsert now accept optionalbrandanddescriptionfields.GetProductDetailsresponse now includesbrandanddescription.- Balance:
get_active_balances_api(),get_contact_balances(), andget_subscription_balances()now acceptinclude_internal. - Balance:
get_transaction_history()now supports filtering bystatusandtransaction_type.
Improved
metafield on balance definition requests is now a typed model with anis_internalflag.metaInfosize limit for products clarified: maximum 20,000 characters total.usersfield on plan verticals is now nullable.
March 12, 2026 — v4.0.7
Fixed
GetCampaignStats:apple_mpp_opensandopens_rateare now correctly typed as nullable.Order.products: all product fields are now accessible —price,product_id,variant_id,quantity,quantity_float.create_contact(): correctly handles204 No Contentresponses without raising a deserialization error.
Deprecated
transactional_sms.send_transac_sms()— usetransactional_sms.send_transac_sms_async()instead.
February 23, 2026 — v4.0 beta release
Released a beta version of the Python SDK (v4.0) with native async support via AsyncBrevo, Pydantic-based typed models, automatic retries with exponential backoff, and custom httpx client support.
Key highlights
- Unified client via
Brevo(api_key="...")— no more manual configuration objects - Native async support with
AsyncBrevo - Full type annotations for all request and response models
- Raw response access via
with_raw_response - 33 service namespaces covering the entire Brevo API