seatschart 0.1.1 → 0.3.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 (127) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +191 -16
  3. data/lib/seatschart/api/audit_api.rb +2 -2
  4. data/lib/seatschart/api/charts_api.rb +808 -75
  5. data/lib/seatschart/api/embed_api.rb +18 -7
  6. data/lib/seatschart/api/embed_origins_api.rb +63 -2
  7. data/lib/seatschart/api/event_log_api.rb +2 -2
  8. data/lib/seatschart/api/events_api.rb +1594 -112
  9. data/lib/seatschart/api/health_api.rb +244 -0
  10. data/lib/seatschart/api/listings_api.rb +884 -0
  11. data/lib/seatschart/api/map_designer_api.rb +11 -9
  12. data/lib/seatschart/api/object_status_api.rb +2 -2
  13. data/lib/seatschart/api/public_api.rb +350 -0
  14. data/lib/seatschart/api/sandboxes_api.rb +672 -0
  15. data/lib/seatschart/api/seasons_api.rb +455 -42
  16. data/lib/seatschart/api/seats_api.rb +13 -32
  17. data/lib/seatschart/api/usage_api.rb +20 -17
  18. data/lib/seatschart/api/webhooks_api.rb +2 -2
  19. data/lib/seatschart/api/workspace_api.rb +306 -20
  20. data/lib/seatschart/models/api_error.rb +307 -0
  21. data/lib/seatschart/models/api_error_params_value.rb +105 -0
  22. data/lib/seatschart/models/delete_api_sandboxes_by_sandbox_id200_response.rb +255 -0
  23. data/lib/seatschart/models/get_api_monitoring_requests200_response.rb +78 -4
  24. data/lib/seatschart/models/get_api_monitoring_requests200_response_concurrency.rb +318 -0
  25. data/lib/seatschart/models/get_api_monitoring_requests200_response_concurrency_api_keys_inner.rb +297 -0
  26. data/lib/seatschart/models/get_api_monitoring_requests200_response_points_inner.rb +38 -4
  27. data/lib/seatschart/models/get_api_sandboxes200_response.rb +239 -0
  28. data/lib/seatschart/models/get_api_sandboxes200_response_items_inner.rb +431 -0
  29. data/lib/seatschart/models/get_api_sandboxes200_response_items_inner_rate_limits.rb +270 -0
  30. data/lib/seatschart/models/get_api_sandboxes200_response_items_inner_usage.rb +287 -0
  31. data/lib/seatschart/models/get_api_status200_response.rb +387 -0
  32. data/lib/seatschart/models/get_api_status200_response_components_inner.rb +330 -0
  33. data/lib/seatschart/models/get_api_status200_response_components_inner_days_inner.rb +301 -0
  34. data/lib/seatschart/models/get_api_status200_response_incidents_inner.rb +374 -0
  35. data/lib/seatschart/models/get_api_status200_response_maintenance_inner.rb +350 -0
  36. data/lib/seatschart/models/get_api_status503_response.rb +271 -0
  37. data/lib/seatschart/models/get_api_workspace_buyer_extra_data200_response.rb +241 -0
  38. data/lib/seatschart/models/get_api_workspace_defaults200_response.rb +254 -0
  39. data/lib/seatschart/models/get_api_workspace_defaults200_response_renderer.rb +246 -0
  40. data/lib/seatschart/models/get_api_workspace_defaults200_response_renderer_built_in.rb +270 -0
  41. data/lib/seatschart/models/get_api_workspace_settings200_response_effective.rb +20 -4
  42. data/lib/seatschart/models/get_api_workspace_settings200_response_overrides.rb +13 -4
  43. data/lib/seatschart/models/get_api_workspace_settings200_response_sources.rb +32 -4
  44. data/lib/seatschart/models/get_api_workspaces200_response_items_inner.rb +34 -5
  45. data/lib/seatschart/models/patch_api_events_by_event_id_listings_by_listing_id_request.rb +379 -0
  46. data/lib/seatschart/models/patch_api_events_by_event_id_request.rb +16 -6
  47. data/lib/seatschart/models/patch_api_listing_types_by_key_request.rb +376 -0
  48. data/lib/seatschart/models/patch_api_seasons_by_season_id_partial_seasons_by_partial_season_id_request.rb +268 -0
  49. data/lib/seatschart/models/patch_api_seasons_by_season_id_request.rb +41 -5
  50. data/lib/seatschart/models/patch_api_webhooks_by_id_request.rb +1 -1
  51. data/lib/seatschart/models/patch_api_workspace_chart_validation_request_severities.rb +25 -4
  52. data/lib/seatschart/models/patch_api_workspace_defaults_request.rb +224 -0
  53. data/lib/seatschart/models/patch_api_workspace_defaults_request_renderer.rb +249 -0
  54. data/lib/seatschart/models/patch_api_workspace_settings_request.rb +18 -7
  55. data/lib/seatschart/models/post_api_charts_by_chart_id_actions_copy_to_workspace_request.rb +39 -1
  56. data/lib/seatschart/models/post_api_charts_by_chart_id_actions_validate_request.rb +1 -0
  57. data/lib/seatschart/models/post_api_charts_by_chart_id_actions_validate_request_seats_inner_accessibility.rb +6 -6
  58. data/lib/seatschart/models/post_api_charts_by_chart_id_map_publish422_response_issues_inner.rb +64 -6
  59. data/lib/seatschart/models/post_api_charts_by_chart_id_map_publish_request.rb +1 -1
  60. data/lib/seatschart/models/post_api_embed_tokens_request.rb +18 -15
  61. data/lib/seatschart/models/post_api_embed_tokens_request_safe_mode_options.rb +226 -0
  62. data/lib/seatschart/models/post_api_events_actions_change_object_status_request_status_changes_inner.rb +0 -11
  63. data/lib/seatschart/models/post_api_events_actions_edit_for_sale_config_request.rb +251 -0
  64. data/lib/seatschart/models/post_api_events_actions_edit_for_sale_config_request_events_inner.rb +322 -0
  65. data/lib/seatschart/models/post_api_events_bulk_request_events_inner.rb +42 -1
  66. data/lib/seatschart/models/post_api_events_by_event_id_actions_change_object_status_request.rb +13 -26
  67. data/lib/seatschart/models/post_api_events_by_event_id_actions_change_object_status_request_listing.rb +392 -0
  68. data/lib/seatschart/models/post_api_events_by_event_id_actions_edit_for_sale_config_request.rb +277 -0
  69. data/lib/seatschart/models/post_api_events_by_event_id_actions_edit_for_sale_config_request_for_sale_inner.rb +319 -0
  70. data/lib/seatschart/models/post_api_events_by_event_id_actions_mark_everything_as_not_for_sale_request.rb +215 -0
  71. data/lib/seatschart/models/post_api_events_by_event_id_listings_by_listing_id_actions_mark_sold_request.rb +243 -0
  72. data/lib/seatschart/models/post_api_events_by_event_id_listings_request.rb +435 -0
  73. data/lib/seatschart/models/post_api_events_by_event_id_listings_request_objects_inner.rb +104 -0
  74. data/lib/seatschart/models/post_api_events_by_event_id_listings_request_objects_inner_any_of.rb +325 -0
  75. data/lib/seatschart/models/post_api_events_by_event_id_map_publish_request.rb +215 -0
  76. data/lib/seatschart/models/post_api_events_request.rb +42 -1
  77. data/lib/seatschart/models/{patch_api_events_by_event_id_request_categories_inner.rb → post_api_events_request_categories_inner.rb} +3 -3
  78. data/lib/seatschart/models/post_api_extract_seats200_response.rb +459 -0
  79. data/lib/seatschart/models/post_api_extract_seats200_response_seats_inner.rb +323 -0
  80. data/lib/seatschart/models/post_api_extract_seats200_response_suggested_inner.rb +320 -0
  81. data/lib/seatschart/models/post_api_extract_seats_request.rb +124 -4
  82. data/lib/seatschart/models/post_api_extract_seats_request_examples.rb +105 -0
  83. data/lib/seatschart/models/post_api_extract_seats_request_examples_any_of_inner.rb +293 -0
  84. data/lib/seatschart/models/post_api_extract_seats_request_negatives.rb +105 -0
  85. data/lib/seatschart/models/post_api_extract_seats_request_region.rb +105 -0
  86. data/lib/seatschart/models/post_api_extract_seats_request_region_any_of.rb +363 -0
  87. data/lib/seatschart/models/post_api_ga_confirm_request.rb +0 -44
  88. data/lib/seatschart/models/post_api_ga_release_request.rb +0 -11
  89. data/lib/seatschart/models/post_api_ga_reserve_request.rb +0 -33
  90. data/lib/seatschart/models/post_api_hold_tokens_request.rb +0 -22
  91. data/lib/seatschart/models/post_api_listing_types_request.rb +439 -0
  92. data/lib/seatschart/models/post_api_quotes_request.rb +0 -22
  93. data/lib/seatschart/models/post_api_sandboxes201_response.rb +245 -0
  94. data/lib/seatschart/models/post_api_sandboxes201_response_admin_key.rb +286 -0
  95. data/lib/seatschart/models/post_api_sandboxes201_response_copied.rb +313 -0
  96. data/lib/seatschart/models/post_api_sandboxes201_response_copied_charts_inner.rb +281 -0
  97. data/lib/seatschart/models/post_api_sandboxes201_response_copied_events_inner.rb +281 -0
  98. data/lib/seatschart/models/post_api_sandboxes201_response_copied_events_with_own_map_inner.rb +265 -0
  99. data/lib/seatschart/models/post_api_sandboxes201_response_copied_key_conflicts_inner.rb +287 -0
  100. data/lib/seatschart/models/post_api_sandboxes201_response_copied_seasons_inner.rb +312 -0
  101. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_actions_copy_from_production200_response.rb +313 -0
  102. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_actions_copy_from_production_request.rb +255 -0
  103. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_actions_join200_response.rb +271 -0
  104. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_actions_reset200_response.rb +268 -0
  105. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_actions_reset_request.rb +225 -0
  106. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_admin_key201_response.rb +253 -0
  107. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_admin_key201_response_api_key.rb +286 -0
  108. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_admin_key_request.rb +252 -0
  109. data/lib/seatschart/models/post_api_sandboxes_request.rb +319 -0
  110. data/lib/seatschart/models/post_api_seasons_by_season_id_partial_seasons_request.rb +27 -1
  111. data/lib/seatschart/models/post_api_seasons_request.rb +40 -4
  112. data/lib/seatschart/models/post_api_seats_best_available_request.rb +0 -11
  113. data/lib/seatschart/models/post_api_seats_confirm_request.rb +5 -49
  114. data/lib/seatschart/models/post_api_seats_release_request.rb +5 -16
  115. data/lib/seatschart/models/post_api_seats_reserve_request.rb +5 -27
  116. data/lib/seatschart/models/post_api_viewer_tokens_request.rb +0 -11
  117. data/lib/seatschart/models/post_api_webhooks_request.rb +1 -1
  118. data/lib/seatschart/models/post_api_workspaces_request.rb +1 -1
  119. data/lib/seatschart/models/put_api_charts_by_chart_id_map_draft_request.rb +349 -0
  120. data/lib/seatschart/models/put_api_workspace_buyer_extra_data_request.rb +260 -0
  121. data/lib/seatschart/models/put_internal_status_notices_request.rb +242 -0
  122. data/lib/seatschart/models/put_internal_status_notices_request_notices_inner.rb +445 -0
  123. data/lib/seatschart/retry.rb +106 -7
  124. data/lib/seatschart/version.rb +1 -1
  125. data/lib/seatschart.rb +69 -2
  126. metadata +71 -4
  127. data/lib/seatschart/api/default_api.rb +0 -763
