seatschart 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +31 -3
  3. data/lib/seatschart/api/charts_api.rb +9 -9
  4. data/lib/seatschart/api/embed_api.rb +13 -2
  5. data/lib/seatschart/api/event_log_api.rb +2 -2
  6. data/lib/seatschart/api/events_api.rb +186 -20
  7. data/lib/seatschart/api/listings_api.rb +884 -0
  8. data/lib/seatschart/api/object_status_api.rb +2 -2
  9. data/lib/seatschart/api/seasons_api.rb +113 -8
  10. data/lib/seatschart/api/seats_api.rb +3 -22
  11. data/lib/seatschart/api/usage_api.rb +4 -4
  12. data/lib/seatschart/api/webhooks_api.rb +2 -2
  13. data/lib/seatschart/api/workspace_api.rb +4 -4
  14. data/lib/seatschart/models/api_error.rb +307 -0
  15. data/lib/seatschart/models/api_error_params_value.rb +105 -0
  16. data/lib/seatschart/models/get_api_monitoring_requests200_response.rb +17 -1
  17. data/lib/seatschart/models/get_api_monitoring_requests200_response_concurrency.rb +318 -0
  18. data/lib/seatschart/models/get_api_monitoring_requests200_response_concurrency_api_keys_inner.rb +297 -0
  19. data/lib/seatschart/models/get_api_monitoring_requests200_response_points_inner.rb +21 -4
  20. data/lib/seatschart/models/get_api_workspace_settings200_response_effective.rb +20 -4
  21. data/lib/seatschart/models/get_api_workspace_settings200_response_overrides.rb +13 -4
  22. data/lib/seatschart/models/get_api_workspace_settings200_response_sources.rb +32 -4
  23. data/lib/seatschart/models/patch_api_events_by_event_id_listings_by_listing_id_request.rb +379 -0
  24. data/lib/seatschart/models/patch_api_listing_types_by_key_request.rb +376 -0
  25. data/lib/seatschart/models/patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id_request.rb +268 -0
  26. data/lib/seatschart/models/patch_api_seasons_by_season_id_request.rb +27 -1
  27. data/lib/seatschart/models/patch_api_webhooks_by_id_request.rb +1 -1
  28. data/lib/seatschart/models/patch_api_workspace_settings_request.rb +12 -1
  29. data/lib/seatschart/models/post_api_charts_by_chart_id_actions_validate_request_seats_inner_accessibility.rb +6 -6
  30. data/lib/seatschart/models/post_api_events_actions_change_object_status_request_status_changes_inner.rb +0 -11
  31. data/lib/seatschart/models/post_api_events_by_event_id_actions_change_object_status_request.rb +13 -26
  32. data/lib/seatschart/models/post_api_events_by_event_id_actions_change_object_status_request_listing.rb +392 -0
  33. data/lib/seatschart/models/post_api_events_by_event_id_actions_mark_everything_as_not_for_sale_request.rb +215 -0
  34. data/lib/seatschart/models/post_api_events_by_event_id_listings_by_listing_id_actions_mark_sold_request.rb +243 -0
  35. data/lib/seatschart/models/post_api_events_by_event_id_listings_request.rb +435 -0
  36. data/lib/seatschart/models/post_api_events_by_event_id_listings_request_objects_inner.rb +104 -0
  37. data/lib/seatschart/models/post_api_events_by_event_id_listings_request_objects_inner_any_of.rb +325 -0
  38. data/lib/seatschart/models/post_api_ga_confirm_request.rb +0 -44
  39. data/lib/seatschart/models/post_api_ga_release_request.rb +0 -11
  40. data/lib/seatschart/models/post_api_ga_reserve_request.rb +0 -33
  41. data/lib/seatschart/models/post_api_hold_tokens_request.rb +0 -22
  42. data/lib/seatschart/models/post_api_listing_types_request.rb +439 -0
  43. data/lib/seatschart/models/post_api_quotes_request.rb +0 -22
  44. data/lib/seatschart/models/post_api_seasons_by_season_id_partial_seasons_request.rb +27 -1
  45. data/lib/seatschart/models/post_api_seasons_request.rb +27 -1
  46. data/lib/seatschart/models/post_api_seats_best_available_request.rb +0 -11
  47. data/lib/seatschart/models/post_api_seats_confirm_request.rb +0 -44
  48. data/lib/seatschart/models/post_api_seats_release_request.rb +0 -11
  49. data/lib/seatschart/models/post_api_seats_reserve_request.rb +0 -22
  50. data/lib/seatschart/models/post_api_viewer_tokens_request.rb +0 -11
  51. data/lib/seatschart/models/post_api_webhooks_request.rb +1 -1
  52. data/lib/seatschart/models/put_api_charts_by_chart_id_map_draft_request.rb +348 -0
  53. data/lib/seatschart/version.rb +1 -1
  54. data/lib/seatschart.rb +16 -0
  55. metadata +17 -1
@@ -439,7 +439,7 @@ module SeatsChart
439
439
  end
440
440
 
441
441
  # Put booked objects up for resale
