Document / EN

Error codes

Every error response has the same shape. Match on error: it is stable and listed below. code is an optional, finer detail code (UPPER_SNAKE) used by the dashboard for localized messages; message is English text for logs — never match on it. Quote the x-request-id response header to support.

json
{ "error": "validation_error", "message": "key must be 1 to 100 characters …", "code": "ERR_VALIDATION" }

Kinds and TS SDK classes

KindHTTPTS SDK class
Validation (validation)400, 413, 422SeatsChartValidationError
Authentication and permission (auth)401, 403SeatsChartAuthError
Not found (not_found)404SeatsChartNotFoundError
Conflict (conflict)409, 410, 412SeatsChartConflictError
Plan and billing (payment)402SeatsChartHttpError
Rate limit (rate_limit)429SeatsChartRateLimitError
Server (server)500, 502, 503SeatsChartServerError

The HTTP status picks the TS SDK class; every class extends SeatsChartHttpError, so existing instanceof checks keep working.

A request that gets no response within the client's timeoutMs (30 s per attempt by default) throws SeatsChartTimeoutError with code timeout. It has no HTTP status and does not extend SeatsChartHttpError; the server SDKs raise their own typed timeout error (Server SDKs).

Codes

Descriptions match the OpenAPI catalog (components.schemas.ApiError).