@@ -210,7 +210,7 @@ module SeatsChart
210
210
  end
211
211
 
212
212
  # Confirm GA purchase (Postgres sold_count)
213
- # Server-to-server only (`x-api-key`): commits GA capacity after payment. SeatsChart-catalog events require a durable quote and matching externalPaymentId/paidAmountCents/paidCurrency; partner-priced events accept the declared paidAmountCents without a quote and synced catalogs validate it (409 `price_mismatch`). The final ticketTypeId is re-checked against the event sales rules (409 `quota_exceeded`, `buyer_limit_exceeded`, `lot_sold_out`) and the quantity against the organizer's booking limits (409 `booking_limit_exceeded`; holds placed before the current limits were published stay confirmable). Previously accepted legacy receipts remain retryable. Consumer JWTs are rejected. Durably records Idempotency-Key and conditionally increments sold_count before reconciling Redis holds. **Idempotency-Key** required. Optional `ticketBuyerId` is stored on the GA receipt (inherited from the hold token when omitted). Quote failures return 409 with `error: quote_required` (no quoteId) or `error: quote_mismatch` (quote or payment attestation does not match).
213
+ # Server-to-server only (`x-api-key`): commits GA capacity after payment. SeatsChart-catalog events require a durable quote and matching externalPaymentId/paidAmountCents/paidCurrency; partner-priced events accept the declared paidAmountCents without a quote and synced catalogs validate it (409 `price_mismatch`). The final ticketTypeId is re-checked against the event sales rules (409 `quota_exceeded`, `buyer_limit_exceeded`, `lot_sold_out`) and the quantity against the organizer's booking limits (409 `booking_limit_exceeded`; holds placed before the current limits were published stay confirmable). Previously accepted legacy receipts remain retryable. Consumer JWTs are rejected. Durably records Idempotency-Key and conditionally increments sold_count before reconciling Redis holds. **Idempotency-Key** required. Optional `ticketBuyerId` is stored on the GA receipt (inherited from the hold token when omitted). Quote failures return 409 with `error: quote_required` (no quoteId) or `error: quote_mismatch` (quote or payment attestation does not match). Areas sold as a whole (`fixedOccupancy` / `variableOccupancy`): `quantity` is the number of people held (fixed: the capacity); every place of the area is sold and the receipt records the people. Another quantity answers 400 `ga_area_whole`, a quantity different from the people of the hold token 409 `conflict`. Price: the ticket type's price per person, or once for the area when it is priced per area (`priceBy: \"area\"`). The response adds `places`, `people` and `areaType`.
214
214
  # @param idempotency_key [String] Required. Reuse with the same request on retry; a different payload conflicts. Seat confirmation binds this key durably in PostgreSQL; hold mutations use bounded Redis receipts.
215
215
  # @param post_api_ga_confirm_request [PostApiGaConfirmRequest]
216
216
  # @param [Hash] opts the optional parameters
@@ -221,7 +221,7 @@ module SeatsChart
221
221
  end
222
222
 
223
223
  # Confirm GA purchase (Postgres sold_count)
224
- # Server-to-server only (`x-api-key`): commits GA capacity after payment. SeatsChart-catalog events require a durable quote and matching externalPaymentId/paidAmountCents/paidCurrency; partner-priced events accept the declared paidAmountCents without a quote and synced catalogs validate it (409 `price_mismatch`). The final ticketTypeId is re-checked against the event sales rules (409 `quota_exceeded`, `buyer_limit_exceeded`, `lot_sold_out`) and the quantity against the organizer's booking limits (409 `booking_limit_exceeded`; holds placed before the current limits were published stay confirmable). Previously accepted legacy receipts remain retryable. Consumer JWTs are rejected. Durably records Idempotency-Key and conditionally increments sold_count before reconciling Redis holds. **Idempotency-Key** required. Optional `ticketBuyerId` is stored on the GA receipt (inherited from the hold token when omitted). Quote failures return 409 with `error: quote_required` (no quoteId) or `error: quote_mismatch` (quote or payment attestation does not match).
224
+ # Server-to-server only (`x-api-key`): commits GA capacity after payment. SeatsChart-catalog events require a durable quote and matching externalPaymentId/paidAmountCents/paidCurrency; partner-priced events accept the declared paidAmountCents without a quote and synced catalogs validate it (409 `price_mismatch`). The final ticketTypeId is re-checked against the event sales rules (409 `quota_exceeded`, `buyer_limit_exceeded`, `lot_sold_out`) and the quantity against the organizer's booking limits (409 `booking_limit_exceeded`; holds placed before the current limits were published stay confirmable). Previously accepted legacy receipts remain retryable. Consumer JWTs are rejected. Durably records Idempotency-Key and conditionally increments sold_count before reconciling Redis holds. **Idempotency-Key** required. Optional `ticketBuyerId` is stored on the GA receipt (inherited from the hold token when omitted). Quote failures return 409 with `error: quote_required` (no quoteId) or `error: quote_mismatch` (quote or payment attestation does not match). Areas sold as a whole (`fixedOccupancy` / `variableOccupancy`): `quantity` is the number of people held (fixed: the capacity); every place of the area is sold and the receipt records the people. Another quantity answers 400 `ga_area_whole`, a quantity different from the people of the hold token 409 `conflict`. Price: the ticket type's price per person, or once for the area when it is priced per area (`priceBy: \"area\"`). The response adds `places`, `people` and `areaType`.
225
225
  # @param idempotency_key [String] Required. Reuse with the same request on retry; a different payload conflicts. Seat confirmation binds this key durably in PostgreSQL; hold mutations use bounded Redis receipts.