442
- # Resale retains the durable owner and sold status. Optional `resaleListingId` groups the objects into one listing (extraData.resaleListingId). Optional `resalePriceCents` is stored on extraData and merged into GET /seats on the next cache rebuild. Administrative status change on the path event. One SQL transaction per event; seats are locked in id order and every precondition is evaluated under those row locks, so a concurrent hold, purchase or other change cannot slip in between the check and the write. Requires **Idempotency-Key**; a replay returns the stored response and a retry after a crash reuses the same durable booking order. **Objects** (max 64 per call, per event): seat UUID or seat label (labels are resolved per event; a label that matches several seats returns 409 `ambiguous_label`; unknown references return 404 `objects_not_found`). General admission areas are addressed by UUID or name **with `quantity`** (1–10000): - `booked`: the places are first reserved in the same Redis structure buyers hold from (capacity minus not-for-sale places), then `sold_count` is incremented in the transaction with a `sold_count + quantity <= capacity` guard; the durable receipt belongs to the administrative booking order (cancel it with POST /orders/{orderId}/cancel). - `reservedByToken` (or POST …/actions/hold, GA only): holds the places atomically against capacity minus withheld, sold and held places and issues a **GA hold token** (`hold: { holdToken, holdUserId, holdExpiresAt }`), confirmable with POST /ga/confirm (`holdToken`, `userId` = `holdUserId`). Optional `userId` (customer identity of the hold; one hold per user and area, 409 `hold_exists`) and `holdExpiresInMinutes` (1–120). 409 `insufficient_capacity`. - `RELEASE` / `free` without `holdToken`: releases places of **administrative** bookings (newest receipts first, optionally only those of `orderId`), recording a release receipt per consumed booking and decrementing `sold_count` under the GA row lock (409 `insufficient_booked_places` with `available`). Buyer purchases are never released here. - `RELEASE` with `holdToken` (GA hold token): releases that many places held by the token (409 `insufficient_held_places`, `hold_token_conflict`). Every GA operation is idempotent per Idempotency-Key (deterministic receipts/holds/markers), and capacity can never be exceeded nor `sold_count` go below zero. Response `gaAreas: { <areaId>: { areaId, label, quantity, soldCount, status, heldCount?, releasedFrom? } }`. **`allowedPreviousStatuses` / `rejectedPreviousStatuses`**: `free`, `booked`, `resale`, `reservedByToken`, `retired` or a custom status. On violation nothing is written and 409 `illegal_previous_status` lists every offending object with its current status. For GA quantities the previous status follows from the operation: `free` for book/hold, `booked` for a release, `reservedByToken` for a release by `holdToken`. **`holdToken`**: with status `booked`, books seats held by that hold token. The hold session is frozen first, so the buyer cannot confirm the same seats concurrently; seats held by another token or not held by this one return 409 `hold_token_conflict`. Remaining seats of the session stay held. With `RELEASE` it releases GA places (see above). **`ticketType`** (per object, `{ objectId, ticketType }`, status `booked` only): ticket type id recorded on the new booking (order item and reservation, like a confirmed sale) and returned per object; it shows up in reports by ticket type. Other statuses return 400. **`keepExtraData`**: keeps the stored extraData; per-object `extraData` sent with it is merged on top (without it, the object's extraData is replaced by the one sent, or cleared). **`ticketBuyerId`** (opaque, ≤ 256 chars, never an internal user id) is recorded on new bookings, object statuses, status history and GA hold tokens; query it with GET /events/{eventId}/objects?ticketBuyerId=…. **`channelKeys`** (channel secret keys or channel ids) restricts the change to public objects and objects of the named channels (409 `channel_forbidden` otherwise). Without `channelKeys`, or with `ignoreChannels: true`, channel partitions are ignored (backward-compatible default). **`events`** (max 50, must include the path event): applies the same change to each event of the tenant, labels resolved per event. By default each event is atomic on its own (no cross-event atomicity): response 200 when every event succeeded, otherwise 207 with `results[]` (`{ eventId, ok, objects | status, error, message }`), `succeeded` and `failed`. Replaying the same Idempotency-Key returns the stored per-event outcome; retry failed events (listed with their error) with a new key. **`atomic: true`** makes the whole call all-or-nothing in one SQL transaction (same engine as POST /events/actions/change-object-status; at most 512 objects across the events): 200 with `atomic: true` when everything was applied, otherwise the status of the first failing event and `results[]` with `outcome: failed` (with `error`, `message`) or `rolled_back` per event — nothing was written. GA administrative holds cannot be atomic (400 `not_atomic`). **`seasonId`** (season or partial season id; XOR with `events`): fans out by unique label to every live member in one transaction (cap 50 members, 64 seats overall). Preconditions and channelKeys apply to every member seat.
442
+ # Resale retains the durable owner and sold status. Optional `resaleListingId` groups the objects into one listing (extraData.resaleListingId). Optional `resalePriceCents` is stored on extraData and merged into GET /seats on the next cache rebuild. Optional `listing` also creates a server-side listing of the objects (type, sellAsWhole, price; see the listings tag): viewers then show and sell it as one listing. Administrative status change on the path event. One SQL transaction per event; seats are locked in id order and every precondition is evaluated under those row locks, so a concurrent hold, purchase or other change cannot slip in between the check and the write. Requires **Idempotency-Key**; a replay returns the stored response and a retry after a crash reuses the same durable booking order. **Objects** (max 64 per call, per event): seat UUID or seat label (labels are resolved per event; a label that matches several seats returns 409 `ambiguous_label`; unknown references return 404 `objects_not_found`). General admission areas are addressed by UUID or name **with `quantity`** (1–10000): - `booked`: the places are first reserved in the same Redis structure buyers hold from (capacity minus not-for-sale places), then `sold_count` is incremented in the transaction with a `sold_count + quantity <= capacity` guard; the durable receipt belongs to the administrative booking order (cancel it with POST /orders/{orderId}/cancel). - `reservedByToken` (or POST …/actions/hold, GA only): holds the places atomically against capacity minus withheld, sold and held places and issues a **GA hold token** (`hold: { holdToken, holdUserId, holdExpiresAt }`), confirmable with POST /ga/confirm (`holdToken`, `userId` = `holdUserId`). Optional `userId` (customer identity of the hold; one hold per user and area, 409 `hold_exists`) and `holdExpiresInMinutes` (1–120). 409 `insufficient_capacity`. - `RELEASE` / `free` without `holdToken`: releases places of **administrative** bookings (newest receipts first, optionally only those of `orderId`), recording a release receipt per consumed booking and decrementing `sold_count` under the GA row lock (409 `insufficient_booked_places` with `available`). Buyer purchases are never released here. - `RELEASE` with `holdToken` (GA hold token): releases that many places held by the token (409 `insufficient_held_places`, `hold_token_conflict`). Every GA operation is idempotent per Idempotency-Key (deterministic receipts/holds/markers), and capacity can never be exceeded nor `sold_count` go below zero. Response `gaAreas: { <areaId>: { areaId, label, quantity, soldCount, status, heldCount?, releasedFrom? } }`. **`allowedPreviousStatuses` / `rejectedPreviousStatuses`**: `free`, `booked`, `resale`, `reservedByToken`, `retired` or a custom status. On violation nothing is written and 409 `illegal_previous_status` lists every offending object with its current status. For GA quantities the previous status follows from the operation: `free` for book/hold, `booked` for a release, `reservedByToken` for a release by `holdToken`. **`holdToken`**: with status `booked`, books seats held by that hold token. The hold session is frozen first, so the buyer cannot confirm the same seats concurrently; seats held by another token or not held by this one return 409 `hold_token_conflict`. Remaining seats of the session stay held. With `RELEASE` it releases GA places (see above). **`ticketType`** (per object, `{ objectId, ticketType }`, status `booked` only): ticket type id recorded on the new booking (order item and reservation, like a confirmed sale) and returned per object; it shows up in reports by ticket type. Other statuses return 400. **`keepExtraData`**: keeps the stored extraData; per-object `extraData` sent with it is merged on top (without it, the object's extraData is replaced by the one sent, or cleared). **`ticketBuyerId`** (opaque, ≤ 256 chars, never an internal user id) is recorded on new bookings, object statuses, status history and GA hold tokens; query it with GET /events/{eventId}/objects?ticketBuyerId=…. **`channelKeys`** (channel secret keys or channel ids) restricts the change to public objects and objects of the named channels (409 `channel_forbidden` otherwise). Without `channelKeys`, or with `ignoreChannels: true`, channel partitions are ignored (backward-compatible default). **`events`** (max 50, must include the path event): applies the same change to each event of the tenant, labels resolved per event. By default each event is atomic on its own (no cross-event atomicity): response 200 when every event succeeded, otherwise 207 with `results[]` (`{ eventId, ok, objects | status, error, message }`), `succeeded` and `failed`. Replaying the same Idempotency-Key returns the stored per-event outcome; retry failed events (listed with their error) with a new key. **`atomic: true`** makes the whole call all-or-nothing in one SQL transaction (same engine as POST /events/actions/change-object-status; at most 512 objects across the events): 200 with `atomic: true` when everything was applied, otherwise the status of the first failing event and `results[]` with `outcome: failed` (with `error`, `message`) or `rolled_back` per event — nothing was written. GA administrative holds cannot be atomic (400 `not_atomic`). **`seasonId`** (season or partial season id; XOR with `events`): fans out by unique label to every live member in one transaction (cap 50 members, 64 seats overall). Preconditions and channelKeys apply to every member seat.
443
443
  # @param event_id [String]
444
444
  # @param post_api_events_by_event_id_actions_change_object_status_request [PostApiEventsByEventIdActionsChangeObjectStatusRequest]
445
445
  # @param [Hash] opts the optional parameters
@@ -451,7 +451,7 @@ module SeatsChart
451
451
  end
452
452
 
453
453
  # Put booked objects up for resale
