SeatBuilderSeatBuilder Docs

Release seats

Returns seats to `free`. With `holdToken`, only rows under that token are released (secret key: held and booked; public key: held only — booked seats are never released by a public key). `objectLabels` may be omitted when `holdToken` is given = everything that token holds on the event. Without `holdToken` (secret key only) any held or booked individual seat is released (admin release); a general-admission area always requires `holdToken` (`400 hold_token_required`), and so does every public-key call. Idempotent: labels that are already free — including an expired hold, swept or not — come back in `alreadyFree[]` with `200`. If any label is held/booked by a different token (or booked and the caller is a public key) the whole request fails `409 not_held_by_token` with `failed[]` and nothing is released (all-or-nothing). GA entries in `released[]` carry the freed `quantity`. Emits one `seat.released` webhook per released row.

POST/api/v1/events/{eventKey}/seats/release

Path Parameters

eventKeystring
objectLabels?array<string>

Labels to release (single seat = array of one). Optional when holdToken is given: omitted = everything that token holds on the event (public key: held rows; secret key: held and booked rows). Labels that are already free are returned in alreadyFree[], not treated as failures.

Items1 <= items <= 200
holdToken?string

Hold token that reserved (or booked) the seats. When given, only rows under this token are released. REQUIRED for public keys (which can only release held rows) and for general-admission areas. A secret key may omit it for individual seats (admin release of any held/booked seat).

Length1 <= length

Response Body

curl -X POST "https://seatbuilder.org/api/v1/events/string/seats/release" \  -H "Content-Type: application/json" \  -d '{    "objectLabels": [      "A-12",      "A-13"    ],    "holdToken": "7f6c3a91-b1ef-4d0a-9c84-3f12a8e0b5d2"  }'

{
  "chartKey": "chart_8a2b1c",
  "eventKey": "evt_q3-2026-jazz-night",
  "status": "free",
  "releasedAt": "2026-10-02T19:15:30.000Z",
  "released": [
    {
      "objectLabel": "A-12"
    },
    {
      "objectLabel": "GA-LAWN",
      "quantity": 2
    }
  ],
  "alreadyFree": [
    {
      "objectLabel": "A-13"
    }
  ]
}
{
  "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": "One or more seats could not be released",
  "code": "not_held_by_token",
  "failed": [
    {
      "objectLabel": "A-13",
      "reason": "not_held_by_token"
    }
  ]
}
Release seats — SeatBuilder Docs