Events, registration, and tickets
Published events, booking, registration, signed tickets, and attendee hubs.
All request and response shapes come from the concrete Zod contracts published
in openapi.json. Public reads still enforce event visibility; a private event
is not made public by knowing its slug.
| Operation | Access | Purpose |
|---|---|---|
GET /api/events/categories | Public | Event categories. |
GET /api/events/confirmed-count | Public | Global confirmed-registration count. |
GET /api/events/published | Public | Published top-level events. |
GET /api/events/published-one | Optional session/invite | One visible event by slug. |
GET /api/events/pass-form | Public | Published questions for the selected public ticket type. |
GET /api/events/organising | Organiser | Events the signed-in organiser may manage. |
GET /api/events/preview | Organiser | Preview an event in a live organiser scope. |
GET /api/events/take | Visibility-scoped | Counts by ticket type for eventId. |
GET /api/events/workshops | Visibility-scoped | Workshops under parentId. |
GET /api/events/preferences | Optional session | The viewer's consented category preferences, otherwise an empty list. |
GET /api/events/viewer-organizations | Optional session | Eligible organiser scopes for visibility checks. |
GET /api/events/booking | Optional session | not_found, sign_in, or actor-specific booking state. |
POST /api/events/register | Optional session | Server-priced registration and payment redirect outcome; anonymous callers receive the existing action-state error. |
POST /api/events/resume-registration | Optional session | Resume an actor-owned pending registration; anonymous callers receive the existing action-state error. |
GET /api/events/registration-return | Optional session | Paid, pending, or failed return state. |
GET /api/events/tickets | Optional session | Guest or account ticket-wallet state. |
GET /api/events/ticket | Optional session | A verified signed ticket visible to the caller. |
GET /api/events/hub | Optional session | Actor-owned tickets, broadcasts, points, and giveaways. |
POST /api/events/invite/resolve | Optional session | Resolve a private invite into a bounded first-party UI cookie outcome. |
POST /api/events/work-interest | Public | Record the bounded acquisition fields used by the existing work-interest flow. |
Mutations require an exact configured Origin. Direct Nest POST operations
return 201 unless their endpoint page says otherwise; error state carried in a
successful action outcome remains part of the JSON contract.
Visitor source and ticket email
Registration accepts optional visitor source (brochure, entrance, direct) and visit-purpose context. Historical unknown sources are not guessed. Supplied visitor details are snapshotted for event reporting.
POST /api/events/ticket/resend requests delivery of the signed-in visitor's own ticket. A five-minute cooldown applies. Delivery status distinguishes a sent message from a queued retry; a valid ticket remains usable if email delivery fails. Ticket email processing is an internal API worker, not a public cron endpoint.
Registration limits
From API 1.3.0, an event capacity or ticket-type quantity of null means unlimited. A positive integer is a finite limit. Do not treat null as zero. Event and ticket-type limits are independent, and both must be unlimited for unrestricted exhibition registration. Workshop creation still requires a positive finite capacity. This requires migration 0006 and deployment of the matching API and clients.
Public event responses exclude organiser-only ticket types. An explicit unavailable ticket-type ID is rejected instead of silently selecting another type. Registration rechecks the public setting while holding locks in event-before-ticket order. Existing issued tickets remain valid.
Published event responses may include an optional ordered schedule. Organisers
edit schedule slots through PATCH /api/partner/events/details; the schedule
is part of event details and does not create a separate attendance authority.