454
- # Resale retains the durable owner and sold status. Optional &#x60;resaleListingId&#x60; groups the objects into one listing (extraData.resaleListingId). Optional &#x60;resalePriceCents&#x60; is stored on extraData and merged into GET /seats on the next cache rebuild. Administrative status change on the path event. One SQL transaction per event; seats are locked in id order and every precondition is evaluated under those row locks, so a concurrent hold, purchase or other change cannot slip in between the check and the write. Requires **Idempotency-Key**; a replay returns the stored response and a retry after a crash reuses the same durable booking order. **Objects** (max 64 per call, per event): seat UUID or seat label (labels are resolved per event; a label that matches several seats returns 409 &#x60;ambiguous_label&#x60;; unknown references return 404 &#x60;objects_not_found&#x60;). General admission areas are addressed by UUID or name **with &#x60;quantity&#x60;** (1–10000): - &#x60;booked&#x60;: the places are first reserved in the same Redis structure buyers hold from (capacity minus not-for-sale places), then &#x60;sold_count&#x60; is incremented in the transaction with a &#x60;sold_count + quantity &lt;&#x3D; capacity&#x60; guard; the durable receipt belongs to the administrative booking order (cancel it with POST /orders/{orderId}/cancel). - &#x60;reservedByToken&#x60; (or POST …/actions/hold, GA only): holds the places atomically against capacity minus withheld, sold and held places and issues a **GA hold token** (&#x60;hold: { holdToken, holdUserId, holdExpiresAt }&#x60;), confirmable with POST /ga/confirm (&#x60;holdToken&#x60;, &#x60;userId&#x60; &#x3D; &#x60;holdUserId&#x60;). Optional &#x60;userId&#x60; (customer identity of the hold; one hold per user and area, 409 &#x60;hold_exists&#x60;) and &#x60;holdExpiresInMinutes&#x60; (1–120). 409 &#x60;insufficient_capacity&#x60;. - &#x60;RELEASE&#x60; / &#x60;free&#x60; without &#x60;holdToken&#x60;: releases places of **administrative** bookings (newest receipts first, optionally only those of &#x60;orderId&#x60;), recording a release receipt per consumed booking and decrementing &#x60;sold_count&#x60; under the GA row lock (409 &#x60;insufficient_booked_places&#x60; with &#x60;available&#x60;). Buyer purchases are never released here. - &#x60;RELEASE&#x60; with &#x60;holdToken&#x60; (GA hold token): releases that many places held by the token (409 &#x60;insufficient_held_places&#x60;, &#x60;hold_token_conflict&#x60;). Every GA operation is idempotent per Idempotency-Key (deterministic receipts/holds/markers), and capacity can never be exceeded nor &#x60;sold_count&#x60; go below zero. Response &#x60;gaAreas: { &lt;areaId&gt;: { areaId, label, quantity, soldCount, status, heldCount?, releasedFrom? } }&#x60;. **&#x60;allowedPreviousStatuses&#x60; / &#x60;rejectedPreviousStatuses&#x60;**: &#x60;free&#x60;, &#x60;booked&#x60;, &#x60;resale&#x60;, &#x60;reservedByToken&#x60;, &#x60;retired&#x60; or a custom status. On violation nothing is written and 409 &#x60;illegal_previous_status&#x60; lists every offending object with its current status. For GA quantities the previous status follows from the operation: &#x60;free&#x60; for book/hold, &#x60;booked&#x60; for a release, &#x60;reservedByToken&#x60; for a release by &#x60;holdToken&#x60;. **&#x60;holdToken&#x60;**: with status &#x60;booked&#x60;, books seats held by that hold token. The hold session is frozen first, so the buyer cannot confirm the same seats concurrently; seats held by another token or not held by this one return 409 &#x60;hold_token_conflict&#x60;. Remaining seats of the session stay held. With &#x60;RELEASE&#x60; it releases GA places (see above). **&#x60;ticketType&#x60;** (per object, &#x60;{ objectId, ticketType }&#x60;, status &#x60;booked&#x60; only): ticket type id recorded on the new booking (order item and reservation, like a confirmed sale) and returned per object; it shows up in reports by ticket type. Other statuses return 400. **&#x60;keepExtraData&#x60;**: keeps the stored extraData; per-object &#x60;extraData&#x60; sent with it is merged on top (without it, the object&#39;s extraData is replaced by the one sent, or cleared). **&#x60;ticketBuyerId&#x60;** (opaque, ≤ 256 chars, never an internal user id) is recorded on new bookings, object statuses, status history and GA hold tokens; query it with GET /events/{eventId}/objects?ticketBuyerId&#x3D;…. **&#x60;channelKeys&#x60;** (channel secret keys or channel ids) restricts the change to public objects and objects of the named channels (409 &#x60;channel_forbidden&#x60; otherwise). Without &#x60;channelKeys&#x60;, or with &#x60;ignoreChannels: true&#x60;, channel partitions are ignored (backward-compatible default). **&#x60;events&#x60;** (max 50, must include the path event): applies the same change to each event of the tenant, labels resolved per event. By default each event is atomic on its own (no cross-event atomicity): response 200 when every event succeeded, otherwise 207 with &#x60;results[]&#x60; (&#x60;{ eventId, ok, objects | status, error, message }&#x60;), &#x60;succeeded&#x60; and &#x60;failed&#x60;. Replaying the same Idempotency-Key returns the stored per-event outcome; retry failed events (listed with their error) with a new key. **&#x60;atomic: true&#x60;** makes the whole call all-or-nothing in one SQL transaction (same engine as POST /events/actions/change-object-status; at most 512 objects across the events): 200 with &#x60;atomic: true&#x60; when everything was applied, otherwise the status of the first failing event and &#x60;results[]&#x60; with &#x60;outcome: failed&#x60; (with &#x60;error&#x60;, &#x60;message&#x60;) or &#x60;rolled_back&#x60; per event — nothing was written. GA administrative holds cannot be atomic (400 &#x60;not_atomic&#x60;). **&#x60;seasonId&#x60;** (season or partial season id; XOR with &#x60;events&#x60;): fans out by unique label to every live member in one transaction (cap 50 members, 64 seats overall). Preconditions and channelKeys apply to every member seat.
454
+ # Resale retains the durable owner and sold status. Optional &#x60;resaleListingId&#x60; groups the objects into one listing (extraData.resaleListingId). Optional &#x60;resalePriceCents&#x60; is stored on extraData and merged into GET /seats on the next cache rebuild. Optional &#x60;listing&#x60; also creates a server-side listing of the objects (type, sellAsWhole, price; see the listings tag): viewers then show and sell it as one listing. Administrative status change on the path event. One SQL transaction per event; seats are locked in id order and every precondition is evaluated under those row locks, so a concurrent hold, purchase or other change cannot slip in between the check and the write. Requires **Idempotency-Key**; a replay returns the stored response and a retry after a crash reuses the same durable booking order. **Objects** (max 64 per call, per event): seat UUID or seat label (labels are resolved per event; a label that matches several seats returns 409 &#x60;ambiguous_label&#x60;; unknown references return 404 &#x60;objects_not_found&#x60;). General admission areas are addressed by UUID or name **with &#x60;quantity&#x60;** (1–10000): - &#x60;booked&#x60;: the places are first reserved in the same Redis structure buyers hold from (capacity minus not-for-sale places), then &#x60;sold_count&#x60; is incremented in the transaction with a &#x60;sold_count + quantity &lt;&#x3D; capacity&#x60; guard; the durable receipt belongs to the administrative booking order (cancel it with POST /orders/{orderId}/cancel). - &#x60;reservedByToken&#x60; (or POST …/actions/hold, GA only): holds the places atomically against capacity minus withheld, sold and held places and issues a **GA hold token** (&#x60;hold: { holdToken, holdUserId, holdExpiresAt }&#x60;), confirmable with POST /ga/confirm (&#x60;holdToken&#x60;, &#x60;userId&#x60; &#x3D; &#x60;holdUserId&#x60;). Optional &#x60;userId&#x60; (customer identity of the hold; one hold per user and area, 409 &#x60;hold_exists&#x60;) and &#x60;holdExpiresInMinutes&#x60; (1–120). 409 &#x60;insufficient_capacity&#x60;. - &#x60;RELEASE&#x60; / &#x60;free&#x60; without &#x60;holdToken&#x60;: releases places of **administrative** bookings (newest receipts first, optionally only those of &#x60;orderId&#x60;), recording a release receipt per consumed booking and decrementing &#x60;sold_count&#x60; under the GA row lock (409 &#x60;insufficient_booked_places&#x60; with &#x60;available&#x60;). Buyer purchases are never released here. - &#x60;RELEASE&#x60; with &#x60;holdToken&#x60; (GA hold token): releases that many places held by the token (409 &#x60;insufficient_held_places&#x60;, &#x60;hold_token_conflict&#x60;). Every GA operation is idempotent per Idempotency-Key (deterministic receipts/holds/markers), and capacity can never be exceeded nor &#x60;sold_count&#x60; go below zero. Response &#x60;gaAreas: { &lt;areaId&gt;: { areaId, label, quantity, soldCount, status, heldCount?, releasedFrom? } }&#x60;. **&#x60;allowedPreviousStatuses&#x60; / &#x60;rejectedPreviousStatuses&#x60;**: &#x60;free&#x60;, &#x60;booked&#x60;, &#x60;resale&#x60;, &#x60;reservedByToken&#x60;, &#x60;retired&#x60; or a custom status. On violation nothing is written and 409 &#x60;illegal_previous_status&#x60; lists every offending object with its current status. For GA quantities the previous status follows from the operation: &#x60;free&#x60; for book/hold, &#x60;booked&#x60; for a release, &#x60;reservedByToken&#x60; for a release by &#x60;holdToken&#x60;. **&#x60;holdToken&#x60;**: with status &#x60;booked&#x60;, books seats held by that hold token. The hold session is frozen first, so the buyer cannot confirm the same seats concurrently; seats held by another token or not held by this one return 409 &#x60;hold_token_conflict&#x60;. Remaining seats of the session stay held. With &#x60;RELEASE&#x60; it releases GA places (see above). **&#x60;ticketType&#x60;** (per object, &#x60;{ objectId, ticketType }&#x60;, status &#x60;booked&#x60; only): ticket type id recorded on the new booking (order item and reservation, like a confirmed sale) and returned per object; it shows up in reports by ticket type. Other statuses return 400. **&#x60;keepExtraData&#x60;**: keeps the stored extraData; per-object &#x60;extraData&#x60; sent with it is merged on top (without it, the object&#39;s extraData is replaced by the one sent, or cleared). **&#x60;ticketBuyerId&#x60;** (opaque, ≤ 256 chars, never an internal user id) is recorded on new bookings, object statuses, status history and GA hold tokens; query it with GET /events/{eventId}/objects?ticketBuyerId&#x3D;…. **&#x60;channelKeys&#x60;** (channel secret keys or channel ids) restricts the change to public objects and objects of the named channels (409 &#x60;channel_forbidden&#x60; otherwise). Without &#x60;channelKeys&#x60;, or with &#x60;ignoreChannels: true&#x60;, channel partitions are ignored (backward-compatible default). **&#x60;events&#x60;** (max 50, must include the path event): applies the same change to each event of the tenant, labels resolved per event. By default each event is atomic on its own (no cross-event atomicity): response 200 when every event succeeded, otherwise 207 with &#x60;results[]&#x60; (&#x60;{ eventId, ok, objects | status, error, message }&#x60;), &#x60;succeeded&#x60; and &#x60;failed&#x60;. Replaying the same Idempotency-Key returns the stored per-event outcome; retry failed events (listed with their error) with a new key. **&#x60;atomic: true&#x60;** makes the whole call all-or-nothing in one SQL transaction (same engine as POST /events/actions/change-object-status; at most 512 objects across the events): 200 with &#x60;atomic: true&#x60; when everything was applied, otherwise the status of the first failing event and &#x60;results[]&#x60; with &#x60;outcome: failed&#x60; (with &#x60;error&#x60;, &#x60;message&#x60;) or &#x60;rolled_back&#x60; per event — nothing was written. GA administrative holds cannot be atomic (400 &#x60;not_atomic&#x60;). **&#x60;seasonId&#x60;** (season or partial season id; XOR with &#x60;events&#x60;): fans out by unique label to every live member in one transaction (cap 50 members, 64 seats overall). Preconditions and channelKeys apply to every member seat.
455
455
  # @param event_id [String]
