Skip to content
Bloomcount API
Esc
navigateopen⌘Jpreview

Bulk create or update events

Each item is either a create or an update:

  • Create: omit eventId. name and priceListId are required.
  • Update: pass eventId. Only the supplied fields are patched; pass null to 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 without name or priceListId.
  • event_not_foundeventId is 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/events
Authorization
AuthorizationBearer token (bloomcount_...) · headerrequired
Header parameters
Idempotency-Keystring
Replays return the cached response. 24h TTL, scoped per API key.
Request body
requiredapplication/json
itemsEventUpsertItem[]required
max items 500
Show properties
Array of EventUpsertItem
eventIdstring
Existing event ID — patches when present
namestring
priceListIdstring
materialsPriceListIdstring | null
Optional second price list for material lines. Pass `null` to clear.
hirePriceListIdstring | null
Optional hire-fee price list for hire lines. Pass `null` to clear.
markupMultipliernumber<float>
statusEventStatus
Workflow 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_progresscomplete
ceremonyAddressstring
venueAddressstring
ceremonyStartinteger<int64> | null
Unix ms. `null` clears.
ceremonyEndinteger<int64> | null
venueStartinteger<int64> | null
venueEndinteger<int64> | null
clientName1string
clientName2string
budgetnumber<float> | null
numberOfGuestsinteger | null
numberOfTablesinteger | null
colourSchemestring[]
Responses
200Update-only batch
resultsobject[]required
Show properties
Array of object
indexintegerrequired
actionstringrequired
Allowed:createdupdated
eventIdstringrequired
slugstring | nullrequired
errorsobject[]required
Rows that failed. Every other row still applied.
Show properties
Array of object
indexintegerrequired
Position of the failing row in the array you sent, zero-based.
errorstringrequired
Stable 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[]required
Show properties
Array of object
indexintegerrequired
actionstringrequired
Allowed:createdupdated
eventIdstringrequired
slugstring | nullrequired
errorsobject[]required
Rows that failed. Every other row still applied.
Show properties
Array of object
indexintegerrequired
Position of the failing row in the array you sent, zero-based.
errorstringrequired
Stable 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.
errorstringrequired
403Authenticated, but the key lacks the required scope or the tenant has no API access.
errorstringrequired
422Request body or arguments failed validation.
errorstringrequired
429Per-minute rate limit (60/min) or per-month cap exceeded.
errorstringrequired
Try it
Server
Authorization
Parameters
Bodyapplication/json
Request
curl -X POST "https://app.bloomcount.com/api/v1/events" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "items": [
    {
      "eventId": "string",
      "name": "Lewis & Sam Wedding",
      "priceListId": "pl_4q9z3m8b7c2x6n1t5v0w4y8r",
      "materialsPriceListId": "string",
      "hirePriceListId": "string",
      "markupMultiplier": 3,
      "status": "new",
      "ceremonyAddress": "string",
      "venueAddress": "string",
      "ceremonyStart": 0,
      "ceremonyEnd": 0,
      "venueStart": 0,
      "venueEnd": 0,
      "clientName1": "string",
      "clientName2": "string",
      "budget": 0.1,
      "numberOfGuests": 0,
      "numberOfTables": 0,
      "colourScheme": [
        "string"
      ]
    }
  ]
}'
Response
{
  "results": [
    {
      "index": 0,
      "action": "created",
      "eventId": "string",
      "slug": "string"
    }
  ],
  "errors": [
    {
      "index": 0,
      "error": "string"
    }
  ]
}