errorKindMeaning
bad_requestValidationThe request is malformed or inconsistent (see message).
validation_errorValidationA field failed validation: schema (TypeBox) or business rule; setting / property name the field when known.
validation_failedValidationMap or chart content failed the designer validation rules (issues).
invalid_bodyValidationThe request body could not be parsed as JSON.
invalid_parametersValidationQuery or path parameters are invalid.
payload_too_largeValidationThe request body exceeds the size limit of the route (413).
objects_not_foundValidationObjects named in the request do not exist in the event (objects).
not_season_memberValidationEvents must belong to the parent season (eventIds).
quantity_requiredValidationA general-admission quantity is required.
for_sale_edit_conflictValidationAn object or category is listed in both forSale and notForSale (objects, categories).
ticket_type_requiredValidationThe category sells several ticket types; pass one.
ticket_buyer_id_requiredValidationTicket buyer validation is on: pass a registered ticket buyer id.
idempotency_key_requiredValidationThis route requires an Idempotency-Key header.
invalid_codeValidationThe two-factor or recovery code is not valid.
invalid_order_idValidationThe order id is not valid.
invalid_signatureValidationThe webhook signature could not be verified.
empty_chartValidationThe chart has no seats or general-admission areas.
setup_expiredValidationThe two-factor setup expired; start again.
ga_table_wholeValidationTables booked as a whole cannot be booked by seat.
ga_area_wholeValidationThe area is sold as a whole: quantity is its people (fixed: the capacity; variable: minOccupancy..capacity), never part of its places.
unauthorizedAuthentication and permissionMissing or invalid credentials (401): send x-api-key or Authorization: Bearer.
forbiddenAuthentication and permissionAuthenticated, but not allowed (role, workspace or route policy).
insufficient_scopeAuthentication and permissionThe API key lacks the scope this route requires (requiredScope).
workspace_deactivatedAuthentication and permissionThe workspace is deactivated: API keys and viewer tokens are refused.
channel_forbiddenAuthentication and permissionThe objects belong to an inventory channel the caller is not authorized for.
ga_places_to_channels_disabledAuthentication and permissionAssigning GA places to channels is turned off for this workspace.
ticket_buyer_requiredAuthentication and permissionTicket buyer validation is on: the buyer token must carry a ticket buyer id.
ticket_buyer_not_registeredAuthentication and permissionThe ticket buyer id is not registered in this workspace.
ticket_buyer_mismatchAuthentication and permissionThe hold belongs to another ticket buyer.
pending_sign_in_expiredAuthentication and permissionThe pending two-factor sign-in expired; sign in again.
two_factor_required_by_workspaceAuthentication and permissionThe workspace requires two-factor authentication.
two_factor_enrollment_requiredAuthentication and permissionEnrol two-factor authentication before continuing.
not_foundNot foundThe resource (or route) does not exist in this workspace.
event_not_foundNot foundNo event with this id or key exists in this workspace.
draft_not_foundNot foundThe map has no draft.
extra_data_not_publishedNot foundThe workspace does not publish extraData to buyers (Settings → Seat data for buyers).
conflictConflictThe request conflicts with the current state (see message / code).
idempotency_conflictConflictThe Idempotency-Key was used with a different request.
inventory_conflictConflictObjects are not in the state the operation needs (held, sold, not for sale…).
hold_token_conflictConflictThe hold token is expired or belongs to another session.
booking_limit_exceededConflictThe organizer booking limits refuse the hold or confirmation (limit, current, requested, kind).
buyer_limit_exceededConflictThe buyer reached the per-buyer limit of a sales rule.
quote_requiredConflictA new confirmation needs a quoteId (POST /api/quotes).
quote_mismatchConflictThe quote or payment attestation does not match the confirmation.
quote_conflictConflictAny other quote conflict.
price_mismatchConflictDeclared amounts do not match the price table.
currency_mismatchConflictThe currency does not match the event currency.
price_table_missingConflictThe event has no synced price table.
lot_sold_outConflictEvery lot of the lot plan is sold out.
insufficient_inventoryConflictNot enough free seats or places for the request.
insufficient_free_placesConflictCannot withhold more GA places than are free (areas).
ga_area_occupancy_lockedConflictA publish would change how areas with sold or held places are sold (objects).
illegal_previous_statusConflictAn object is not in the expected previous status.
ambiguous_labelConflictA label matches several objects; use ids (labels).
chart_invalidConflictThe published chart has error-level validation issues (issues).
chart_archivedConflictThe chart is archived.
chart_not_publishedConflictThe chart has never been published.
not_publishedConflictThe map has not been published yet.
geometry_not_publishedConflictThe event geometry has not been published yet.
chart_switch_conflictConflictThe event cannot switch charts while objects are held or sold.
structural_mismatchConflictHeld or sold objects have no counterpart in the target chart (orphanedObjects).
draft_conflictConflictThe draft changed since it was read.
category_existsConflictA category with this key or label already exists.
category_in_useConflictThe category is still used by objects.
event_key_takenConflictAnother event of the workspace uses this key.
chart_key_takenConflictAnother chart of the workspace uses this key.
season_key_takenConflictAnother season of the workspace uses this key.
partial_season_key_takenConflictAnother partial season of this season uses this key.
ambiguous_season_keyConflictSeveral partial seasons use this key; pass the partial season id.
event_saleConflictThe event has sales; the change is refused.
season_bookedConflictThe season objects are booked.
season_chart_mismatchConflictThe event chart differs from the season chart.
season_has_no_chartConflictThe season has no chart yet.
season_source_eventConflictThe season source event cannot take this change.
season_source_requiredConflictThe season has no source event.
season_status_conflictConflictThe season status change conflicts with member statuses.
season_status_overriddenConflictThe event overrides the season status of these objects.
season_bookings_not_propagatedConflictThe season does not propagate bookings: season bookings go to its source event, which this call cannot reach.
limit_exceededConflictA resource limit was reached (for example partial seasons per season).
too_many_eventsConflictToo many events for one call.
last_active_workspaceConflictThe last active workspace cannot be deactivated.
own_workspaceConflictThe action cannot target your own workspace.
sandbox_limit_reachedConflictThe workspace already has its maximum number of sandboxes (limit); delete one first.
two_factor_not_enabledConflictTwo-factor authentication is not enabled on this account.
two_factor_already_enabledConflictTwo-factor authentication is already enabled.
checkout_not_completeConflictThe checkout session is not complete.
scan_route_retiredConflictThis route was retired (410); see message for its replacement.
listing_incompleteConflictA listing sold as a whole is only partly in the confirmation (listing, missingObjects).
listing_has_holdsConflictObjects of the listing are held: the change waits until the holds end (heldObjects).
listing_object_conflictConflictAn object already belongs to another active listing (objects).
listing_objects_removedConflictA map publish or chart switch would remove objects of active listings (listings: id, key, removedObjects); withdraw them first or retry with withdrawAffectedListings.
listing_key_takenConflictAnother listing of the event uses this key.
listing_closedConflictThe listing is sold or withdrawn; only active listings change.
listing_type_existsConflictA listing type with this key already exists.
listing_type_in_useConflictActive listings use this listing type.
plan_limit_exceededPlan and billingThe plan limit is reached (402); upgrade to continue.
quota_exceededPlan and billingThe monthly quota is used up.
no_subscriptionPlan and billingThe workspace has no subscription.
no_customerPlan and billingThe workspace has no billing customer.
test_workspace_not_billablePlan and billingTest workspaces are not billed.
rate_limit_exceededRate limitToo many requests (429): wait for Retry-After seconds.
too_many_attemptsRate limitToo many attempts; wait before retrying.
internal_errorServerUnexpected server error (500); retry with the same Idempotency-Key.
service_unavailableServerA dependency is temporarily unavailable (503); retry.
redis_unavailableServerThe in-memory store is unavailable (503); the outcome may be uncertain, retry with the same operation identity.
service_drainingServerThe instance is shutting down (503); retry.
stripe_not_configuredServerBilling is not configured on this server.
checkout_failedServerThe billing checkout could not be created.
portal_failedServerThe billing portal could not be opened.
confirm_failedServerThe confirmation could not be completed; retry with the same Idempotency-Key.
extraction_failedServerThe chart image could not be analysed.
webhook_handler_failedServerThe billing webhook handler failed.