456
456
  # @param post_api_events_by_event_id_actions_change_object_status_request [PostApiEventsByEventIdActionsChangeObjectStatusRequest]
457
457
  # @param [Hash] opts the optional parameters
@@ -479,7 +479,7 @@ module SeatsChart
479
479
  end
480
480
 
481
481
  # List partial seasons of a season
482
- # Response `{ partialSeasons: [{ id, seasonId, name, eventIds, createdAt }] }`. Booking or releasing with `seasonId` set to a partial season id on POST /api/events/:eventId/actions/change-object-status fans out to the partial season members only, atomically, exactly like a full season.
482
+ # Response `{ partialSeasons: [{ id, seasonId, key, name, eventIds, createdAt }] }`. Booking or releasing with `seasonId` set to a partial season id on POST /api/events/:eventId/actions/change-object-status fans out to the partial season members only, atomically, exactly like a full season.
483
483
  # @param season_id [String]
484
484
  # @param [Hash] opts the optional parameters
485
485
  # @return [nil]
@@ -489,7 +489,7 @@ module SeatsChart
489
489
  end
490
490
 
491
491
  # List partial seasons of a season
492
- # Response &#x60;{ partialSeasons: [{ id, seasonId, name, eventIds, createdAt }] }&#x60;. Booking or releasing with &#x60;seasonId&#x60; set to a partial season id on POST /api/events/:eventId/actions/change-object-status fans out to the partial season members only, atomically, exactly like a full season.
492
+ # Response &#x60;{ partialSeasons: [{ id, seasonId, key, name, eventIds, createdAt }] }&#x60;. Booking or releasing with &#x60;seasonId&#x60; set to a partial season id on POST /api/events/:eventId/actions/change-object-status fans out to the partial season members only, atomically, exactly like a full season.
493
493
  # @param season_id [String]
494
494
  # @param [Hash] opts the optional parameters
495
495
  # @return [Array<(nil, Integer, Hash)>] nil, response status code and response headers
@@ -548,7 +548,7 @@ module SeatsChart
548
548
  end
549
549
 
550
550
  # Get one partial season
551
- # Response `{ partialSeason: { id, seasonId, name, eventIds, createdAt } }`; 404 when it is not a partial season of this season. Booking or releasing with `seasonId` set to a partial season id on POST /api/events/:eventId/actions/change-object-status fans out to the partial season members only, atomically, exactly like a full season.
551
+ # Response `{ partialSeason: { id, seasonId, key, name, eventIds, createdAt } }`; 404 when it is not a partial season of this season. Booking or releasing with `seasonId` set to a partial season id on POST /api/events/:eventId/actions/change-object-status fans out to the partial season members only, atomically, exactly like a full season.
552
552
  # @param season_id [String]
553
553
  # @param partial_season_id [String]
554
554
  # @param [Hash] opts the optional parameters
@@ -559,7 +559,7 @@ module SeatsChart
559
559
  end
560
560
 
561
561
  # Get one partial season
562
- # Response &#x60;{ partialSeason: { id, seasonId, name, eventIds, createdAt } }&#x60;; 404 when it is not a partial season of this season. Booking or releasing with &#x60;seasonId&#x60; set to a partial season id on POST /api/events/:eventId/actions/change-object-status fans out to the partial season members only, atomically, exactly like a full season.
562
+ # Response &#x60;{ partialSeason: { id, seasonId, key, name, eventIds, createdAt } }&#x60;; 404 when it is not a partial season of this season. Booking or releasing with &#x60;seasonId&#x60; set to a partial season id on POST /api/events/:eventId/actions/change-object-status fans out to the partial season members only, atomically, exactly like a full season.
563
563
  # @param season_id [String]
564
564
  # @param partial_season_id [String]
565
565
  # @param [Hash] opts the optional parameters
@@ -4330,7 +4330,7 @@ module SeatsChart
4330
4330
  end
4331
4331
 
4332
4332
  # Update season
4333
- # Rename or set sourceEventId (must be a member). Clearing source blocks sync until reset.
4333
+ # Rename, set / rename / clear the partner `key` (409 `season_key_taken`), or set sourceEventId (must be a member). Clearing source blocks sync until reset.
4334
4334
  # @param season_id [String]
4335
4335
  # @param patch_api_seasons_by_season_id_request [PatchApiSeasonsBySeasonIdRequest]
4336
4336
  # @param [Hash] opts the optional parameters
@@ -4342,7 +4342,7 @@ module SeatsChart
4342
4342
  end
4343
4343
 
4344
4344
  # Update season
4345
- # Rename or set sourceEventId (must be a member). Clearing source blocks sync until reset.
4345
+ # Rename, set / rename / clear the partner &#x60;key&#x60; (409 &#x60;season_key_taken&#x60;), or set sourceEventId (must be a member). Clearing source blocks sync until reset.
4346
4346
  # @param season_id [String]
4347
4347
  # @param patch_api_seasons_by_season_id_request [PatchApiSeasonsBySeasonIdRequest]
4348
4348
  # @param [Hash] opts the optional parameters
@@ -4525,6 +4525,111 @@ module SeatsChart
4525
4525
  return data, status_code, headers
4526
4526
  end
4527
4527
 