226
226
  # @param post_api_ga_confirm_request [PostApiGaConfirmRequest]
227
227
  # @param [Hash] opts the optional parameters
@@ -374,7 +374,7 @@ module SeatsChart
374
374
  end
375
375
 
376
376
  # Hold GA area capacity (Redis)
377
- # Places a temporary hold on unnumbered GA capacity. **Idempotency-Key** is required; repeats within ~24h return the cached hold response. Optional `ticketBuyerId` is stored on the GA hold token and inherited by `POST /ga/confirm`. The organizer's booking limits cap `quantity` (designer *Max GA tickets per order*, else *Max seats per order*; strictest with the sales-channel default): 409 `booking_limit_exceeded` (`limit`, `current`, `requested`, `kind: \"ga\"`). GA tables sold as a whole (`shape.bookAs: \"whole\"`) take every place in one hold: any other `quantity` answers 409 `ga_table_whole` (`capacity`, `requested`).
377
+ # Places a temporary hold on unnumbered GA capacity. **Idempotency-Key** is required; repeats within ~24h return the cached hold response. Optional `ticketBuyerId` is stored on the GA hold token and inherited by `POST /ga/confirm`. The organizer's booking limits cap `quantity` (designer *Max GA tickets per order*, else *Max seats per order*; strictest with the sales-channel default): 409 `booking_limit_exceeded` (`limit`, `current`, `requested`, `kind: \"ga\"`). GA tables sold as a whole (`shape.bookAs: \"whole\"`) take every place in one hold: any other `quantity` answers 409 `ga_table_whole` (`capacity`, `requested`). Areas sold as a whole (`areaType` `fixedOccupancy` / `variableOccupancy`) are held for one buyer in one piece: `quantity` is the number of people (fixed: exactly the capacity; variable: `minOccupancy`..capacity), every place of the area is held atomically and a second buyer can never hold part of it. Any other quantity answers 400 `ga_area_whole` (`areaType`, `capacity`, `minOccupancy`, `maxOccupancy`, `requested`); an area already held, sold or partly withheld answers 409 `conflict`. A whole area counts as one object against the booking limits (its capacity, at most 50, caps it); its people count against quotas, lots and per-buyer limits. The response adds `places`, `people` and `areaType`.
378
378
  # @param idempotency_key [String] Required. Reuse with the same request on retry; a different payload conflicts. Seat confirmation binds this key durably in PostgreSQL; hold mutations use bounded Redis receipts.
379
379
  # @param post_api_ga_reserve_request [PostApiGaReserveRequest]
380
380
  # @param [Hash] opts the optional parameters
@@ -385,7 +385,7 @@ module SeatsChart
385
385
  end
386
386
 
387
387
  # Hold GA area capacity (Redis)
388
- # Places a temporary hold on unnumbered GA capacity. **Idempotency-Key** is required; repeats within ~24h return the cached hold response. Optional `ticketBuyerId` is stored on the GA hold token and inherited by `POST /ga/confirm`. The organizer's booking limits cap `quantity` (designer *Max GA tickets per order*, else *Max seats per order*; strictest with the sales-channel default): 409 `booking_limit_exceeded` (`limit`, `current`, `requested`, `kind: \"ga\"`). GA tables sold as a whole (`shape.bookAs: \"whole\"`) take every place in one hold: any other `quantity` answers 409 `ga_table_whole` (`capacity`, `requested`).
388
+ # Places a temporary hold on unnumbered GA capacity. **Idempotency-Key** is required; repeats within ~24h return the cached hold response. Optional `ticketBuyerId` is stored on the GA hold token and inherited by `POST /ga/confirm`. The organizer's booking limits cap `quantity` (designer *Max GA tickets per order*, else *Max seats per order*; strictest with the sales-channel default): 409 `booking_limit_exceeded` (`limit`, `current`, `requested`, `kind: \"ga\"`). GA tables sold as a whole (`shape.bookAs: \"whole\"`) take every place in one hold: any other `quantity` answers 409 `ga_table_whole` (`capacity`, `requested`). Areas sold as a whole (`areaType` `fixedOccupancy` / `variableOccupancy`) are held for one buyer in one piece: `quantity` is the number of people (fixed: exactly the capacity; variable: `minOccupancy`..capacity), every place of the area is held atomically and a second buyer can never hold part of it. Any other quantity answers 400 `ga_area_whole` (`areaType`, `capacity`, `minOccupancy`, `maxOccupancy`, `requested`); an area already held, sold or partly withheld answers 409 `conflict`. A whole area counts as one object against the booking limits (its capacity, at most 50, caps it); its people count against quotas, lots and per-buyer limits. The response adds `places`, `people` and `areaType`.
389
389
  # @param idempotency_key [String] Required. Reuse with the same request on retry; a different payload conflicts. Seat confirmation binds this key durably in PostgreSQL; hold mutations use bounded Redis receipts.
390
390
  # @param post_api_ga_reserve_request [PostApiGaReserveRequest]
391
391
  # @param [Hash] opts the optional parameters
@@ -621,7 +621,7 @@ module SeatsChart
621
621
  end
622
622
 
623
623
  # Suggest or atomically hold best available seats
624
- # Returns seat IDs for the requested quantity, preferring adjacent same-row groups near the map center. Filter the candidate pool by `category` (or ordered `categories`, max 10: windows of the first category are tried before the second, and so on), optional `sectionId` (layout section id or name) and optional `zone` (layout zone id or name; seats resolve explicit zone assignment, then their section zone, then the zone outline) before ranking. `tryToPreventOrphanSeats` (default **true**) skips adjacent windows that would leave a single empty seat at either end of the run, falling back to them only when nothing else fits. `ticketTypes` (`{ ticketTypeId: count }`) sets `quantity` to the sum, restricts the search to categories whose ticket catalog offers every requested type, and returns `ticketTypes` (seatId → ticketTypeId) ready to send as `seatTicketTypes` on confirm; events without ticket types reject it. `accessibleSeats` (N) only returns windows containing at least N seats flagged `accessibility.wheelchair` in the published seat structure (409 when no such window exists). `channel` is salesChannel order limits only. Pass **`x-channel-key`** for inventory partitions — do not send the secret in the body. **`hold: false` (default):** suggest only — does not lock. **`hold: true`:** ranks up to 32 candidate windows across the category preferences, locks the first fit in one Lua call each (all-or-nothing per window), then O(cart) PG gates (available/forSale/channel); on gate failure releases only the locks it added. Requires **Idempotency-Key**, and `userId` unless `holdToken` is given. `holdToken` appends the seats to that existing hold session (same expiry bound; 409 `hold_token_conflict` when the session is expired, foreign, confirming or full). `extraData` is stored on the held seats (requires hold). Returns `hold_token` for confirm. The organizer's booking limits (designer *Max seats per order*) cap `quantity` and, with `holdToken`, the seats already on the token: best-available never picks more than allowed (409 `booking_limit_exceeded` with `limit`, `current`, `requested`). `sections` (max 20 section ids or names, XOR with `sectionId`) ranks across the union of those sections. **API keys / dashboard sessions only:** `channelKeys` (channel secret keys or ids) restricts the pool to public seats plus those channels, `ignoreChannels: true` allows every channel (both replace `x-channel-key`; buyers get 403). `orderId` (with `hold`) is stored on the held seats as `extraData.orderId` and echoed in the response; pass it as `externalOrderId` on confirm. **`status: \"booked\"`** (API keys with the `bookings` scope, or dashboard sessions allowed to change object statuses; buyers get 403) books the best window directly instead of holding it: the same administrative booking as POST /events/{eventId}/actions/book (one SQL transaction under the seat row locks; a seat held by a buyer is never taken; when a ranked window was taken meanwhile the next one is tried). Requires **Idempotency-Key**: the booking order id is derived from it, so a retry returns the same booking. `ticketTypes` are recorded per seat, `extraData` and `orderId` (as `extraData.orderId`) are stored on the booked seats. Response: `status: \"booked\"`, `booked: true`, `bookingOrderId` (cancel with POST /orders/{orderId}/cancel) and `objects` (status, extraData, orderId, ticketType per seat). `status: \"reservedByToken\"` is the same as `hold: true`. **`keepExtraData: true`** (hold or booked) keeps the seats' stored extraData and merges `extraData` / `orderId` on top instead of replacing it.
624
+ # Returns seat IDs for the requested quantity, preferring adjacent same-row groups near the map center. Filter the candidate pool by `category` (or ordered `categories`, max 10: windows of the first category are tried before the second, and so on), optional `sectionId` (layout section id or name) and optional `zone` (layout zone id or name; seats resolve explicit zone assignment, then their section zone, then the zone outline) before ranking. `tryToPreventOrphanSeats` (default **true**) skips adjacent windows that would leave a single empty seat at either end of the run, falling back to them only when nothing else fits. `ticketTypes` (`{ ticketTypeId: count }`) sets `quantity` to the sum, restricts the search to categories whose ticket catalog offers every requested type, and returns `ticketTypes` (seatId → ticketTypeId) ready to send as `seatTicketTypes` on confirm; events without ticket types reject it. `accessibleSeats` (N) only returns windows containing at least N seats flagged `accessibility.wheelchair` in the published seat structure (409 when no such window exists). `channel` is salesChannel order limits only. Pass **`x-channel-key`** for inventory partitions — do not send the secret in the body. **`hold: false` (default):** suggest only — does not lock. **`hold: true`:** ranks up to 32 candidate windows across the category preferences, locks the first fit in one Lua call each (all-or-nothing per window), then O(cart) PG gates (available/forSale/channel; seats that are not for sale are never picked, not even resale-listed ones of non-propagating season members: those are bought by holding the seats of the listing); on gate failure releases only the locks it added. Requires **Idempotency-Key**, and `userId` unless `holdToken` is given. `holdToken` appends the seats to that existing hold session (same expiry bound; 409 `hold_token_conflict` when the session is expired, foreign, confirming or full). `extraData` is stored on the held seats (requires hold). Returns `hold_token` for confirm. The organizer's booking limits (designer *Max seats per order*) cap `quantity` and, with `holdToken`, the seats already on the token: best-available never picks more than allowed (409 `booking_limit_exceeded` with `limit`, `current`, `requested`). `sections` (max 20 section ids or names, XOR with `sectionId`) ranks across the union of those sections. **API keys / dashboard sessions only:** `channelKeys` (channel secret keys or ids) restricts the pool to public seats plus those channels, `ignoreChannels: true` allows every channel (both replace `x-channel-key`; buyers get 403). `orderId` (with `hold`) is stored on the held seats as `extraData.orderId` and echoed in the response; pass it as `externalOrderId` on confirm. **`status: \"booked\"`** (API keys with the `bookings` scope, or dashboard sessions allowed to change object statuses; buyers get 403) books the best window directly instead of holding it: the same administrative booking as POST /events/{eventId}/actions/book (one SQL transaction under the seat row locks; a seat held by a buyer is never taken; when a ranked window was taken meanwhile the next one is tried). Requires **Idempotency-Key**: the booking order id is derived from it, so a retry returns the same booking. `ticketTypes` are recorded per seat, `extraData` and `orderId` (as `extraData.orderId`) are stored on the booked seats. Response: `status: \"booked\"`, `booked: true`, `bookingOrderId` (cancel with POST /orders/{orderId}/cancel) and `objects` (status, extraData, orderId, ticketType per seat). `status: \"reservedByToken\"` is the same as `hold: true`. **`keepExtraData: true`** (hold or booked) keeps the seats' stored extraData and merges `extraData` / `orderId` on top instead of replacing it.
625
625
  # @param post_api_seats_best_available_request [PostApiSeatsBestAvailableRequest]
