Bulk create or update events
Each item is either a create or an update:
- Create: omit
eventId.nameandpriceListIdare required. - Update: pass
eventId. Only the supplied fields are patched; passnullto clear an optional field (e.g.ceremonyStart: null).
This endpoint writes the event header: dates, addresses, client names, budget, status and the assigned price
lists. That is the shape a CRM keeps in sync. An event’s contents have their own endpoints —
POST /api/v1/events/{id}/groups and POST /api/v1/events/{id}/items — so creating a populated event is two
calls: this one for the header, then one for the lines. Labour charges, fees and image uploads stay app-side.
Returns 201 if any row was created, 200 if every row was an update or errored. Per-row failures are listed in errors.
Errors (per row, in errors)
missing_required_fields_on_create— a create row withoutnameorpriceListId.event_not_found—eventIdis unknown or belongs to another tenant.price_list_not_found— a price list ID that doesn’t exist on the tenant, on any of the three list fields.
Whole-request failures: 422 too_many_items above 500 rows, and 422 wrong_id_type:... when a prefixed ID in
the batch doesn’t decode.
POST
/api/v1/eventsAuthorization
AuthorizationBearer token (bloomcount_...) · headerrequiredHeader parameters
Idempotency-KeystringReplays return the cached response. 24h TTL, scoped per API key.
Request body
requiredapplication/jsonitemsEventUpsertItem[]requiredmax items 500
Show propertiesHide properties
Array of
EventUpsertItemeventIdstringExisting event ID — patches when present
namestringpriceListIdstringmaterialsPriceListIdstring | nullOptional second price list for material lines. Pass `null` to clear.
hirePriceListIdstring | nullOptional hire-fee price list for hire lines. Pass `null` to clear.
markupMultipliernumber<float>statusEventStatusWorkflow stage of the event. Progresses left-to-right but values are not strictly enforced — you can move backwards (e.g. `approved` → `quoting` after a budget revision).
- `new` — created, no pricing yet.
- `quoting` — pricing in progress; quote not sent.
- `pending_approval` — quote sent to client, awaiting sign-off.
- `approved` — client signed off; pricing locked.
- `in_progress` — sourcing / fulfilment underway.
- `complete` — event delivered.
Allowed:
newquotingpending_approvalapprovedin_progresscompleteceremonyAddressstringvenueAddressstringceremonyStartinteger<int64> | nullUnix ms. `null` clears.
ceremonyEndinteger<int64> | nullvenueStartinteger<int64> | nullvenueEndinteger<int64> | nullclientName1stringclientName2stringbudgetnumber<float> | nullnumberOfGuestsinteger | nullnumberOfTablesinteger | nullcolourSchemestring[]Responses
200Update-only batch
resultsobject[]requiredShow propertiesHide properties
Array of
objectindexintegerrequiredactionstringrequiredAllowed:
createdupdatedeventIdstringrequiredslugstring | nullrequirederrorsobject[]requiredRows that failed. Every other row still applied.
Show propertiesHide properties
Array of
objectindexintegerrequiredPosition of the failing row in the array you sent, zero-based.
errorstringrequiredStable error code. Common values:
- `event_not_found` — `eventId` doesn't belong to your tenant.
- `price_list_not_found` — referenced price list missing or cross-tenant.
- `missing_required_fields_on_create` — no `eventId` provided but `name` or `priceListId` absent.
201At least one row created
resultsobject[]requiredShow propertiesHide properties
Array of
objectindexintegerrequiredactionstringrequiredAllowed:
createdupdatedeventIdstringrequiredslugstring | nullrequirederrorsobject[]requiredRows that failed. Every other row still applied.
Show propertiesHide properties
Array of
objectindexintegerrequiredPosition of the failing row in the array you sent, zero-based.
errorstringrequiredStable error code. Common values:
- `event_not_found` — `eventId` doesn't belong to your tenant.
- `price_list_not_found` — referenced price list missing or cross-tenant.
- `missing_required_fields_on_create` — no `eventId` provided but `name` or `priceListId` absent.
401Missing or invalid API key, or revoked / expired.
errorstringrequired403Authenticated, but the key lacks the required scope or the tenant has no API access.
errorstringrequired422Request body or arguments failed validation.
errorstringrequired429Per-minute rate limit (60/min) or per-month cap exceeded.
errorstringrequired