Applies a flat list of UPSERT/DELETE operations across LOCATION, SERVICE, STAFF, and ARTICLE entities in one all-or-nothing transaction, with optional cross-entity links (e.g. a STAFF UPSERT linking to a LOCATION created earlier in the same call). Bridges the gap between the single-entity create/update/delete endpoints (one call per entity, no cross-type linking) and the CSV bulk-upload endpoint (one entity type per file, no linking to other types either): use this endpoint when a single caller-side change needs to touch several entities and/or types together and either all of it lands or none of it does.
Processing order. Two passes, not submission order: every UPSERT first (in dependency order LOCATION → SERVICE → STAFF → ARTICLE, so a links reference to an entity created earlier in the same batch always resolves), then every DELETE. The response still mirrors submission order — results[i] corresponds to operations[i] regardless of which pass actually applied it.
entity per operation + entity_type combination:
-
UPSERT LOCATION — same fields as the single-entity location create/update request:
name(required),external_id(optional — a random one is generated if omitted; matches
an existing location to update it in place, otherwise creates a new one),type,
image_url,phone_numbers(list of{phone_number, name}),time_zone(required, IANA
id),address(required —{address, country_name, zip_code}required, plusregion_name,
city,coordinates: {latitude, longitude}),open_hours(list of
{day_of_week, slots: [{open_at, close_at}]}),special_dates,custom_fields. Does not
acceptlinks. -
UPSERT SERVICE —
service_name(required),description(required),external_id,
service_type,duration,price,virtual_location_url,location_ids(internal
location ids — notlinks; a SERVICE's location association is this field),open_hours,
special_dates,phone_numbers,time_zone,custom_fields. Does not acceptlinks. -
UPSERT STAFF —
name(required),external_id,description,photo_url,status,
gender,languages,job_title,contacts(list of{type, value, description}),
manager,pronouns,specialities,date_of_birth,date_of_hire,attributes(free-form
string map),relationships(list of{location_id, service_id}, by internal id — same as
the single-entity staff endpoint),visit_types(list of{id, name}),tag_ids,
custom_fields. Additionally accepts operation-levellinksto LOCATION and/or SERVICE (by
external_id): a LOCATION link and a SERVICE link both present are paired (cross-product)
into the staff's relationships; either alone is recorded with the other side unset. -
UPSERT ARTICLE —
type_id(required — an existing article type's id),content
(required — arbitrary JSON, validated against the type's schema when the type's content type
is JSON),tags(list of strings). The batch's top-levelsource_keyis required whenever
any ARTICLE UPSERT is present. Accepts operation-levellinksto LOCATION, SERVICE, and/or
STAFF (byexternal_id— an ARTICLE is never a valid link target); does not accept an
embeddedentity.linksobject (the single-article endpoint's
shape) — use the operation-levellinksarray instead. The article's type must currently be
enabled for the account, and the type's declared link patterns must admit the combination of
linked entity types submitted. -
DELETE (any
entity_type) —entityis just{ "id": "..." }. For LOCATION/SERVICE/
STAFF,idis theexternal_id(the same identity UPSERT uses) — a value matching nothing
is a silent no-op, still reported in the response. For ARTICLE,idis the internal id
(articles have noexternal_id). DELETE does not acceptlinks.
Validation rejects the whole batch (no operation applied) when: there are more than 100 operations; two UPSERTs of the same entity type share an external_id; a links entry (or a same-entity-type UPSERT) targets something a DELETE in this same batch also targets — applying every UPSERT before any DELETE makes that ordering unresolvable; a links entry resolves to neither another operation in the batch nor an existing account entity; an ARTICLE UPSERT carries an embedded entity.links; or any single operation fails its own field-level validation (reported as the first offending operations[i]).
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||