626
626
  # @param [Hash] opts the optional parameters
627
627
  # @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.
@@ -632,7 +632,7 @@ module SeatsChart
632
632
  end
633
633
 
634
634
  # Suggest or atomically hold best available seats
635
- # Returns seat IDs for the requested quantity, preferring adjacent same-row groups near the map center. Filter the candidate pool by `category` (or ordered `categories`, max 10: windows of the first category are tried before the second, and so on), optional `sectionId` (layout section id or name) and optional `zone` (layout zone id or name; seats resolve explicit zone assignment, then their section zone, then the zone outline) before ranking. `tryToPreventOrphanSeats` (default **true**) skips adjacent windows that would leave a single empty seat at either end of the run, falling back to them only when nothing else fits. `ticketTypes` (`{ ticketTypeId: count }`) sets `quantity` to the sum, restricts the search to categories whose ticket catalog offers every requested type, and returns `ticketTypes` (seatId → ticketTypeId) ready to send as `seatTicketTypes` on confirm; events without ticket types reject it. `accessibleSeats` (N) only returns windows containing at least N seats flagged `accessibility.wheelchair` in the published seat structure (409 when no such window exists). `channel` is salesChannel order limits only. Pass **`x-channel-key`** for inventory partitions — do not send the secret in the body. **`hold: false` (default):** suggest only — does not lock. **`hold: true`:** ranks up to 32 candidate windows across the category preferences, locks the first fit in one Lua call each (all-or-nothing per window), then O(cart) PG gates (available/forSale/channel); on gate failure releases only the locks it added. Requires **Idempotency-Key**, and `userId` unless `holdToken` is given. `holdToken` appends the seats to that existing hold session (same expiry bound; 409 `hold_token_conflict` when the session is expired, foreign, confirming or full). `extraData` is stored on the held seats (requires hold). Returns `hold_token` for confirm. The organizer's booking limits (designer *Max seats per order*) cap `quantity` and, with `holdToken`, the seats already on the token: best-available never picks more than allowed (409 `booking_limit_exceeded` with `limit`, `current`, `requested`). `sections` (max 20 section ids or names, XOR with `sectionId`) ranks across the union of those sections. **API keys / dashboard sessions only:** `channelKeys` (channel secret keys or ids) restricts the pool to public seats plus those channels, `ignoreChannels: true` allows every channel (both replace `x-channel-key`; buyers get 403). `orderId` (with `hold`) is stored on the held seats as `extraData.orderId` and echoed in the response; pass it as `externalOrderId` on confirm. **`status: \"booked\"`** (API keys with the `bookings` scope, or dashboard sessions allowed to change object statuses; buyers get 403) books the best window directly instead of holding it: the same administrative booking as POST /events/{eventId}/actions/book (one SQL transaction under the seat row locks; a seat held by a buyer is never taken; when a ranked window was taken meanwhile the next one is tried). Requires **Idempotency-Key**: the booking order id is derived from it, so a retry returns the same booking. `ticketTypes` are recorded per seat, `extraData` and `orderId` (as `extraData.orderId`) are stored on the booked seats. Response: `status: \"booked\"`, `booked: true`, `bookingOrderId` (cancel with POST /orders/{orderId}/cancel) and `objects` (status, extraData, orderId, ticketType per seat). `status: \"reservedByToken\"` is the same as `hold: true`. **`keepExtraData: true`** (hold or booked) keeps the seats' stored extraData and merges `extraData` / `orderId` on top instead of replacing it.
635
+ # Returns seat IDs for the requested quantity, preferring adjacent same-row groups near the map center. Filter the candidate pool by `category` (or ordered `categories`, max 10: windows of the first category are tried before the second, and so on), optional `sectionId` (layout section id or name) and optional `zone` (layout zone id or name; seats resolve explicit zone assignment, then their section zone, then the zone outline) before ranking. `tryToPreventOrphanSeats` (default **true**) skips adjacent windows that would leave a single empty seat at either end of the run, falling back to them only when nothing else fits. `ticketTypes` (`{ ticketTypeId: count }`) sets `quantity` to the sum, restricts the search to categories whose ticket catalog offers every requested type, and returns `ticketTypes` (seatId → ticketTypeId) ready to send as `seatTicketTypes` on confirm; events without ticket types reject it. `accessibleSeats` (N) only returns windows containing at least N seats flagged `accessibility.wheelchair` in the published seat structure (409 when no such window exists). `channel` is salesChannel order limits only. Pass **`x-channel-key`** for inventory partitions — do not send the secret in the body. **`hold: false` (default):** suggest only — does not lock. **`hold: true`:** ranks up to 32 candidate windows across the category preferences, locks the first fit in one Lua call each (all-or-nothing per window), then O(cart) PG gates (available/forSale/channel; seats that are not for sale are never picked, not even resale-listed ones of non-propagating season members: those are bought by holding the seats of the listing); on gate failure releases only the locks it added. Requires **Idempotency-Key**, and `userId` unless `holdToken` is given. `holdToken` appends the seats to that existing hold session (same expiry bound; 409 `hold_token_conflict` when the session is expired, foreign, confirming or full). `extraData` is stored on the held seats (requires hold). Returns `hold_token` for confirm. The organizer's booking limits (designer *Max seats per order*) cap `quantity` and, with `holdToken`, the seats already on the token: best-available never picks more than allowed (409 `booking_limit_exceeded` with `limit`, `current`, `requested`). `sections` (max 20 section ids or names, XOR with `sectionId`) ranks across the union of those sections. **API keys / dashboard sessions only:** `channelKeys` (channel secret keys or ids) restricts the pool to public seats plus those channels, `ignoreChannels: true` allows every channel (both replace `x-channel-key`; buyers get 403). `orderId` (with `hold`) is stored on the held seats as `extraData.orderId` and echoed in the response; pass it as `externalOrderId` on confirm. **`status: \"booked\"`** (API keys with the `bookings` scope, or dashboard sessions allowed to change object statuses; buyers get 403) books the best window directly instead of holding it: the same administrative booking as POST /events/{eventId}/actions/book (one SQL transaction under the seat row locks; a seat held by a buyer is never taken; when a ranked window was taken meanwhile the next one is tried). Requires **Idempotency-Key**: the booking order id is derived from it, so a retry returns the same booking. `ticketTypes` are recorded per seat, `extraData` and `orderId` (as `extraData.orderId`) are stored on the booked seats. Response: `status: \"booked\"`, `booked: true`, `bookingOrderId` (cancel with POST /orders/{orderId}/cancel) and `objects` (status, extraData, orderId, ticketType per seat). `status: \"reservedByToken\"` is the same as `hold: true`. **`keepExtraData: true`** (hold or booked) keeps the seats' stored extraData and merges `extraData` / `orderId` on top instead of replacing it.
636
636
  # @param post_api_seats_best_available_request [PostApiSeatsBestAvailableRequest]