4528
+ # Rename a partial season or set its key
4529
+ # Changes `name` and/or `key` (a key sets or renames it; `null` or `\"\"` clears it; 409 `partial_season_key_taken`). Response `{ partialSeason }`. Partner `key`: unique within the season, 1–100 URL-safe characters, never UUID-shaped; usable in place of the partial season id in every partial season path (`/seasons/{seasonIdOrKey}/partial-seasons/{partialSeasonIdOrKey}`), and as body `seasonId` of booking and status changes when no season and no other partial season of the workspace uses it.
4530
+ # @param season_id [String]
4531
+ # @param partial_season_id [String]
4532
+ # @param patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id_request [PatchApiSeasonsBySeasonIdPartialSeasonsByPartialSeasonIdRequest]
4533
+ # @param [Hash] opts the optional parameters
4534
+ # @option opts [String] :idempotency_key Required on transactional routes. Reuse the same key for every retry of one logical operation; the API replays the stored outcome.
4535
+ # @return [nil]
4536
+ def patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id(season_id, partial_season_id, patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id_request, opts = {})
4537
+ patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id_with_http_info(season_id, partial_season_id, patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id_request, opts)
4538
+ nil
4539
+ end
4540
+
4541
+ # Rename a partial season or set its key
4542
+ # Changes &#x60;name&#x60; and/or &#x60;key&#x60; (a key sets or renames it; &#x60;null&#x60; or &#x60;\&quot;\&quot;&#x60; clears it; 409 &#x60;partial_season_key_taken&#x60;). Response &#x60;{ partialSeason }&#x60;. Partner &#x60;key&#x60;: unique within the season, 1–100 URL-safe characters, never UUID-shaped; usable in place of the partial season id in every partial season path (&#x60;/seasons/{seasonIdOrKey}/partial-seasons/{partialSeasonIdOrKey}&#x60;), and as body &#x60;seasonId&#x60; of booking and status changes when no season and no other partial season of the workspace uses it.
4543
+ # @param season_id [String]
4544
+ # @param partial_season_id [String]
4545
+ # @param patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id_request [PatchApiSeasonsBySeasonIdPartialSeasonsByPartialSeasonIdRequest]
4546
+ # @param [Hash] opts the optional parameters
4547
+ # @option opts [String] :idempotency_key Required on transactional routes. Reuse the same key for every retry of one logical operation; the API replays the stored outcome.
4548
+ # @return [Array<(nil, Integer, Hash)>] nil, response status code and response headers
4549
+ def patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id_with_http_info(season_id, partial_season_id, patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id_request, opts = {})
4550
+ if @api_client.config.debugging
4551
+ @api_client.config.logger.debug 'Calling API: SeasonsApi.patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id ...'
4552
+ end
4553
+ # verify the required parameter 'season_id' is set
4554
+ if @api_client.config.client_side_validation && season_id.nil?
4555
+ fail ArgumentError, "Missing the required parameter 'season_id' when calling SeasonsApi.patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id"
4556
+ end
4557
+ if @api_client.config.client_side_validation && season_id.to_s.length > 36
4558
+ fail ArgumentError, 'invalid value for "season_id" when calling SeasonsApi.patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id, the character length must be smaller than or equal to 36.'
4559
+ end
4560
+
4561
+ if @api_client.config.client_side_validation && season_id.to_s.length < 36
4562
+ fail ArgumentError, 'invalid value for "season_id" when calling SeasonsApi.patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id, the character length must be great than or equal to 36.'
4563
+ end
4564
+
4565
+ # verify the required parameter 'partial_season_id' is set
4566
+ if @api_client.config.client_side_validation && partial_season_id.nil?
4567
+ fail ArgumentError, "Missing the required parameter 'partial_season_id' when calling SeasonsApi.patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id"
4568
+ end
4569
+ if @api_client.config.client_side_validation && partial_season_id.to_s.length > 36
4570
+ fail ArgumentError, 'invalid value for "partial_season_id" when calling SeasonsApi.patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id, the character length must be smaller than or equal to 36.'
4571
+ end
4572
+
4573
+ if @api_client.config.client_side_validation && partial_season_id.to_s.length < 36
4574
+ fail ArgumentError, 'invalid value for "partial_season_id" when calling SeasonsApi.patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id, the character length must be great than or equal to 36.'
4575
+ end
4576
+
4577
+ # verify the required parameter 'patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id_request' is set
4578
+ if @api_client.config.client_side_validation && patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id_request.nil?
4579
+ fail ArgumentError, "Missing the required parameter 'patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id_request' when calling SeasonsApi.patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id"
4580
+ end
4581
+ if @api_client.config.client_side_validation && !opts[:'idempotency_key'].nil? && opts[:'idempotency_key'].to_s.length > 255
4582
+ fail ArgumentError, 'invalid value for "opts[:"idempotency_key"]" when calling SeasonsApi.patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id, the character length must be smaller than or equal to 255.'
4583
+ end
4584
+
4585
+ if @api_client.config.client_side_validation && !opts[:'idempotency_key'].nil? && opts[:'idempotency_key'].to_s.length < 1
4586
+ fail ArgumentError, 'invalid value for "opts[:"idempotency_key"]" when calling SeasonsApi.patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id, the character length must be great than or equal to 1.'
4587
+ end
4588
+
4589
+ # resource path
4590
+ local_var_path = '/api/seasons/{seasonId}/partial-seasons/{partialSeasonId}'.sub('{' + 'seasonId' + '}', CGI.escape(season_id.to_s)).sub('{' + 'partialSeasonId' + '}', CGI.escape(partial_season_id.to_s))
4591
+
4592
+ # query parameters
4593
+ query_params = opts[:query_params] || {}
4594
+
4595
+ # header parameters
4596
+ header_params = opts[:header_params] || {}
4597
+ # HTTP header 'Content-Type'
4598
+ content_type = @api_client.select_header_content_type(['application/json', 'multipart/form-data', 'text/plain'])
4599
+ if !content_type.nil?
4600
+ header_params['Content-Type'] = content_type
4601
+ end
4602
+ header_params[:'Idempotency-Key'] = opts[:'idempotency_key'] if !opts[:'idempotency_key'].nil?
4603
+
4604
+ # form parameters
4605
+ form_params = opts[:form_params] || {}
4606
+
4607
+ # http body (model)
4608
+ post_body = opts[:debug_body] || @api_client.object_to_http_body(patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id_request)
4609
+
4610
+ # return_type
4611
+ return_type = opts[:debug_return_type]
4612
+
4613
+ # auth_names
4614
+ auth_names = opts[:debug_auth_names] || ['ApiKeyAuth', 'BearerAuth']
4615
+
4616
+ new_options = opts.merge(
4617
+ :operation => :"SeasonsApi.patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id",
4618
+ :header_params => header_params,
4619
+ :query_params => query_params,
4620
+ :form_params => form_params,
4621
+ :body => post_body,
4622
+ :auth_names => auth_names,
4623
+ :return_type => return_type
4624
+ )
4625
+
4626
+ data, status_code, headers = @api_client.call_api(:PATCH, local_var_path, new_options)
4627
+ if @api_client.config.debugging
4628
+ @api_client.config.logger.debug "API called: SeasonsApi#patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
4629
+ end
4630
+ return data, status_code, headers
4631
+ end
4632
+
4528
4633
  # Override the season status of objects in an event (OVERRIDE_SEASON_STATUS)
4529
4634
  # Requires **Idempotency-Key**. The objects of the path event (a non-source season member) stop following the season status. Idempotent per object. Response `{ ok, eventId, seasonId, overridden, added, released, objects? }`. **No overbooking.** Every object keeps exactly one authority per event (its seat row and Redis key), so an override only changes which (event, object) pairs the season fan-outs touch: season booking (`seasonId` on reserve), season status changes (`seasonId` on change-object-status), season inventory sync and the season booking view skip overridden pairs. Overriding never changes the status: a seat booked for the season stays booked in the event. `release: true` frees the objects in this event only. Unsold objects go through the administrative transition engine (held seats and accepted orders are refused, 409 `inventory_conflict`). Sold objects are refused with 409 `season_booked` (`objects: [{ objectId, label, orderId, seasonTicket }]`) unless `allowBookedRelease: true` is sent explicitly; then only seats of a season (multi-event) order are given back for this event, under the seat row lock: the reservation and the order item of this event are cancelled (`season_status_override`), the seat becomes available and its Redis confirmed marker is cleared; the order stays confirmed for its other events (refunds are up to you). The event's own sales are never released here (409 `event_sale`: cancel the order). Nothing changes on any refusal. The season source event cannot override (409 `season_source_event`); events outside a season get 409 `not_season_member`.
4530
4635
  # @param event_id [String]
@@ -5240,7 +5345,7 @@ module SeatsChart
5240
5345
  end
5241
5346
 
5242
5347
  # Create a partial season
5243
- # Every event must already be a member of the parent season (400 `not_season_member` lists the others). Max 100 partial seasons per season. Booking or releasing with `seasonId` set to a partial season id on POST /api/events/:eventId/actions/change-object-status fans out to the partial season members only, atomically, exactly like a full season.
5348
+ # Every event must already be a member of the parent season (400 `not_season_member` lists the others). Max 100 partial seasons per season. 409 `partial_season_key_taken`. Partner `key`: unique within the season, 1–100 URL-safe characters, never UUID-shaped; usable in place of the partial season id in every partial season path (`/seasons/{seasonIdOrKey}/partial-seasons/{partialSeasonIdOrKey}`), and as body `seasonId` of booking and status changes when no season and no other partial season of the workspace uses it. Booking or releasing with `seasonId` set to a partial season id on POST /api/events/:eventId/actions/change-object-status fans out to the partial season members only, atomically, exactly like a full season.
5244
5349
  # @param season_id [String]
5245
5350
  # @param post_api_seasons_by_season_id_partial_seasons_request [PostApiSeasonsBySeasonIdPartialSeasonsRequest]
5246
5351
  # @param [Hash] opts the optional parameters
@@ -5252,7 +5357,7 @@ module SeatsChart
5252
5357
  end
5253
5358
 
5254
5359
  # Create a partial season
5255
- # Every event must already be a member of the parent season (400 &#x60;not_season_member&#x60; lists the others). Max 100 partial seasons per season. Booking or releasing with &#x60;seasonId&#x60; set to a partial season id on POST /api/events/:eventId/actions/change-object-status fans out to the partial season members only, atomically, exactly like a full season.
5360
+ # Every event must already be a member of the parent season (400 &#x60;not_season_member&#x60; lists the others). Max 100 partial seasons per season. 409 &#x60;partial_season_key_taken&#x60;. Partner &#x60;key&#x60;: unique within the season, 1–100 URL-safe characters, never UUID-shaped; usable in place of the partial season id in every partial season path (&#x60;/seasons/{seasonIdOrKey}/partial-seasons/{partialSeasonIdOrKey}&#x60;), and as body &#x60;seasonId&#x60; of booking and status changes when no season and no other partial season of the workspace uses it. Booking or releasing with &#x60;seasonId&#x60; set to a partial season id on POST /api/events/:eventId/actions/change-object-status fans out to the partial season members only, atomically, exactly like a full season.
5256
5361
  # @param season_id [String]
5257
5362
  # @param post_api_seasons_by_season_id_partial_seasons_request [PostApiSeasonsBySeasonIdPartialSeasonsRequest]
5258
5363
  # @param [Hash] opts the optional parameters
@@ -699,33 +699,27 @@ module SeatsChart
699
699
 
700
700
  # Accept a durable confirmation intent before asynchronous seat materialization
