Bulk operations
Update or create many broadcasts in one Eventdoor REST API call, and read the result of each row.
Two calls change many broadcasts in one hub at once. Both need a Read and write credential.
| Call | Path | What it does |
|---|---|---|
| Bulk update broadcasts | PATCH /organizations/{orgSlug}/hubs/{hubSlug}/broadcasts/bulk | Update existing broadcasts by slug |
| Bulk upsert broadcasts | POST /organizations/{orgSlug}/hubs/{hubSlug}/broadcasts/bulk-upsert | Create broadcasts, or update by id |
Limits
- A bulk call carries 1 to 50 entries in
operations. More than 50 is refused with400 A bulk call may carry at most 50 operations. Split a larger batch into several calls. - A bulk call costs one request per entry in
operationsagainst your rate limit. A call with 50 operations costs 50.
Results: 207, one per row
Both calls answer 207 with a results array, one result per entry in operations. Each row succeeds or fails on its own: one bad row does not stop the others, and the call still returns 207. Always check each result's status.
A startsAt you set must be in the future. A row with a past startsAt fails with 422.
Bulk update
Each operation names a broadcast by broadcastSlug and carries an update with the fields to change, the same fields as Update broadcast.
curl -s -X PATCH \
-H "Authorization: Bearer $EVENTDOOR_TOKEN" \
-H "Content-Type: application/json" \
"$EVENTDOOR_API/organizations/acme/hubs/home-games/broadcasts/bulk" \
-d '{
"operations": [
{ "broadcastSlug": "vs-celtics", "update": { "startsAt": "2027-03-14T19:30:00Z" } },
{ "broadcastSlug": "vs-knicks", "update": { "startsAt": "2027-03-21T19:30:00Z" } }
]
}'Each result has the broadcastSlug, a status, and either the updated broadcast or an error:
status | Meaning | error.code |
|---|---|---|
200 | Updated. broadcast holds the new version. | |
404 | No broadcast with that slug in this hub. | NOT_FOUND |
409 | The change conflicts with the current state. | CONFLICT |
422 | The update is not valid. | VALIDATION_ERROR |
500 | A server error on this row, or an id in update that names nothing this organization has, such as an unknown graphicsTemplateId. Check the ids before you retry. | INTERNAL_ERROR |
An illustrative response, where the second row failed:
{
"results": [
{
"broadcastSlug": "vs-celtics",
"status": 200,
"broadcast": {
"slug": "vs-celtics",
"title": "vs Celtics",
"startsAt": "2027-03-14T19:30:00Z"
}
},
{
"broadcastSlug": "vs-knicks",
"status": 404,
"error": { "code": "NOT_FOUND", "message": "Broadcast not found" }
}
]
}Bulk upsert
Each operation carries a broadcast in the shape Create broadcast takes, so title is required. Bulk upsert applies only title, description, posterUrl, startsAt, endsAt, timezone, collectionItems and tagIds, plus streamId when it creates a broadcast. It ignores the archive fields, and streamId on an update. On an update, collectionItems are added to the broadcast's existing collection links rather than replacing them.
Two optional fields go with the broadcast:
id: update the broadcast with this id, which must be in this hub, instead of creating a new one.ref: any string of yours, such as a spreadsheet row number. It comes back on the matching result so you can map results to your rows.
curl -s -X POST \
-H "Authorization: Bearer $EVENTDOOR_TOKEN" \
-H "Content-Type: application/json" \
"$EVENTDOOR_API/organizations/acme/hubs/home-games/broadcasts/bulk-upsert" \
-d '{
"operations": [
{ "ref": "row-2", "broadcast": { "title": "vs Celtics", "startsAt": "2027-03-14T19:30:00Z" } },
{ "ref": "row-3", "id": "3b9d6c1e-7a42-4f0e-8c15-2e6a9f0d4b71", "broadcast": { "title": "vs Knicks" } }
]
}'Each result has your ref, a status, and either the broadcast or an error with code, message and sometimes invalidFields. A status of 201 means the broadcast was created and 200 that it was updated. A failed row has 400, 403, 404, 409, 422 or 500.
An illustrative response, where the first row was created and the second row's id matched no broadcast in this hub:
{
"results": [
{
"ref": "row-2",
"status": 201,
"broadcast": {
"slug": "vs-celtics",
"title": "vs Celtics",
"startsAt": "2027-03-14T19:30:00Z"
}
},
{
"ref": "row-3",
"status": 404,
"error": { "code": "NOT_FOUND", "message": "Broadcast not found" }
}
]
}Fix the failed rows and send only those again. With id set on a row, sending it again updates that broadcast rather than creating a second one.
A row without id that fails with 400 on tagIds has still created its broadcast: the tags are checked after the broadcast is saved, and the result carries no id. Before you send that row again, list the hub's broadcasts and look for its title. If it is there, send the row with that broadcast's id instead, or it is created a second time.