637
637
  # @param [Hash] opts the optional parameters
638
638
  # @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.
@@ -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 `sk_live_…` 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 (`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).
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 `sk_live_…` 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
 
@@ -937,12 +930,10 @@ module SeatsChart
937
930
  end
938
931
 
939
932
  # Clear Redis TTL holds before expiry (checkout abandoned / declined)
940
- # Deletes KeyDB TTL seat locks when they are authorized by the **`holdToken`** capability, rejects seats already sold in Postgres, publishes **`SSE` `available`** only for locks actually removed. **`Idempotency-Key`** header is **required**; repeats within ~24h return the cached response (no duplicate side effects). Also: **`x-api-key`** or **`Authorization: Bearer`**.
933
+ # Deletes KeyDB TTL seat locks when they are authorized by the **`holdToken`** capability, rejects seats already sold in Postgres, publishes **`SSE` `available`** only for locks actually removed. Releasing any seat of a held listing sold as a whole releases the whole listing (its other seats in this hold) in the same atomic call; the response `seatIds` lists every seat released. **`Idempotency-Key`** header is **required**; repeats within ~24h return the cached response (no duplicate side effects). Also: **`x-api-key`** or **`Authorization: Bearer`**.
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 = {})
@@ -951,12 +942,10 @@ module SeatsChart
951
942
  end
952
943
 
953
944
  # Clear Redis TTL holds before expiry (checkout abandoned / declined)
954
- # Deletes KeyDB TTL seat locks when they are authorized by the **&#x60;holdToken&#x60;** capability, rejects seats already sold in Postgres, publishes **&#x60;SSE&#x60; &#x60;available&#x60;** only for locks actually removed. **&#x60;Idempotency-Key&#x60;** header is **required**; repeats within ~24h return the cached response (no duplicate side effects). Also: **&#x60;x-api-key&#x60;** or **&#x60;Authorization: Bearer&#x60;**.
945
+ # Deletes KeyDB TTL seat locks when they are authorized by the **&#x60;holdToken&#x60;** capability, rejects seats already sold in Postgres, publishes **&#x60;SSE&#x60; &#x60;available&#x60;** only for locks actually removed. Releasing any seat of a held listing sold as a whole releases the whole listing (its other seats in this hold) in the same atomic call; the response &#x60;seatIds&#x60; lists every seat released. **&#x60;Idempotency-Key&#x60;** header is **required**; repeats within ~24h return the cached response (no duplicate side effects). Also: **&#x60;x-api-key&#x60;** or **&#x60;Authorization: Bearer&#x60;**.
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
@@ -1019,12 +1006,10 @@ module SeatsChart
1019
1006
  end
1020
1007
 
1021
1008
  # Place a temporary Redis hold (Lua TTL) before payment
1022
- # JSON body: `eventId`, `seatIds` (1–64 UUIDs, unique), `userId`, optional `holdToken` capability to append seats to an existing session. `userId` is customer metadata, never ownership proof. Renew/append share a two-hour maximum session lifetime. Optional `ticketBuyerId` (opaque partner buyer id) is stored on a new hold token and inherited by its confirmation. `eventId` also accepts the event key. Headers: **x-api-key** (B2B) *or* **Authorization: Bearer** (HS256 JWT); optional **x-tenant-id**; **`Idempotency-Key` is required** (1–255 chars after trim; use a fresh UUID v4 per checkout attempt). Repeats with the same key within ~24h return the cached HTTP status and JSON without re-running the Lua lock. Applies Redis TTL locks (**default 600 s**, overridden by **`SEAT_HOLD_TTL_SEC`**, or by the workspace **hold period** setting — `PATCH /workspace/settings`) with SSE `seat` → **`locked`**; Postgres remains **`available`** until **`POST /api/seats/confirm`** persists **`sold`** via the reservation worker. A hold token holds at most the workspace `maxSeatsPerHoldToken` seats (409 `seat_limit`). **Booking limits:** the organizer's *Max seats per order* (designer → Booking limits, stored as `layoutMeta.bookingRules` of the published chart/event layout) caps the seats one hold token holds, appends included, checked in the same atomic call as the locks (parallel appends cannot exceed it); the strictest of the sales-channel default, this limit, the per-buyer limit and `maxSeatsPerHoldToken` wins. Refused with 409 `booking_limit_exceeded` (`limit`, `current` seats already on the token, `requested`, `kind: \"seats\"`). Holds placed before a lower limit was published keep their seats and stay confirmable; they only cannot grow. With ticket buyer validation on, buyer tokens must carry a bound ticket buyer id (403 `ticket_buyer_required` / `ticket_buyer_mismatch`).
1009
+ # JSON body: `eventId`, `seatIds` (1–64 UUIDs, unique; up to the workspace `maxSeatsPerHoldToken` with large group holds), `userId`, optional `holdToken` capability to append seats to an existing session. `userId` is customer metadata, never ownership proof. Renew/append share a two-hour maximum session lifetime. Optional `ticketBuyerId` (opaque partner buyer id) is stored on a new hold token and inherited by its confirmation. `eventId` also accepts the event key. Headers: **x-api-key** (B2B) *or* **Authorization: Bearer** (HS256 JWT); optional **x-tenant-id**; **`Idempotency-Key` is required** (1–255 chars after trim; use a fresh UUID v4 per checkout attempt). Repeats with the same key within ~24h return the cached HTTP status and JSON without re-running the Lua lock. Applies Redis TTL locks (**default 600 s**, overridden by **`SEAT_HOLD_TTL_SEC`**, or by the workspace **hold period** setting — `PATCH /workspace/settings`) with SSE `seat` → **`locked`**; Postgres remains **`available`** until **`POST /api/seats/confirm`** persists **`sold`** via the reservation worker. A hold token holds at most the workspace `maxSeatsPerHoldToken` seats (409 `seat_limit`). **Large group holds (opt-in):** a workspace `maxSeatsPerHoldToken` above 64 (up to 1000, `PATCH /workspace/settings`) lets one request and one hold token hold that many seats of one event; the request is still one atomic lock — every seat of the group is held under the token, or none is (409 `SEAT_LOCKED` when any seat is taken, nothing locked). The sales-channel defaults (web 8, box office 20, partner 64) then step aside; the organizer's booking limits and the workspace cap still apply. Season and multi-event holds keep the 64-lock limit. **Booking limits:** the organizer's *Max seats per order* (designer → Booking limits, stored as `layoutMeta.bookingRules` of the published chart/event layout) caps the seats one hold token holds, appends included, checked in the same atomic call as the locks (parallel appends cannot exceed it); the strictest of the sales-channel default, this limit, the per-buyer limit and `maxSeatsPerHoldToken` wins. Refused with 409 `booking_limit_exceeded` (`limit`, `current` seats already on the token, `requested`, `kind: \"seats\"`). Holds placed before a lower limit was published keep their seats and stay confirmable; they only cannot grow. With ticket buyer validation on, buyer tokens must carry a bound ticket buyer id (403 `ticket_buyer_required` / `ticket_buyer_mismatch`). Seats that are not for sale are refused with 409 `SEAT_NOT_FOR_SALE`, except a seat with an active **resale** listing in a season member whose for-sale configuration does not propagate (`forSalePropagated: false`, e.g. a season-ticket seat its holder resells for one game); the confirmation and the order commit apply the same rule.
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 = {})
@@ -1033,12 +1018,10 @@ module SeatsChart
1033
1018
  end