701
701
  # Server-to-server only (`x-api-key`). **Pricing source** (workspace integration mode or event sales rules): `partner` events confirm the declared `seatTicketTypes` and `seatPrices` (or `paidAmountCents`) without a quote; `synced_catalog` events validate them against the pushed price table (409 `price_mismatch`, `price_table_missing`, `ticket_type_required`); `seatschart_catalog` events require a durable catalog quote created before external payment. Final ticket types are re-checked against the event quotas and buyer limit (409 `quota_exceeded`, `buyer_limit_exceeded`, `lot_sold_out`). Configure event currency before quoting. The organizer's booking limits are re-checked (defence in depth; holds enforce them atomically): 409 `booking_limit_exceeded` (`limit`, `requested`), except for holds placed before the current limits were published. After verifying payment with your provider, send quoteId, externalPaymentId, paidAmountCents, paidCurrency and the **`holdToken`** capability returned via `POST /api/seats/reserve`. These payment fields are the authenticated partner's attestation, not gateway verification by SeatsChart. Retries of already accepted legacy decisions remain supported without a quote. Consumer JWTs are rejected — confirmation must not run from the browser. Validates Redis holds, then commits the order and requested items in PostgreSQL before 202. Stream delivery is a best-effort trigger; pending SQL items are reconciled by the worker. Provide externalOrderId for stable partner identity. Legacy callers use a durable tenant-scoped Idempotency-Key identity. Season/group holds require scope=hold and the full source seatIds set; all frozen destinations form one atomic order. GET /api/orders/:orderId reports the atomic cart outcome. HTTP keys are durably bound to the authenticated credential and request; changed payload returns 409. Optional `ticketBuyerId` (opaque partner buyer id) is stored on the order, its reservations and object statuses; when omitted it is inherited from the hold token. Quote failures return 409 with `error: quote_required` (no quoteId) or `error: quote_mismatch` (quote or payment attestation does not match).
702
- # @param x_api_key [String] Partner B2B API key (required for payment commit).
703
702
  # @param idempotency_key [String] Required key (max 255 chars after trim); durable fallback identity when externalOrderId is omitted.
704
703
  # @param post_api_seats_confirm_request [PostApiSeatsConfirmRequest]
705
704
  # @param [Hash] opts the optional parameters
706
705
  # @option opts [String] :x_tenant_id Ignored for bootstrap env keys (bound to DEFAULT_TENANT_ID). Dashboard &#x60;sk_live_…&#x60; keys are tenant-scoped by hash.
707
706
  # @return [nil]
708
- def post_api_seats_confirm(x_api_key, idempotency_key, post_api_seats_confirm_request, opts = {})
709
- post_api_seats_confirm_with_http_info(x_api_key, idempotency_key, post_api_seats_confirm_request, opts)
707
+ def post_api_seats_confirm(idempotency_key, post_api_seats_confirm_request, opts = {})
708
+ post_api_seats_confirm_with_http_info(idempotency_key, post_api_seats_confirm_request, opts)
710
709
  nil
711
710
  end
712
711
 
713
712
  # Accept a durable confirmation intent before asynchronous seat materialization
714
713
  # Server-to-server only (&#x60;x-api-key&#x60;). **Pricing source** (workspace integration mode or event sales rules): &#x60;partner&#x60; events confirm the declared &#x60;seatTicketTypes&#x60; and &#x60;seatPrices&#x60; (or &#x60;paidAmountCents&#x60;) without a quote; &#x60;synced_catalog&#x60; events validate them against the pushed price table (409 &#x60;price_mismatch&#x60;, &#x60;price_table_missing&#x60;, &#x60;ticket_type_required&#x60;); &#x60;seatschart_catalog&#x60; events require a durable catalog quote created before external payment. Final ticket types are re-checked against the event quotas and buyer limit (409 &#x60;quota_exceeded&#x60;, &#x60;buyer_limit_exceeded&#x60;, &#x60;lot_sold_out&#x60;). Configure event currency before quoting. The organizer&#39;s booking limits are re-checked (defence in depth; holds enforce them atomically): 409 &#x60;booking_limit_exceeded&#x60; (&#x60;limit&#x60;, &#x60;requested&#x60;), except for holds placed before the current limits were published. After verifying payment with your provider, send quoteId, externalPaymentId, paidAmountCents, paidCurrency and the **&#x60;holdToken&#x60;** capability returned via &#x60;POST /api/seats/reserve&#x60;. These payment fields are the authenticated partner&#39;s attestation, not gateway verification by SeatsChart. Retries of already accepted legacy decisions remain supported without a quote. Consumer JWTs are rejected — confirmation must not run from the browser. Validates Redis holds, then commits the order and requested items in PostgreSQL before 202. Stream delivery is a best-effort trigger; pending SQL items are reconciled by the worker. Provide externalOrderId for stable partner identity. Legacy callers use a durable tenant-scoped Idempotency-Key identity. Season/group holds require scope&#x3D;hold and the full source seatIds set; all frozen destinations form one atomic order. GET /api/orders/:orderId reports the atomic cart outcome. HTTP keys are durably bound to the authenticated credential and request; changed payload returns 409. Optional &#x60;ticketBuyerId&#x60; (opaque partner buyer id) is stored on the order, its reservations and object statuses; when omitted it is inherited from the hold token. Quote failures return 409 with &#x60;error: quote_required&#x60; (no quoteId) or &#x60;error: quote_mismatch&#x60; (quote or payment attestation does not match).
715
- # @param x_api_key [String] Partner B2B API key (required for payment commit).
716
714
  # @param idempotency_key [String] Required key (max 255 chars after trim); durable fallback identity when externalOrderId is omitted.
717
715
  # @param post_api_seats_confirm_request [PostApiSeatsConfirmRequest]
718
716
  # @param [Hash] opts the optional parameters
719
717
  # @option opts [String] :x_tenant_id Ignored for bootstrap env keys (bound to DEFAULT_TENANT_ID). Dashboard &#x60;sk_live_…&#x60; keys are tenant-scoped by hash.
720
718
  # @return [Array<(nil, Integer, Hash)>] nil, response status code and response headers
721
- def post_api_seats_confirm_with_http_info(x_api_key, idempotency_key, post_api_seats_confirm_request, opts = {})
719
+ def post_api_seats_confirm_with_http_info(idempotency_key, post_api_seats_confirm_request, opts = {})
722
720
  if @api_client.config.debugging
723
721
  @api_client.config.logger.debug 'Calling API: SeatsApi.post_api_seats_confirm ...'
724
722
  end
725
- # verify the required parameter 'x_api_key' is set
726
- if @api_client.config.client_side_validation && x_api_key.nil?
727
- fail ArgumentError, "Missing the required parameter 'x_api_key' when calling SeatsApi.post_api_seats_confirm"
728
- end
729
723
  # verify the required parameter 'idempotency_key' is set
730
724
  if @api_client.config.client_side_validation && idempotency_key.nil?
731
725
  fail ArgumentError, "Missing the required parameter 'idempotency_key' when calling SeatsApi.post_api_seats_confirm"
@@ -749,7 +743,6 @@ module SeatsChart
749
743
  if !content_type.nil?
750
744
  header_params['Content-Type'] = content_type
751
745
  end
752
- header_params[:'x-api-key'] = x_api_key
753
746
  header_params[:'Idempotency-Key'] = idempotency_key
754
747
  header_params[:'x-tenant-id'] = opts[:'x_tenant_id'] if !opts[:'x_tenant_id'].nil?
755
748
 
@@ -941,8 +934,6 @@ module SeatsChart
941
934
  # @param idempotency_key [String] Required deduplication key (max 255 chars after trim); 24h cache replay in Redis per tenant + route.
942
935
  # @param post_api_seats_release_request [PostApiSeatsReleaseRequest]
943
936
  # @param [Hash] opts the optional parameters
944
- # @option opts [String] :x_api_key Partner B2B API key (alternative to Bearer).
945
- # @option opts [String] :authorization Bearer + HS256 JWT for B2C clients.
946
937
  # @option opts [String] :x_tenant_id Tenant id for partner integrations.
947
938
  # @return [nil]
948
939
  def post_api_seats_release(idempotency_key, post_api_seats_release_request, opts = {})
@@ -955,8 +946,6 @@ module SeatsChart
955
946
  # @param idempotency_key [String] Required deduplication key (max 255 chars after trim); 24h cache replay in Redis per tenant + route.
956
947
  # @param post_api_seats_release_request [PostApiSeatsReleaseRequest]
957
948
  # @param [Hash] opts the optional parameters
958
- # @option opts [String] :x_api_key Partner B2B API key (alternative to Bearer).
959
- # @option opts [String] :authorization Bearer + HS256 JWT for B2C clients.
960
949
  # @option opts [String] :x_tenant_id Tenant id for partner integrations.
961
950
  # @return [Array<(nil, Integer, Hash)>] nil, response status code and response headers
962
951
  def post_api_seats_release_with_http_info(idempotency_key, post_api_seats_release_request, opts = {})
@@ -985,8 +974,6 @@ module SeatsChart
985
974
  header_params['Content-Type'] = content_type
986
975
  end
987
976
  header_params[:'Idempotency-Key'] = idempotency_key
988
- header_params[:'x-api-key'] = opts[:'x_api_key'] if !opts[:'x_api_key'].nil?
989
- header_params[:'Authorization'] = opts[:'authorization'] if !opts[:'authorization'].nil?
990
977
  header_params[:'x-tenant-id'] = opts[:'x_tenant_id'] if !opts[:'x_tenant_id'].nil?
991
978
 
992
979
  # form parameters
@@ -1023,8 +1010,6 @@ module SeatsChart
1023
1010
  # @param idempotency_key [String] Required deduplication key (max 255 chars after trim; UUID v4 recommended). 24h idempotent cache replay in Redis per tenant.