Deprecated aliases

Older versions of some routes returned these spellings. Responses now carry the canonical code; if your client compares against an old value, normalize with canonicalErrorCode() (TS SDK) — the SDK's typed errors already accept both.

DeprecatedCanonical
validationvalidation_error

Detail codes (code)

Stable as well. The ERR_ prefix is historical: codes added without it keep their names.

ERR_BAD_REQUEST, ERR_NOT_FOUND, ERR_UNAUTHORIZED, ERR_FORBIDDEN, ERR_CONFLICT, ERR_VALIDATION, ERR_SERVICE_UNAVAILABLE, ERR_INTERNAL, ERR_RATE_LIMIT, ERR_PLAN_LIMIT, ERR_IDEMPOTENCY_CONFLICT, ERR_SEAT_LOCKED, ERR_SEAT_UNAVAILABLE, ERR_SEAT_SOLD, ERR_SEAT_HOLD_REQUIRED, SEAT_NOT_FOR_SALE, SEAT_CHANNEL_FORBIDDEN, BA_NO_HOLDABLE_WINDOW, ERR_SEATS_NOT_FOUND, ERR_EVENT_NOT_FOUND, ERR_CHART_NOT_FOUND, ERR_CHART_NOT_ARCHIVED, ERR_CHART_HAS_EVENTS, ERR_AUTO_PUBLISH_CHART_HAS_EVENTS, ERR_CHART_TAG_INVALID, ERR_CHART_TAG_LIMIT, ERR_CHART_VERSION_NOT_FOUND, ERR_MAP_VERSION_NOT_FOUND, ERR_MAP_NEVER_PUBLISHED, ERR_DRAFT_NOTHING_TO_DISCARD, ERR_THUMBNAIL_EXISTS, ERR_THUMBNAIL_INVALID, ERR_NAME_EMPTY, ERR_GA_HOLD_INVALID, ERR_GA_HOLD_MISSING, ERR_GA_CAPACITY, ERR_GA_AREA_NOT_FOUND, GA_NOT_FOR_SALE, GA_CHANNEL_FORBIDDEN, ERR_HOLD_SERVICE_UNAVAILABLE, ERR_PUBSUB_FAILED, ERR_CHANNEL_LIMIT, SEASON_SOURCE_REQUIRED, SEASON_CHART_MISMATCH, SEASON_EVENT_ALREADY_MEMBER, SEASON_MEMBER_CAP, ERR_SEASON_NOT_FOUND, ERR_PARTNER_SCOPE, ERR_FORBIDDEN_ROLE, ERR_SANDBOX_SCOPE