seatschart 0.2.0 → 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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +162 -15
  3. data/lib/seatschart/api/audit_api.rb +2 -2
  4. data/lib/seatschart/api/charts_api.rb +799 -66
  5. data/lib/seatschart/api/embed_api.rb +5 -5
  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 +1471 -155
  9. data/lib/seatschart/api/health_api.rb +244 -0
  10. data/lib/seatschart/api/map_designer_api.rb +11 -9
  11. data/lib/seatschart/api/public_api.rb +350 -0
  12. data/lib/seatschart/api/sandboxes_api.rb +672 -0
  13. data/lib/seatschart/api/seasons_api.rb +344 -36
  14. data/lib/seatschart/api/seats_api.rb +10 -10
  15. data/lib/seatschart/api/usage_api.rb +18 -15
  16. data/lib/seatschart/api/webhooks_api.rb +2 -2
  17. data/lib/seatschart/api/workspace_api.rb +306 -20
  18. data/lib/seatschart/models/api_error.rb +4 -4
  19. data/lib/seatschart/models/delete_api_sandboxes_by_sandbox_id200_response.rb +255 -0
  20. data/lib/seatschart/models/get_api_monitoring_requests200_response.rb +62 -4
  21. data/lib/seatschart/models/get_api_monitoring_requests200_response_points_inner.rb +21 -4
  22. data/lib/seatschart/models/get_api_sandboxes200_response.rb +239 -0
  23. data/lib/seatschart/models/get_api_sandboxes200_response_items_inner.rb +431 -0
  24. data/lib/seatschart/models/get_api_sandboxes200_response_items_inner_rate_limits.rb +270 -0
  25. data/lib/seatschart/models/get_api_sandboxes200_response_items_inner_usage.rb +287 -0
  26. data/lib/seatschart/models/get_api_status200_response.rb +387 -0
  27. data/lib/seatschart/models/get_api_status200_response_components_inner.rb +330 -0
  28. data/lib/seatschart/models/get_api_status200_response_components_inner_days_inner.rb +301 -0
  29. data/lib/seatschart/models/get_api_status200_response_incidents_inner.rb +374 -0
  30. data/lib/seatschart/models/get_api_status200_response_maintenance_inner.rb +350 -0
  31. data/lib/seatschart/models/get_api_status503_response.rb +271 -0
  32. data/lib/seatschart/models/get_api_workspace_buyer_extra_data200_response.rb +241 -0
  33. data/lib/seatschart/models/get_api_workspace_defaults200_response.rb +254 -0
  34. data/lib/seatschart/models/get_api_workspace_defaults200_response_renderer.rb +246 -0
  35. data/lib/seatschart/models/get_api_workspace_defaults200_response_renderer_built_in.rb +270 -0
  36. data/lib/seatschart/models/get_api_workspaces200_response_items_inner.rb +34 -5
  37. data/lib/seatschart/models/patch_api_events_by_event_id_request.rb +16 -6
  38. data/lib/seatschart/models/patch_api_seasons_by_season_id_request.rb +15 -5
  39. data/lib/seatschart/models/patch_api_workspace_chart_validation_request_severities.rb +25 -4
  40. data/lib/seatschart/models/patch_api_workspace_defaults_request.rb +224 -0
  41. data/lib/seatschart/models/patch_api_workspace_defaults_request_renderer.rb +249 -0
  42. data/lib/seatschart/models/patch_api_workspace_settings_request.rb +6 -6
  43. data/lib/seatschart/models/post_api_charts_by_chart_id_actions_copy_to_workspace_request.rb +39 -1
  44. data/lib/seatschart/models/post_api_charts_by_chart_id_actions_validate_request.rb +1 -0
  45. data/lib/seatschart/models/post_api_charts_by_chart_id_map_publish422_response_issues_inner.rb +64 -6
  46. data/lib/seatschart/models/post_api_charts_by_chart_id_map_publish_request.rb +1 -1
  47. data/lib/seatschart/models/post_api_embed_tokens_request.rb +18 -15
  48. data/lib/seatschart/models/post_api_embed_tokens_request_safe_mode_options.rb +226 -0
  49. data/lib/seatschart/models/post_api_events_actions_edit_for_sale_config_request.rb +251 -0
  50. data/lib/seatschart/models/post_api_events_actions_edit_for_sale_config_request_events_inner.rb +322 -0
  51. data/lib/seatschart/models/post_api_events_bulk_request_events_inner.rb +42 -1
  52. data/lib/seatschart/models/post_api_events_by_event_id_actions_edit_for_sale_config_request.rb +277 -0
  53. data/lib/seatschart/models/post_api_events_by_event_id_actions_edit_for_sale_config_request_for_sale_inner.rb +319 -0
  54. data/lib/seatschart/models/post_api_events_by_event_id_map_publish_request.rb +215 -0
  55. data/lib/seatschart/models/post_api_events_request.rb +42 -1
  56. data/lib/seatschart/models/{patch_api_events_by_event_id_request_categories_inner.rb → post_api_events_request_categories_inner.rb} +3 -3
  57. data/lib/seatschart/models/post_api_extract_seats200_response.rb +459 -0
  58. data/lib/seatschart/models/post_api_extract_seats200_response_seats_inner.rb +323 -0
  59. data/lib/seatschart/models/post_api_extract_seats200_response_suggested_inner.rb +320 -0
  60. data/lib/seatschart/models/post_api_extract_seats_request.rb +124 -4
  61. data/lib/seatschart/models/post_api_extract_seats_request_examples.rb +105 -0
  62. data/lib/seatschart/models/post_api_extract_seats_request_examples_any_of_inner.rb +293 -0
  63. data/lib/seatschart/models/post_api_extract_seats_request_negatives.rb +105 -0
  64. data/lib/seatschart/models/post_api_extract_seats_request_region.rb +105 -0
  65. data/lib/seatschart/models/post_api_extract_seats_request_region_any_of.rb +363 -0
  66. data/lib/seatschart/models/post_api_sandboxes201_response.rb +245 -0
  67. data/lib/seatschart/models/post_api_sandboxes201_response_admin_key.rb +286 -0
  68. data/lib/seatschart/models/post_api_sandboxes201_response_copied.rb +313 -0
  69. data/lib/seatschart/models/post_api_sandboxes201_response_copied_charts_inner.rb +281 -0
  70. data/lib/seatschart/models/post_api_sandboxes201_response_copied_events_inner.rb +281 -0
  71. data/lib/seatschart/models/post_api_sandboxes201_response_copied_events_with_own_map_inner.rb +265 -0
  72. data/lib/seatschart/models/post_api_sandboxes201_response_copied_key_conflicts_inner.rb +287 -0
  73. data/lib/seatschart/models/post_api_sandboxes201_response_copied_seasons_inner.rb +312 -0
  74. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_actions_copy_from_production200_response.rb +313 -0
  75. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_actions_copy_from_production_request.rb +255 -0
  76. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_actions_join200_response.rb +271 -0
  77. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_actions_reset200_response.rb +268 -0
  78. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_actions_reset_request.rb +225 -0
  79. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_admin_key201_response.rb +253 -0
  80. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_admin_key201_response_api_key.rb +286 -0
  81. data/lib/seatschart/models/post_api_sandboxes_by_sandbox_id_admin_key_request.rb +252 -0
  82. data/lib/seatschart/models/post_api_sandboxes_request.rb +319 -0
  83. data/lib/seatschart/models/post_api_seasons_request.rb +14 -4
  84. data/lib/seatschart/models/post_api_seats_confirm_request.rb +5 -5
  85. data/lib/seatschart/models/post_api_seats_release_request.rb +5 -5
  86. data/lib/seatschart/models/post_api_seats_reserve_request.rb +5 -5
  87. data/lib/seatschart/models/post_api_workspaces_request.rb +1 -1
  88. data/lib/seatschart/models/put_api_charts_by_chart_id_map_draft_request.rb +1 -0
  89. data/lib/seatschart/models/put_api_workspace_buyer_extra_data_request.rb +260 -0
  90. data/lib/seatschart/models/put_internal_status_notices_request.rb +242 -0
  91. data/lib/seatschart/models/put_internal_status_notices_request_notices_inner.rb +445 -0
  92. data/lib/seatschart/retry.rb +106 -7
  93. data/lib/seatschart/version.rb +1 -1
  94. data/lib/seatschart.rb +53 -2
  95. metadata +55 -4
  96. 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.
