Publish a chart
Promotes the current draft to a published version. Events do not pin a version: every event of this chart reads the new layout immediately. To protect sold tickets, the publish is refused with `409 publish_affects_reservations` when the new draft would remove a booked or held label, turn it from seat to GA (or back), change its category, or shrink a GA area below its booked + held quantity on any event of this chart (both environments). `failed[]` lists every such label per event; `GET /charts/{chartKey}/publish-check` returns the same list without publishing. Pass `?force=true` to publish anyway: existing holds and bookings are kept as they are.
curl -X POST "https://seatbuilder.org/api/v1/charts/string/publish"{
"chartKey": "chart_8a2b1c",
"name": "Brooklyn Music Hall — main floor",
"draftVersion": 4,
"publishedVersion": 3,
"publishedAt": "2026-09-18T11:10:00.000Z",
"updatedAt": "2026-09-18T11:10:00.000Z"
}{
"statusCode": 0,
"error": "string",
"message": "string",
"code": "validation_failed",
"failed": [
{
"objectLabel": "string",
"reason": "string",
"eventKey": "string",
"environment": "string",
"booked": 0,
"held": 0
}
],
"errors": {
"property1": [
"string"
],
"property2": [
"string"
]
}
}{
"statusCode": 0,
"error": "string",
"message": "string",
"code": "validation_failed",
"failed": [
{
"objectLabel": "string",
"reason": "string",
"eventKey": "string",
"environment": "string",
"booked": 0,
"held": 0
}
],
"errors": {
"property1": [
"string"
],
"property2": [
"string"
]
}
}{
"statusCode": 0,
"error": "string",
"message": "string",
"code": "validation_failed",
"failed": [
{
"objectLabel": "string",
"reason": "string",
"eventKey": "string",
"environment": "string",
"booked": 0,
"held": 0
}
],
"errors": {
"property1": [
"string"
],
"property2": [
"string"
]
}
}{
"statusCode": 0,
"error": "string",
"message": "string",
"code": "validation_failed",
"failed": [
{
"objectLabel": "string",
"reason": "string",
"eventKey": "string",
"environment": "string",
"booked": 0,
"held": 0
}
],
"errors": {
"property1": [
"string"
],
"property2": [
"string"
]
}
}{
"statusCode": 409,
"error": "Conflict",
"message": "Publishing would change 2 booked or held label(s); review failed[] and republish with ?force=true to proceed",
"code": "publish_affects_reservations",
"failed": [
{
"eventKey": "tg-prod-session-44778",
"environment": "production",
"objectLabel": "A-1",
"reason": "removed",
"booked": 1,
"held": 0
},
{
"eventKey": "tg-prod-session-44778",
"environment": "production",
"objectLabel": "lawn",
"reason": "capacity_below_reserved",
"booked": 120,
"held": 4
}
]
}Delete a chart DELETE
Deletes a chart. Fails with 409 if the chart has any events bound to it — delete the events first, or duplicate to a new chart and rebind.
Unpublish a chart POST
Clears the `publishedVersion` on a chart. Events already created from previously-published versions keep working (they read the chart's current `publishedVersion` live; if `null`, the chart appears empty). Use with care.