1034
1019
 
1035
1020
  # Place a temporary Redis hold (Lua TTL) before payment
1036
- # JSON body: &#x60;eventId&#x60;, &#x60;seatIds&#x60; (1–64 UUIDs, unique), &#x60;userId&#x60;, optional &#x60;holdToken&#x60; capability to append seats to an existing session. &#x60;userId&#x60; is customer metadata, never ownership proof. Renew/append share a two-hour maximum session lifetime. Optional &#x60;ticketBuyerId&#x60; (opaque partner buyer id) is stored on a new hold token and inherited by its confirmation. &#x60;eventId&#x60; also accepts the event key. Headers: **x-api-key** (B2B) *or* **Authorization: Bearer** (HS256 JWT); optional **x-tenant-id**; **&#x60;Idempotency-Key&#x60; is required** (1–255 chars after trim; use a fresh UUID v4 per checkout attempt). Repeats with the same key within ~24h return the cached HTTP status and JSON without re-running the Lua lock. Applies Redis TTL locks (**default 600 s**, overridden by **&#x60;SEAT_HOLD_TTL_SEC&#x60;**, or by the workspace **hold period** setting — &#x60;PATCH /workspace/settings&#x60;) with SSE &#x60;seat&#x60; → **&#x60;locked&#x60;**; Postgres remains **&#x60;available&#x60;** until **&#x60;POST /api/seats/confirm&#x60;** persists **&#x60;sold&#x60;** via the reservation worker. A hold token holds at most the workspace &#x60;maxSeatsPerHoldToken&#x60; seats (409 &#x60;seat_limit&#x60;). **Booking limits:** the organizer&#39;s *Max seats per order* (designer → Booking limits, stored as &#x60;layoutMeta.bookingRules&#x60; of the published chart/event layout) caps the seats one hold token holds, appends included, checked in the same atomic call as the locks (parallel appends cannot exceed it); the strictest of the sales-channel default, this limit, the per-buyer limit and &#x60;maxSeatsPerHoldToken&#x60; wins. Refused with 409 &#x60;booking_limit_exceeded&#x60; (&#x60;limit&#x60;, &#x60;current&#x60; seats already on the token, &#x60;requested&#x60;, &#x60;kind: \&quot;seats\&quot;&#x60;). Holds placed before a lower limit was published keep their seats and stay confirmable; they only cannot grow. With ticket buyer validation on, buyer tokens must carry a bound ticket buyer id (403 &#x60;ticket_buyer_required&#x60; / &#x60;ticket_buyer_mismatch&#x60;).
1021
+ # JSON body: &#x60;eventId&#x60;, &#x60;seatIds&#x60; (1–64 UUIDs, unique; up to the workspace &#x60;maxSeatsPerHoldToken&#x60; with large group holds), &#x60;userId&#x60;, optional &#x60;holdToken&#x60; capability to append seats to an existing session. &#x60;userId&#x60; is customer metadata, never ownership proof. Renew/append share a two-hour maximum session lifetime. Optional &#x60;ticketBuyerId&#x60; (opaque partner buyer id) is stored on a new hold token and inherited by its confirmation. &#x60;eventId&#x60; also accepts the event key. Headers: **x-api-key** (B2B) *or* **Authorization: Bearer** (HS256 JWT); optional **x-tenant-id**; **&#x60;Idempotency-Key&#x60; is required** (1–255 chars after trim; use a fresh UUID v4 per checkout attempt). Repeats with the same key within ~24h return the cached HTTP status and JSON without re-running the Lua lock. Applies Redis TTL locks (**default 600 s**, overridden by **&#x60;SEAT_HOLD_TTL_SEC&#x60;**, or by the workspace **hold period** setting — &#x60;PATCH /workspace/settings&#x60;) with SSE &#x60;seat&#x60; → **&#x60;locked&#x60;**; Postgres remains **&#x60;available&#x60;** until **&#x60;POST /api/seats/confirm&#x60;** persists **&#x60;sold&#x60;** via the reservation worker. A hold token holds at most the workspace &#x60;maxSeatsPerHoldToken&#x60; seats (409 &#x60;seat_limit&#x60;). **Large group holds (opt-in):** a workspace &#x60;maxSeatsPerHoldToken&#x60; above 64 (up to 1000, &#x60;PATCH /workspace/settings&#x60;) lets one request and one hold token hold that many seats of one event; the request is still one atomic lock — every seat of the group is held under the token, or none is (409 &#x60;SEAT_LOCKED&#x60; when any seat is taken, nothing locked). The sales-channel defaults (web 8, box office 20, partner 64) then step aside; the organizer&#39;s booking limits and the workspace cap still apply. Season and multi-event holds keep the 64-lock limit. **Booking limits:** the organizer&#39;s *Max seats per order* (designer → Booking limits, stored as &#x60;layoutMeta.bookingRules&#x60; of the published chart/event layout) caps the seats one hold token holds, appends included, checked in the same atomic call as the locks (parallel appends cannot exceed it); the strictest of the sales-channel default, this limit, the per-buyer limit and &#x60;maxSeatsPerHoldToken&#x60; wins. Refused with 409 &#x60;booking_limit_exceeded&#x60; (&#x60;limit&#x60;, &#x60;current&#x60; seats already on the token, &#x60;requested&#x60;, &#x60;kind: \&quot;seats\&quot;&#x60;). Holds placed before a lower limit was published keep their seats and stay confirmable; they only cannot grow. With ticket buyer validation on, buyer tokens must carry a bound ticket buyer id (403 &#x60;ticket_buyer_required&#x60; / &#x60;ticket_buyer_mismatch&#x60;). Seats that are not for sale are refused with 409 &#x60;SEAT_NOT_FOR_SALE&#x60;, except a seat with an active **resale** listing in a season member whose for-sale configuration does not propagate (&#x60;forSalePropagated: false&#x60;, e.g. a season-ticket seat its holder resells for one game); the confirmation and the order commit apply the same rule.
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,26 +19,28 @@ 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, 7 days or 30 days, or for an earlier window of the same size with the `before` cursor (each response carries `previousBefore` / `nextBefore`; every point says whether it had 429s in `limited`). 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 24 hours, hourly peaks 31 days. 10m/1h: one bucket per minute; 24h: 15-minute buckets (peak minute); 7d: hourly buckets; 30d: UTC days (rolled up from the hours on the first read and kept as long as the hours). `concurrency` always describes now (not the `before` window). `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
- # @option opts [String] :range Time range (default &#x60;1h&#x60;).
25
+ # @option opts [String] :range Window size (default &#x60;1h&#x60;): 10 minutes, an hour or 24 hours (minute data, kept 24 hours), 7 days (hourly) or 30 days (daily), both kept 31 days.
26
+ # @option opts [Time] :before History cursor: the window ends just before this instant (aligned down to the bucket source: minute, hour or UTC day). Omit for the live window ending now. Use &#x60;previousBefore&#x60; / &#x60;nextBefore&#x60; of a response to step back and forth.
26
27
  # @return [GetApiMonitoringRequests200Response]
27
28
  def get_api_monitoring_requests(opts = {})
28
29
  data, _status_code, _headers = get_api_monitoring_requests_with_http_info(opts)
29
30
  data
30
31
  end
31
32
 
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.
33
+ # Request monitoring per rate-limit lane, with in-flight (concurrent) requests
34
+ # Peak requests per minute and 429 counts per lane for the last 10 minutes, hour, 24 hours, 7 days or 30 days, or for an earlier window of the same size with the &#x60;before&#x60; cursor (each response carries &#x60;previousBefore&#x60; / &#x60;nextBefore&#x60;; every point says whether it had 429s in &#x60;limited&#x60;). 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 24 hours, hourly peaks 31 days. 10m/1h: one bucket per minute; 24h: 15-minute buckets (peak minute); 7d: hourly buckets; 30d: UTC days (rolled up from the hours on the first read and kept as long as the hours). &#x60;concurrency&#x60; always describes now (not the &#x60;before&#x60; window). &#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
35
  # @param [Hash] opts the optional parameters
35
- # @option opts [String] :range Time range (default &#x60;1h&#x60;).
36
+ # @option opts [String] :range Window size (default &#x60;1h&#x60;): 10 minutes, an hour or 24 hours (minute data, kept 24 hours), 7 days (hourly) or 30 days (daily), both kept 31 days.
37
+ # @option opts [Time] :before History cursor: the window ends just before this instant (aligned down to the bucket source: minute, hour or UTC day). Omit for the live window ending now. Use &#x60;previousBefore&#x60; / &#x60;nextBefore&#x60; of a response to step back and forth.
36
38
  # @return [Array<(GetApiMonitoringRequests200Response, Integer, Hash)>] GetApiMonitoringRequests200Response data, response status code and response headers
37
39
  def get_api_monitoring_requests_with_http_info(opts = {})
38
40
  if @api_client.config.debugging
39
41
  @api_client.config.logger.debug 'Calling API: UsageApi.get_api_monitoring_requests ...'
40
42
  end
41
- allowable_values = ["10m", "1h", "24h", "7d"]
43
+ allowable_values = ["10m", "1h", "24h", "7d", "30d"]
42
44
  if @api_client.config.client_side_validation && opts[:'range'] && !allowable_values.include?(opts[:'range'])
43
45
  fail ArgumentError, "invalid value for \"range\", must be one of #{allowable_values}"
44
46
  end
@@ -48,6 +50,7 @@ module SeatsChart
48
50
  # query parameters
49
51
  query_params = opts[:query_params] || {}
50
52
  query_params[:'range'] = opts[:'range'] if !opts[:'range'].nil?
53
+ query_params[:'before'] = opts[:'before'] if !opts[:'before'].nil?
51
54
 
52
55
  # header parameters
53
56
  header_params = opts[:header_params] || {}
@@ -84,7 +87,7 @@ module SeatsChart
84
87
  end
85
88
 
86
89
  # Monthly usage: used objects, charts and events
87
- # Test (sandbox) workspaces (`isTest: true`) are never metered and have no limits (`limit: null`). `usedObjects.count` is the number of distinct objects booked in the UTC calendar month (seats.io-style billing unit): every seat that became booked counts once per month however often it is retried, released and re-booked; each sold general-admission place counts as one. Holds, test events and replays never count. `history` has exactly 12 months ending at `month` (zero-filled); `byEvent` lists the top 100 events of the month. `charts`/`events` are current totals against the plan limits. Dashboard JWT (any role) or an API key with the `reports` scope.
90
+ # Sandboxes (`isTest: true`) are metered so their usage can be seen, but never billed and never held to plan limits (`limit: null`). `usedObjects.count` is the number of distinct objects booked in the UTC calendar month (seats.io-style billing unit): every seat that became booked counts once per month however often it is retried, released and re-booked; each sold general-admission place counts as one. Holds, test events and replays never count. Map-only renders (`bringYourOwnBackend`) count every object of the rendered chart once per chart and month (`byEvent` entry with the chart id and `mapOnly: true`). `history` has exactly 12 months ending at `month` (zero-filled); `byEvent` lists the top 100 events of the month. `charts`/`events` are current totals against the plan limits. Dashboard JWT (any role) or an API key with the `reports` scope.
88
91
  # @param [Hash] opts the optional parameters
89
92
  # @option opts [String] :month UTC calendar month &#x60;YYYY-MM&#x60; (default: current month).
90
93
  # @return [nil]
@@ -94,7 +97,7 @@ module SeatsChart
94
97
  end
95
98
 
96
99
  # Monthly usage: used objects, charts and events
97
- # Test (sandbox) workspaces (&#x60;isTest: true&#x60;) are never metered and have no limits (&#x60;limit: null&#x60;). &#x60;usedObjects.count&#x60; is the number of distinct objects booked in the UTC calendar month (seats.io-style billing unit): every seat that became booked counts once per month however often it is retried, released and re-booked; each sold general-admission place counts as one. Holds, test events and replays never count. &#x60;history&#x60; has exactly 12 months ending at &#x60;month&#x60; (zero-filled); &#x60;byEvent&#x60; lists the top 100 events of the month. &#x60;charts&#x60;/&#x60;events&#x60; are current totals against the plan limits. Dashboard JWT (any role) or an API key with the &#x60;reports&#x60; scope.
100
+ # Sandboxes (&#x60;isTest: true&#x60;) are metered so their usage can be seen, but never billed and never held to plan limits (&#x60;limit: null&#x60;). &#x60;usedObjects.count&#x60; is the number of distinct objects booked in the UTC calendar month (seats.io-style billing unit): every seat that became booked counts once per month however often it is retried, released and re-booked; each sold general-admission place counts as one. Holds, test events and replays never count. Map-only renders (&#x60;bringYourOwnBackend&#x60;) count every object of the rendered chart once per chart and month (&#x60;byEvent&#x60; entry with the chart id and &#x60;mapOnly: true&#x60;). &#x60;history&#x60; has exactly 12 months ending at &#x60;month&#x60; (zero-filled); &#x60;byEvent&#x60; lists the top 100 events of the month. &#x60;charts&#x60;/&#x60;events&#x60; are current totals against the plan limits. Dashboard JWT (any role) or an API key with the &#x60;reports&#x60; scope.
98
101
  # @param [Hash] opts the optional parameters
99
102
  # @option opts [String] :month UTC calendar month &#x60;YYYY-MM&#x60; (default: current month).
100
103
  # @return [Array<(nil, Integer, Hash)>] nil, response status code and response headers
@@ -147,7 +150,7 @@ module SeatsChart
147
150
  end
148
151
 
149
152
  # Monthly used objects per chart and event
150
- # Breakdown of `usedObjects` (see GET /usage) by chart, each with its events (most used first). Events are grouped under their current chart; deleted events or events without a chart are listed under `chartId: null`. Read from the metering table (no counters on the booking path). Dashboard JWT (any role) or an API key.
153
+ # Breakdown of `usedObjects` (see GET /usage) by chart, each with its events (most used first). Events are grouped under their current chart; deleted events or events without a chart are listed under `chartId: null`; map-only renders of a chart (`bringYourOwnBackend`) are one entry `{ eventId: <chart id>, mapOnly: true }` under that chart. Read from the metering table (no counters on the booking path). Dashboard JWT (any role) or an API key.
151
154
  # @param [Hash] opts the optional parameters
152
155
  # @option opts [String] :month UTC calendar month &#x60;YYYY-MM&#x60; (default: current month).
153
156
  # @return [nil]
@@ -157,7 +160,7 @@ module SeatsChart
157
160
  end
158
161
 
159
162
  # Monthly used objects per chart and event
160
- # Breakdown of &#x60;usedObjects&#x60; (see GET /usage) by chart, each with its events (most used first). Events are grouped under their current chart; deleted events or events without a chart are listed under &#x60;chartId: null&#x60;. Read from the metering table (no counters on the booking path). Dashboard JWT (any role) or an API key.
163
+ # Breakdown of &#x60;usedObjects&#x60; (see GET /usage) by chart, each with its events (most used first). Events are grouped under their current chart; deleted events or events without a chart are listed under &#x60;chartId: null&#x60;; map-only renders of a chart (&#x60;bringYourOwnBackend&#x60;) are one entry &#x60;{ eventId: &lt;chart id&gt;, mapOnly: true }&#x60; under that chart. Read from the metering table (no counters on the booking path). Dashboard JWT (any role) or an API key.
161
164
  # @param [Hash] opts the optional parameters
162
165
  # @option opts [String] :month UTC calendar month &#x60;YYYY-MM&#x60; (default: current month).
163
166
  # @return [Array<(nil, Integer, Hash)>] nil, response status code and response headers
@@ -210,7 +213,7 @@ module SeatsChart
210
213
  end
211
214
 
212
215
  # Monthly used objects per event (paginated)
213
- # Every event with used objects in the month, most used first (ties by event id): `items: [{ eventId, eventKey, eventName, chartId, usedObjects }]` (`eventName: null` for deleted events), `eventCount` and the month total `usedObjects`. `limit` 1..100 (default 50); pass `nextCursor` as `cursor` for the next page. Unlike `byEvent` of GET /usage (top 100) this lists every event. Closed months are immutable and their per-event totals are cached by the API. Dashboard JWT (any role) or an API key with the `reports` scope.
216
+ # Every event with used objects in the month, most used first (ties by event id): `items: [{ eventId, eventKey, eventName, chartId, usedObjects }]` (`eventName: null` for deleted events; map-only renders of a chart: `eventId` = `chartId` = the chart id and `mapOnly: true`), `eventCount` and the month total `usedObjects`. `limit` 1..100 (default 50); pass `nextCursor` as `cursor` for the next page. Unlike `byEvent` of GET /usage (top 100) this lists every event. Closed months are immutable and their per-event totals are cached by the API. Dashboard JWT (any role) or an API key with the `reports` scope.
214
217
  # @param [Hash] opts the optional parameters
215
218
  # @option opts [String] :month UTC calendar month &#x60;YYYY-MM&#x60; (default: current month).
216
219
  # @option opts [Float] :limit Page size (1..100, default 50).
@@ -222,7 +225,7 @@ module SeatsChart
222
225
  end
223
226
 
224
227
  # Monthly used objects per event (paginated)
225
- # Every event with used objects in the month, most used first (ties by event id): &#x60;items: [{ eventId, eventKey, eventName, chartId, usedObjects }]&#x60; (&#x60;eventName: null&#x60; for deleted events), &#x60;eventCount&#x60; and the month total &#x60;usedObjects&#x60;. &#x60;limit&#x60; 1..100 (default 50); pass &#x60;nextCursor&#x60; as &#x60;cursor&#x60; for the next page. Unlike &#x60;byEvent&#x60; of GET /usage (top 100) this lists every event. Closed months are immutable and their per-event totals are cached by the API. Dashboard JWT (any role) or an API key with the &#x60;reports&#x60; scope.
228
+ # Every event with used objects in the month, most used first (ties by event id): &#x60;items: [{ eventId, eventKey, eventName, chartId, usedObjects }]&#x60; (&#x60;eventName: null&#x60; for deleted events; map-only renders of a chart: &#x60;eventId&#x60; &#x3D; &#x60;chartId&#x60; &#x3D; the chart id and &#x60;mapOnly: true&#x60;), &#x60;eventCount&#x60; and the month total &#x60;usedObjects&#x60;. &#x60;limit&#x60; 1..100 (default 50); pass &#x60;nextCursor&#x60; as &#x60;cursor&#x60; for the next page. Unlike &#x60;byEvent&#x60; of GET /usage (top 100) this lists every event. Closed months are immutable and their per-event totals are cached by the API. Dashboard JWT (any role) or an API key with the &#x60;reports&#x60; scope.
226
229
  # @param [Hash] opts the optional parameters
227
230
  # @option opts [String] :month UTC calendar month &#x60;YYYY-MM&#x60; (default: current month).
228
231
  # @option opts [Float] :limit Page size (1..100, default 50).
@@ -300,7 +303,7 @@ module SeatsChart
300
303
  end
301
304
 
302
305
  # Monthly used objects of one event (paginated)
303
- # Total `usedObjects` of the event in the month, `objectCount` (metered objects) and one page of the metered objects (`objectKey`: seat id, or `ga:<receiptId>` with `units` places; `firstUsedAt` with microseconds), newest first. `limit` 1..1000 (default 1000); pass `nextCursor` as `cursor` for the next page (`null` on the last page; `truncated` is true when more pages follow). Keyset pagination over the primary-key range of the event and month. Works for deleted events that were metered. Dashboard JWT (any role) or an API key with the `reports` scope.
306
+ # Total `usedObjects` of the event in the month, `objectCount` (metered objects) and one page of the metered objects (`objectKey`: seat id, or `ga:<receiptId>` with `units` places; `firstUsedAt` with microseconds), newest first. `limit` 1..1000 (default 1000); pass `nextCursor` as `cursor` for the next page (`null` on the last page; `truncated` is true when more pages follow). Keyset pagination over the primary-key range of the event and month. Works for deleted events that were metered. Map-only renders of a chart (`objectKey: map-only`) are listed under the chart id with `mapOnly: true`. Dashboard JWT (any role) or an API key with the `reports` scope.
304
307
  # @param event_id [String]
305
308
  # @param [Hash] opts the optional parameters
306
309
  # @option opts [String] :month UTC calendar month &#x60;YYYY-MM&#x60; (default: current month).
@@ -313,7 +316,7 @@ module SeatsChart
313
316
  end
314
317
 
315
318
  # Monthly used objects of one event (paginated)
316
- # Total &#x60;usedObjects&#x60; of the event in the month, &#x60;objectCount&#x60; (metered objects) and one page of the metered objects (&#x60;objectKey&#x60;: seat id, or &#x60;ga:&lt;receiptId&gt;&#x60; with &#x60;units&#x60; places; &#x60;firstUsedAt&#x60; with microseconds), newest first. &#x60;limit&#x60; 1..1000 (default 1000); pass &#x60;nextCursor&#x60; as &#x60;cursor&#x60; for the next page (&#x60;null&#x60; on the last page; &#x60;truncated&#x60; is true when more pages follow). Keyset pagination over the primary-key range of the event and month. Works for deleted events that were metered. Dashboard JWT (any role) or an API key with the &#x60;reports&#x60; scope.
319
+ # Total &#x60;usedObjects&#x60; of the event in the month, &#x60;objectCount&#x60; (metered objects) and one page of the metered objects (&#x60;objectKey&#x60;: seat id, or &#x60;ga:&lt;receiptId&gt;&#x60; with &#x60;units&#x60; places; &#x60;firstUsedAt&#x60; with microseconds), newest first. &#x60;limit&#x60; 1..1000 (default 1000); pass &#x60;nextCursor&#x60; as &#x60;cursor&#x60; for the next page (&#x60;null&#x60; on the last page; &#x60;truncated&#x60; is true when more pages follow). Keyset pagination over the primary-key range of the event and month. Works for deleted events that were metered. Map-only renders of a chart (&#x60;objectKey: map-only&#x60;) are listed under the chart id with &#x60;mapOnly: true&#x60;. Dashboard JWT (any role) or an API key with the &#x60;reports&#x60; scope.
317
320
  # @param event_id [String]
318
321
  # @param [Hash] opts the optional parameters
319
322
  # @option opts [String] :month UTC calendar month &#x60;YYYY-MM&#x60; (default: current month).
@@ -475,7 +478,7 @@ module SeatsChart
475
478
  end
476
479
 
477
480
  # Monthly used objects across my workspaces (admin view)
478
- # Every workspace the caller administers (role admin), with its plan, status and used objects of the month against the plan limit (`null` for test workspaces, which are never metered), plus the total. Dashboard session, or a **workspace admin API key** (the admin it is bound to); other API keys: 403 `ERR_PARTNER_SCOPE`. One grouped read of the metering table.
481
+ # Every workspace the caller administers (role admin), with its plan, status and used objects of the month against the plan limit (`null` for sandboxes, which are metered but never billed), plus the total of the production workspaces (`usedObjects`) and, separately, of the sandboxes (`sandboxUsedObjects`). Dashboard session, or a **workspace admin API key** (the admin it is bound to); other API keys: 403 `ERR_PARTNER_SCOPE`. One grouped read of the metering table.
479
482
  # @param [Hash] opts the optional parameters
480
483
  # @option opts [String] :month UTC calendar month &#x60;YYYY-MM&#x60; (default: current month).
481
484
  # @return [nil]
@@ -485,7 +488,7 @@ module SeatsChart
485
488
  end
486
489
 
487
490
  # Monthly used objects across my workspaces (admin view)
488
- # Every workspace the caller administers (role admin), with its plan, status and used objects of the month against the plan limit (&#x60;null&#x60; for test workspaces, which are never metered), plus the total. Dashboard session, or a **workspace admin API key** (the admin it is bound to); other API keys: 403 &#x60;ERR_PARTNER_SCOPE&#x60;. One grouped read of the metering table.
491
+ # Every workspace the caller administers (role admin), with its plan, status and used objects of the month against the plan limit (&#x60;null&#x60; for sandboxes, which are metered but never billed), plus the total of the production workspaces (&#x60;usedObjects&#x60;) and, separately, of the sandboxes (&#x60;sandboxUsedObjects&#x60;). Dashboard session, or a **workspace admin API key** (the admin it is bound to); other API keys: 403 &#x60;ERR_PARTNER_SCOPE&#x60;. One grouped read of the metering table.
489
492
  # @param [Hash] opts the optional parameters
490
493
  # @option opts [String] :month UTC calendar month &#x60;YYYY-MM&#x60; (default: current month).
491
494
  # @return [Array<(nil, Integer, Hash)>] nil, 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. **Deprecated spellings**: `event.for_sale_changed`, `event.channels_updated`, `event.categories_updated` and `event.table_booking_changed` carry `deprecated: { replacedBy, sunset }` — subscribe to the seats.io name in `replacedBy`; the old spelling is still emitted and is not removed before 2027-06-01.
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. **Deprecated spellings**: &#x60;event.for_sale_changed&#x60;, &#x60;event.channels_updated&#x60;, &#x60;event.categories_updated&#x60; and &#x60;event.table_booking_changed&#x60; carry &#x60;deprecated: { replacedBy, sunset }&#x60; — subscribe to the seats.io name in &#x60;replacedBy&#x60;; the old spelling is still emitted and is not removed before 2027-06-01.
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 = {})