1024
1011
  # @param post_api_seats_reserve_request [PostApiSeatsReserveRequest]
1025
1012
  # @param [Hash] opts the optional parameters
1026
- # @option opts [String] :x_api_key Partner B2B API key (alternative to Bearer).
1027
- # @option opts [String] :authorization Bearer + HS256 JWT for B2C clients.
1028
1013
  # @option opts [String] :x_tenant_id Tenant id for partner integrations.
1029
1014
  # @return [nil]
1030
1015
  def post_api_seats_reserve(idempotency_key, post_api_seats_reserve_request, opts = {})
@@ -1037,8 +1022,6 @@ module SeatsChart
1037
1022
  # @param idempotency_key [String] Required deduplication key (max 255 chars after trim; UUID v4 recommended). 24h idempotent cache replay in Redis per tenant.
1038
1023
  # @param post_api_seats_reserve_request [PostApiSeatsReserveRequest]
1039
1024
  # @param [Hash] opts the optional parameters
1040
- # @option opts [String] :x_api_key Partner B2B API key (alternative to Bearer).
1041
- # @option opts [String] :authorization Bearer + HS256 JWT for B2C clients.
1042
1025
  # @option opts [String] :x_tenant_id Tenant id for partner integrations.
1043
1026
  # @return [Array<(nil, Integer, Hash)>] nil, response status code and response headers
1044
1027
  def post_api_seats_reserve_with_http_info(idempotency_key, post_api_seats_reserve_request, opts = {})
@@ -1067,8 +1050,6 @@ module SeatsChart
1067
1050
  header_params['Content-Type'] = content_type
1068
1051
  end
1069
1052
  header_params[:'Idempotency-Key'] = idempotency_key
1070
- header_params[:'x-api-key'] = opts[:'x_api_key'] if !opts[:'x_api_key'].nil?
1071
- header_params[:'Authorization'] = opts[:'authorization'] if !opts[:'authorization'].nil?
1072
1053
  header_params[:'x-tenant-id'] = opts[:'x_tenant_id'] if !opts[:'x_tenant_id'].nil?
1073
1054
 
1074
1055
  # form parameters
@@ -19,8 +19,8 @@ module SeatsChart
19
19
  def initialize(api_client = ApiClient.default)
20
20
  @api_client = api_client
21
21
  end
22
- # Request monitoring per rate-limit lane
23
- # Peak requests per minute and 429 counts per lane for the last 10 minutes, hour, 24 hours or 7 days. The **sales lane** carries the buyer path (seat map reads, manifest/geometry/state, the live stream, holds, renewals, best-available, releases, quotes, confirmations); the **api lane** carries everything else (reports, events, charts, workspaces, webhooks, keys), so reporting bursts never starve sales. Counters are written by the rate limiter in its existing Redis call (no extra round trip); minute data is kept 25 hours, hourly peaks 8 days. 10m/1h: one bucket per minute; 24h: 15-minute buckets (peak minute); 7d: hourly buckets. Dashboard session (any role) or an API key with the `reports` scope.
22
+ # Request monitoring per rate-limit lane, with in-flight (concurrent) requests
23
+ # Peak requests per minute and 429 counts per lane for the last 10 minutes, hour, 24 hours or 7 days. The **sales lane** carries the buyer path (seat map reads, manifest/geometry/state, the live stream, holds, renewals, best-available, releases, quotes, confirmations); the **api lane** carries everything else (reports, events, charts, workspaces, webhooks, keys), so reporting bursts never starve sales. Counters are written by the rate limiter in its existing Redis call (no extra round trip); minute data is kept 25 hours, hourly peaks 8 days. 10m/1h: one bucket per minute; 24h: 15-minute buckets (peak minute); 7d: hourly buckets. `concurrency` reports requests in flight now and the highest number of concurrent requests in the last hour and day, for the workspace and per API key (live SSE streams are connections and are not counted). Each API instance counts in memory and stores a new per-minute peak in the same limiter call, so with several instances the peaks are summed (an upper bound) and `current` is the instance that answered. Dashboard session (any role) or an API key with the `reports` scope.
24
24
  # @param [Hash] opts the optional parameters
25
25
  # @option opts [String] :range Time range (default &#x60;1h&#x60;).
26
26
  # @return [GetApiMonitoringRequests200Response]
@@ -29,8 +29,8 @@ module SeatsChart
29
29
  data
30
30
  end
31
31
 
32
- # Request monitoring per rate-limit lane
33
- # Peak requests per minute and 429 counts per lane for the last 10 minutes, hour, 24 hours or 7 days. The **sales lane** carries the buyer path (seat map reads, manifest/geometry/state, the live stream, holds, renewals, best-available, releases, quotes, confirmations); the **api lane** carries everything else (reports, events, charts, workspaces, webhooks, keys), so reporting bursts never starve sales. Counters are written by the rate limiter in its existing Redis call (no extra round trip); minute data is kept 25 hours, hourly peaks 8 days. 10m/1h: one bucket per minute; 24h: 15-minute buckets (peak minute); 7d: hourly buckets. Dashboard session (any role) or an API key with the &#x60;reports&#x60; scope.
32
+ # Request monitoring per rate-limit lane, with in-flight (concurrent) requests
33
+ # Peak requests per minute and 429 counts per lane for the last 10 minutes, hour, 24 hours or 7 days. The **sales lane** carries the buyer path (seat map reads, manifest/geometry/state, the live stream, holds, renewals, best-available, releases, quotes, confirmations); the **api lane** carries everything else (reports, events, charts, workspaces, webhooks, keys), so reporting bursts never starve sales. Counters are written by the rate limiter in its existing Redis call (no extra round trip); minute data is kept 25 hours, hourly peaks 8 days. 10m/1h: one bucket per minute; 24h: 15-minute buckets (peak minute); 7d: hourly buckets. &#x60;concurrency&#x60; reports requests in flight now and the highest number of concurrent requests in the last hour and day, for the workspace and per API key (live SSE streams are connections and are not counted). Each API instance counts in memory and stores a new per-minute peak in the same limiter call, so with several instances the peaks are summed (an upper bound) and &#x60;current&#x60; is the instance that answered. Dashboard session (any role) or an API key with the &#x60;reports&#x60; scope.
34
34
  # @param [Hash] opts the optional parameters
35
35
  # @option opts [String] :range Time range (default &#x60;1h&#x60;).
36
36
  # @return [Array<(GetApiMonitoringRequests200Response, Integer, Hash)>] GetApiMonitoringRequests200Response data, response status code and response headers
@@ -332,7 +332,7 @@ module SeatsChart
332
332
  end
333
333
 
334
334
  # List subscribable webhook event types
335
- # Event types an endpoint can subscribe to through `eventTypes`. `webhook.test` is sent only by `POST /api/webhooks/{id}/test` and cannot be subscribed to.
335
+ # Event types an endpoint can subscribe to through `eventTypes`. `webhook.test` is sent only by `POST /api/webhooks/{id}/test` and cannot be subscribed to. `aliases`: seats.io-named aliases (`{ type, aliasOf }`), opt-in per endpoint: the aliased event is delivered again under the alias name to endpoints that list it explicitly (same payload, `type` = alias); `[\"*\"]` does not include aliases.
336
336
  # @param [Hash] opts the optional parameters
337
337
  # @return [nil]
338
338
  def get_api_webhooks_event_types(opts = {})
@@ -341,7 +341,7 @@ module SeatsChart
341
341
  end
342
342
 
343
343
  # List subscribable webhook event types
344
- # Event types an endpoint can subscribe to through &#x60;eventTypes&#x60;. &#x60;webhook.test&#x60; is sent only by &#x60;POST /api/webhooks/{id}/test&#x60; and cannot be subscribed to.
344
+ # Event types an endpoint can subscribe to through &#x60;eventTypes&#x60;. &#x60;webhook.test&#x60; is sent only by &#x60;POST /api/webhooks/{id}/test&#x60; and cannot be subscribed to. &#x60;aliases&#x60;: seats.io-named aliases (&#x60;{ type, aliasOf }&#x60;), opt-in per endpoint: the aliased event is delivered again under the alias name to endpoints that list it explicitly (same payload, &#x60;type&#x60; &#x3D; alias); &#x60;[\&quot;*\&quot;]&#x60; does not include aliases.
345
345
  # @param [Hash] opts the optional parameters
346
346
  # @return [Array<(nil, Integer, Hash)>] nil, response status code and response headers
347
347
  def get_api_webhooks_event_types_with_http_info(opts = {})
@@ -269,7 +269,7 @@ module SeatsChart
269
269
  end
270
270
 
271
271
  # Get workspace settings (effective value and source)
