Browse API docs

Tickets

Tickets are the purchasable types within an event, General Admission, VIP, Early Bird, and so on. Each event has one or more tickets, each with its own price, stock, and limits.

Stock updates set an absolute product count. Omit stock when changing unrelated fields so intervening sales and cancellations are preserved. A group package consumes its full group_size from shared event capacity.

Usetix supports two ticket kinds, exposed via the kind field:

  • StandardTicket: Single-use tickets. One QR per buyer.
  • GroupTicket: Bulk tickets that redeem a configurable number of attendees per code.

GET /admin/events/:slug/tickets

Returns all tickets belonging to an event.

curl -H "Authorization: Bearer your-token-here" \
  -H "Accept: application/json" \
  https://app.usetix.io/admin/events/spring-showcase/tickets

Query parameters:

Parameter Description
filter Set to archived to return only archived tickets. Default returns active and hidden tickets.

Response:

{
  "event": {
    "id": 42,
    "slug": "spring-showcase",
    "title": "Spring Showcase"
  },
  "tickets": [
    {
      "id": 101,
      "title": "General Admission",
      "kind": "StandardTicket",
      "state": "active",
      "sales_closed": false,
      "sales_closed_at": null,
      "price": { "amount": "21.00", "currency": "EUR" },
      "stock": 200,
      "unlimited_stock": false,
      "position": 1,
      "max_per_order": 6,
      "max_per_customer": null,
      "access_code_required": false
    }
  ]
}

GET /admin/events/:slug/tickets/:id

Returns a single ticket.

curl -H "Authorization: Bearer your-token-here" \
  -H "Accept: application/json" \
  https://app.usetix.io/admin/events/spring-showcase/tickets/101

Response:

{
  "id": 101,
  "title": "General Admission",
  "kind": "StandardTicket",
  "state": "active",
  "sales_closed": false,
  "sales_closed_at": null,
  "price": { "amount": "21.00", "currency": "EUR" },
  "stock": 200,
  "unlimited_stock": false,
  "position": 1,
  "max_per_order": 6,
  "max_per_customer": null,
  "access_code_required": false
}

POST /admin/events/:slug/standard_tickets

Creates a new standard ticket on the event.

curl -X POST \
  -H "Authorization: Bearer your-token-here" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"title": "Late bird", "price": "15.00", "stock": 50}' \
  https://app.usetix.io/admin/events/spring-showcase/standard_tickets

Body parameters:

Field Required Notes
title yes Display title.
price yes Decimal as string.
stock yes Initial stock count. Use -1 for unlimited.
state no active (default) or hidden.
color no Hex code (#RRGGBB) for scanner / PDF / admin tier recognition.
max_per_order no Cap on copies of this ticket per single order.
max_per_customer no Cap on copies of this ticket per email lifetime.
features no Array of strings describing what’s included.

Response: 201 Created with the ticket JSON.

PATCH /admin/events/:slug/standard_tickets/:id

Updates a standard ticket. Send only the fields you want to change.

curl -X PATCH \
  -H "Authorization: Bearer your-token-here" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"price": "12.00"}' \
  https://app.usetix.io/admin/events/spring-showcase/standard_tickets/101

Response: 200 OK with the updated ticket JSON.

POST /admin/events/:slug/group_tickets

Creates a new group ticket. Group tickets bundle multiple admissions into a single QR code.

curl -X POST \
  -H "Authorization: Bearer your-token-here" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"title": "4-pack", "price": "60.00", "stock": 25, "group_size": 4, "unit_price": "15.00"}' \
  https://app.usetix.io/admin/events/spring-showcase/group_tickets

Body parameters: Same as standard_tickets, plus:

Field Required Notes
group_size yes Number of admissions per code.
unit_price yes Decimal as string. Per-admission price (the bundle’s effective per-attendee cost).

Response: 201 Created with the ticket JSON (kind: "GroupTicket").

PATCH /admin/events/:slug/group_tickets/:id

Updates a group ticket. Send only the fields you want to change.

curl -X PATCH \
  -H "Authorization: Bearer your-token-here" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"group_size": 6}' \
  https://app.usetix.io/admin/events/spring-showcase/group_tickets/102

Response: 200 OK with the updated ticket JSON.

POST /admin/events/:slug/tickets/:id/archival

Archives a ticket. Archived tickets disappear from the public shop and from the default admin list, but historical orders keep working.

curl -X POST \
  -H "Authorization: Bearer your-token-here" \
  -H "Accept: application/json" \
  https://app.usetix.io/admin/events/spring-showcase/tickets/101/archival

Response: 200 OK with the ticket JSON (state: "archived").

DELETE /admin/events/:slug/tickets/:id/archival

Unarchives a ticket, restoring it to active state.

curl -X DELETE \
  -H "Authorization: Bearer your-token-here" \
  -H "Accept: application/json" \
  https://app.usetix.io/admin/events/spring-showcase/tickets/101/archival

Response: 200 OK with the ticket JSON (state: "active").

PATCH /admin/events/:slug/tickets/:id/position

Moves a ticket type to a new display position. Lower numbers sort first.

curl -X PATCH \
  -H "Authorization: Bearer your-token-here" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"position": 2}' \
  https://app.usetix.io/admin/events/spring-showcase/tickets/101/position

Response: 204 No Content.

Ticket fields

Field Type Notes
id integer Internal numeric ID. Path parameter.
title string Display title.
kind string StandardTicket or GroupTicket.
state string active, hidden, or archived.
price.amount string Decimal as string (e.g. "21.00").
price.currency string ISO 4217 currency code. Inherited from the account.
stock integer Raw remaining product count: single tickets or complete group packages. -1 means unlimited product stock. Shared event capacity and seating can further limit availability.
unlimited_stock boolean Convenience flag, true when stock is -1.
position integer Display order within the event (low to high).
max_per_order integer | null Cap on how many of this ticket a single order may contain. null means unlimited.
max_per_customer integer | null Cap on how many of this ticket the same email can buy across all orders. null means unlimited.
access_code_required boolean true for hidden tickets that require a code at checkout.

Mark a ticket type as sold out

POST /admin/events/:slug/tickets/:id/sale_closure closes sales for a ticket type. DELETE at the same URL reopens it. Both require write access and return the ticket JSON with sales_closed and nullable ISO-8601 sales_closed_at.

The admin ticket list exposes these operations in each ticket’s action menu. The ticket stays visible as sold out. Stock, price, visibility and scheduled sale dates remain unchanged. Abandoned checkout reservations still return stock, but cannot reopen the phase. Reopening restores normal stock, capacity and sale-window checks. Repeated close/reopen requests are safe.

Existing checkout reservations remain valid; new checkouts, stale unreserved carts and new public seating selections cannot purchase the closed type. Manual guest-list admissions retain their existing organizer-controlled inventory path.

curl -X POST -H "Authorization: Bearer your-write-token" \
  -H "Accept: application/json" \
  https://app.usetix.io/admin/events/spring-showcase/tickets/101/sale_closure

The assistant/MCP tool manage_event_tickets supports close_sales and reopen_sales with event_title and ticket_title. Both require write scope.