POST /objects/{object_type}/batch/upsert
Custom objects are only available to Enterprise plans. This feature is in beta. These are subject to change. Performs bulk create or update (upsert) operations for object records in a single asynchronous request. This endpoint is optimized for high-volume data imports and synchronization scenarios.
How Upsert Works:
- Create: Omit
identifiers, or provide onlyext_id(if it doesn't already exist). A new record is created with a Brevo-generatedid. - Update: Provide
id(Brevo internal ID) or anext_idthat already exists. The matching record is updated with the new attribute values. - Important:
idis for updates only. Providing anidthat does not belong to an existing record will fail during async processing (the HTTP response will still be 202, but the record will be rejected in the background). To create a new record with a stable external reference, useext_idinstead.
Request Structure:
Each object record in the records array can include:
identifiers: Eitherid(internal Brevo ID) orext_id(your external system ID) — required for updates. Note: useid(singular), notids.attributes: Key-value pairs where each key is the attribute key (e.g.,company_name), not the attribute label (e.g., "Company Name").associations: Controls linking and unlinking of associated records (optional). Each entry specifies:object_type: The type of the associated objectaction:link(default) to create the association, orunlinkto remove itrecords: The associated records to link or unlink (each identified byext_idorid)- Unlink is idempotent — unlinking a non-existing association is a no-op (no error returned)
linkandunlinkactions can be submitted for the sameobject_typein a single record entry- Both associated records must already exist before a link can be created
Common mistake: Passing the attribute label (the display name you see in the UI) instead of the attribute key will cause the attribute to be silently ignored and the record may not be created as expected.
Asynchronous Processing:
- Returns immediately with a
processId(HTTP 202 Accepted) - Use the processId to track status via the Get process API
API and Schema Limitations:
- Max 1000 object records per request
- Max request body size: 1 MB
- Max 500 attributes per object record (matches the schema limit of 500 attributes per object)
- Unknown attribute keys are silently ignored (no error, no attribute creation)
- Max 10 association records per associated object-type in each record of the request. If you need more, send multiple requests.
Important Behaviors:
- The object schema must be created before upserting records
- Unknown attribute keys are silently ignored (no error, no creation)
- Both associated object records must already exist before creating a link association
- Unlink operations are idempotent: attempting to unlink a non-existing association returns success
linkandunlinkactions can be submitted for the sameobject_typein a single record entry- Contact objects cannot be created via this endpoint
- For
categoryandmultiple_categoryattributes, pass the option key as the value (not the option label or option ID). - The
ididentifier (internal Brevo ID) can only be used for updating existing records. To create new records, either omit identifiers (Brevo auto-generates an ID) or provide anext_id.
Errors:
- Make sure both object records exist before associating them, else the API will return an error.
- This route does not create objects. The object where the object records are upserted by this API must be created already else the API will return an error "invalid object type".
Servers
- https://api.brevo.com/v3
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
object_type |
String | Yes |
Object type for the records to upsert. Must be a previously created custom object type. Only lowercase alphanumeric characters and underscores are allowed (max 32 characters). |
Request headers
| Name | Type | Required | Description |
|---|---|---|---|
Content-Type |
String | Yes |
The media type of the request body.
Default value: "application/json" |
Request body fields
| Name | Type | Required | Description |
|---|---|---|---|
records[] |
Array | Yes |
List of object records to be upsert. Each record can have attributes, identifiers, and associations. |
How to start integrating
- Add HTTP Task to your workflow definition.
- Search for the API you want to integrate with and click on the name.
- This loads the API reference documentation and prepares the Http request settings.
- Click Test request to test run your request to the API and see the API's response.