272
- # Effective value of every workspace setting, the default it inherits and whether it is overridden. Settings: `holdPeriodMinutes` (1–120; default `SEAT_HOLD_TTL_SEC`, 10 min) — TTL of new and renewed seat/GA holds; `maxSeatsPerHoldToken` (1–64; default 64) — seats one hold token may hold across appends; `ticketBuyerValidation` (default off) — buyer tokens are minted only for a registered ticket buyer id (`POST /ticket-buyers`) and bind it, buyer holds must carry it; `gaPlacesToChannels` (default on) — inventory channels may receive GA place quotas (`areaPlaces`). Each setting either uses the platform default or is overridden for this workspace; `sources` says which.
272
+ # Effective value of every workspace setting, the default it inherits and whether it is overridden. Settings: `holdPeriodMinutes` (1–120; default `SEAT_HOLD_TTL_SEC`, 10 min) — TTL of new and renewed seat/GA holds; `maxSeatsPerHoldToken` (1–64; default 64) — seats one hold token may hold across appends; `ticketBuyerValidation` (default off) — buyer tokens are minted only for a registered ticket buyer id (`POST /ticket-buyers`) and bind it, buyer holds must carry it; `gaPlacesToChannels` (default on) — inventory channels may receive GA place quotas (`areaPlaces`); `newEventsNotForSale` (default off) — new events start with every seat and GA area not for sale (seats.io workspace for-sale mode; an explicit `forSaleConfig` at creation wins, season members still follow the season source). Each setting either uses the platform default or is overridden for this workspace; `sources` says which.
273
273
  # @param [Hash] opts the optional parameters
274
274
  # @return [GetApiWorkspaceSettings200Response]
275
275
  def get_api_workspace_settings(opts = {})
@@ -278,7 +278,7 @@ module SeatsChart
278
278
  end
279
279
 
280
280
  # Get workspace settings (effective value and source)
281
- # Effective value of every workspace setting, the default it inherits and whether it is overridden. Settings: &#x60;holdPeriodMinutes&#x60; (1–120; default &#x60;SEAT_HOLD_TTL_SEC&#x60;, 10 min) — TTL of new and renewed seat/GA holds; &#x60;maxSeatsPerHoldToken&#x60; (1–64; default 64) — seats one hold token may hold across appends; &#x60;ticketBuyerValidation&#x60; (default off) — buyer tokens are minted only for a registered ticket buyer id (&#x60;POST /ticket-buyers&#x60;) and bind it, buyer holds must carry it; &#x60;gaPlacesToChannels&#x60; (default on) — inventory channels may receive GA place quotas (&#x60;areaPlaces&#x60;). Each setting either uses the platform default or is overridden for this workspace; &#x60;sources&#x60; says which.
281
+ # Effective value of every workspace setting, the default it inherits and whether it is overridden. Settings: &#x60;holdPeriodMinutes&#x60; (1–120; default &#x60;SEAT_HOLD_TTL_SEC&#x60;, 10 min) — TTL of new and renewed seat/GA holds; &#x60;maxSeatsPerHoldToken&#x60; (1–64; default 64) — seats one hold token may hold across appends; &#x60;ticketBuyerValidation&#x60; (default off) — buyer tokens are minted only for a registered ticket buyer id (&#x60;POST /ticket-buyers&#x60;) and bind it, buyer holds must carry it; &#x60;gaPlacesToChannels&#x60; (default on) — inventory channels may receive GA place quotas (&#x60;areaPlaces&#x60;); &#x60;newEventsNotForSale&#x60; (default off) — new events start with every seat and GA area not for sale (seats.io workspace for-sale mode; an explicit &#x60;forSaleConfig&#x60; at creation wins, season members still follow the season source). Each setting either uses the platform default or is overridden for this workspace; &#x60;sources&#x60; says which.
282
282
  # @param [Hash] opts the optional parameters
283
283
  # @return [Array<(GetApiWorkspaceSettings200Response, Integer, Hash)>] GetApiWorkspaceSettings200Response data, response status code and response headers
284
284
  def get_api_workspace_settings_with_http_info(opts = {})
@@ -683,7 +683,7 @@ module SeatsChart
683
683
  end
684
684
 
685
685
  # Override workspace settings or return them to the default
686
- # Workspace admins only (dashboard session). A value overrides the default for this workspace; `null` returns the setting to the default; omitted settings are unchanged. Takes effect immediately on this API instance and within 5 seconds on the others (read from the tenant config cache; no per-request query). Every change is audited (`workspace.settings.update`). Settings: `holdPeriodMinutes` (1–120; default `SEAT_HOLD_TTL_SEC`, 10 min) — TTL of new and renewed seat/GA holds; `maxSeatsPerHoldToken` (1–64; default 64) — seats one hold token may hold across appends; `ticketBuyerValidation` (default off) — buyer tokens are minted only for a registered ticket buyer id (`POST /ticket-buyers`) and bind it, buyer holds must carry it; `gaPlacesToChannels` (default on) — inventory channels may receive GA place quotas (`areaPlaces`). Each setting either uses the platform default or is overridden for this workspace; `sources` says which.
686
+ # Workspace admins only (dashboard session). A value overrides the default for this workspace; `null` returns the setting to the default; omitted settings are unchanged. Takes effect immediately on this API instance and within 5 seconds on the others (read from the tenant config cache; no per-request query). Every change is audited (`workspace.settings.update`). Settings: `holdPeriodMinutes` (1–120; default `SEAT_HOLD_TTL_SEC`, 10 min) — TTL of new and renewed seat/GA holds; `maxSeatsPerHoldToken` (1–64; default 64) — seats one hold token may hold across appends; `ticketBuyerValidation` (default off) — buyer tokens are minted only for a registered ticket buyer id (`POST /ticket-buyers`) and bind it, buyer holds must carry it; `gaPlacesToChannels` (default on) — inventory channels may receive GA place quotas (`areaPlaces`); `newEventsNotForSale` (default off) — new events start with every seat and GA area not for sale (seats.io workspace for-sale mode; an explicit `forSaleConfig` at creation wins, season members still follow the season source). Each setting either uses the platform default or is overridden for this workspace; `sources` says which.
687
687
  # @param patch_api_workspace_settings_request [PatchApiWorkspaceSettingsRequest]
688
688
  # @param [Hash] opts the optional parameters
689
689
  # @option opts [String] :idempotency_key Required on transactional routes. Reuse the same key for every retry of one logical operation; the API replays the stored outcome.
@@ -694,7 +694,7 @@ module SeatsChart
694
694
  end
695
695
 
696
696
  # Override workspace settings or return them to the default
697
- # Workspace admins only (dashboard session). A value overrides the default for this workspace; &#x60;null&#x60; returns the setting to the default; omitted settings are unchanged. Takes effect immediately on this API instance and within 5 seconds on the others (read from the tenant config cache; no per-request query). Every change is audited (&#x60;workspace.settings.update&#x60;). Settings: &#x60;holdPeriodMinutes&#x60; (1–120; default &#x60;SEAT_HOLD_TTL_SEC&#x60;, 10 min) — TTL of new and renewed seat/GA holds; &#x60;maxSeatsPerHoldToken&#x60; (1–64; default 64) — seats one hold token may hold across appends; &#x60;ticketBuyerValidation&#x60; (default off) — buyer tokens are minted only for a registered ticket buyer id (&#x60;POST /ticket-buyers&#x60;) and bind it, buyer holds must carry it; &#x60;gaPlacesToChannels&#x60; (default on) — inventory channels may receive GA place quotas (&#x60;areaPlaces&#x60;). Each setting either uses the platform default or is overridden for this workspace; &#x60;sources&#x60; says which.
697
+ # Workspace admins only (dashboard session). A value overrides the default for this workspace; &#x60;null&#x60; returns the setting to the default; omitted settings are unchanged. Takes effect immediately on this API instance and within 5 seconds on the others (read from the tenant config cache; no per-request query). Every change is audited (&#x60;workspace.settings.update&#x60;). Settings: &#x60;holdPeriodMinutes&#x60; (1–120; default &#x60;SEAT_HOLD_TTL_SEC&#x60;, 10 min) — TTL of new and renewed seat/GA holds; &#x60;maxSeatsPerHoldToken&#x60; (1–64; default 64) — seats one hold token may hold across appends; &#x60;ticketBuyerValidation&#x60; (default off) — buyer tokens are minted only for a registered ticket buyer id (&#x60;POST /ticket-buyers&#x60;) and bind it, buyer holds must carry it; &#x60;gaPlacesToChannels&#x60; (default on) — inventory channels may receive GA place quotas (&#x60;areaPlaces&#x60;); &#x60;newEventsNotForSale&#x60; (default off) — new events start with every seat and GA area not for sale (seats.io workspace for-sale mode; an explicit &#x60;forSaleConfig&#x60; at creation wins, season members still follow the season source). Each setting either uses the platform default or is overridden for this workspace; &#x60;sources&#x60; says which.
698
698
  # @param patch_api_workspace_settings_request [PatchApiWorkspaceSettingsRequest]
699
699
  # @param [Hash] opts the optional parameters
700
700
  # @option opts [String] :idempotency_key Required on transactional routes. Reuse the same key for every retry of one logical operation; the API replays the stored outcome.