@@ -930,7 +930,7 @@ module SeatsChart
930
930
  end
931
931
 
932
932
  # Clear Redis TTL holds before expiry (checkout abandoned / declined)
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. **`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`**.
934
934
  # @param idempotency_key [String] Required deduplication key (max 255 chars after trim); 24h cache replay in Redis per tenant + route.
935
935
  # @param post_api_seats_release_request [PostApiSeatsReleaseRequest]
936
936
  # @param [Hash] opts the optional parameters
@@ -942,7 +942,7 @@ module SeatsChart
942
942
  end
943
943
 
944
944
  # Clear Redis TTL holds before expiry (checkout abandoned / declined)
945
- # 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`**.
945
+ # 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`**.
946
946
  # @param idempotency_key [String] Required deduplication key (max 255 chars after trim); 24h cache replay in Redis per tenant + route.
947
947
  # @param post_api_seats_release_request [PostApiSeatsReleaseRequest]
948
948
  # @param [Hash] opts the optional parameters
@@ -1006,7 +1006,7 @@ module SeatsChart
1006
1006
  end
1007
1007
 
1008
1008
  # Place a temporary Redis hold (Lua TTL) before payment
1009
- # 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.
1010
1010
  # @param idempotency_key [String] Required deduplication key (max 255 chars after trim; UUID v4 recommended). 24h idempotent cache replay in Redis per tenant.
1011
1011
  # @param post_api_seats_reserve_request [PostApiSeatsReserveRequest]
1012
1012
  # @param [Hash] opts the optional parameters
@@ -1018,7 +1018,7 @@ module SeatsChart
1018
1018
  end
1019
1019
 
1020
1020
  # Place a temporary Redis hold (Lua TTL) before payment
1021
- # 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`).
1021
+ # 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.
1022
1022
  # @param idempotency_key [String] Required deduplication key (max 255 chars after trim; UUID v4 recommended). 24h idempotent cache replay in Redis per tenant.
1023
1023
  # @param post_api_seats_reserve_request [PostApiSeatsReserveRequest]
1024
1024
  # @param [Hash] opts the optional parameters
@@ -20,9 +20,10 @@ module SeatsChart
20
20
  @api_client = api_client
21
21
  end
22
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.
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 `1h`).
25
+ # @option opts [String] :range Window size (default `1h`): 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 `previousBefore` / `nextBefore` 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)
@@ -30,15 +31,16 @@ module SeatsChart
30
31
  end
31
32
 
32
33
  # 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. `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.
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 `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.
34
35
  # @param [Hash] opts the optional parameters
35
- # @option opts [String] :range Time range (default `1h`).
36
+ # @option opts [String] :range Window size (default `1h`): 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 `previousBefore` / `nextBefore` 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. `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.
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. &#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.
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 = {})