Three surfaces: /events/* for organizers (55 routes), /client/events/* for attendees (24 routes), and /checkin/* for the live queue at the door (16 routes).
The Event App is the attendee client for all of this.
Events
/eventsJWT/events/:idJWT/events/:id/publishJWT/events/:id/liveJWT/events/:id/completeJWT/events/:id/cancelJWTEvents themselves are created through the repository (event datatype); this controller drives the state machine — publish, go live, complete, cancel.
Tickets
/events/tickets/purchaseJWT/events/:eventId/ticketsJWT/events/tickets/compJWT/events/tickets/pre-generateJWT/events/tickets/:ticketId/activateJWT/events/:eventId/ticketsJWT/events/:eventId/ticket-typesJWTcomp issues without payment; pre-generate creates a batch ahead of a sale, activated later — which is how you print physical stock before you know who buys it.
Lifecycle:
/events/tickets/:ticketId/transferJWT/events/tickets/:ticketId/cancelJWT/events/tickets/:ticketId/refundJWT/events/tickets/:ticketIdJWTBookings group a purchase of several tickets:
/events/bookings/:bookingId/cancelJWT/events/bookings/:bookingId/refundJWTQR and validation
/events/tickets/:ticketId/qrJWT/events/tickets/validateJWT/events/verify-scanJWTvalidate checks a ticket is genuine and unused; verify-scan is the door-scanner path.
Fulfillment
/events/tickets/fulfillJWT/events/tickets/lookup/:eventIdJWTWill-call: look up by name or reference, then fulfill.
Perks
/events/tickets/:ticketId/perksJWT/events/tickets/:ticketId/perks/:perkId/claimJWT/events/tickets/:ticketId/perks/:perkId/fulfillJWTDrink tokens, meal vouchers, merchandise — claimed by the attendee, fulfilled by staff, so both halves are recorded.
Badges
/events/tickets/:ticketId/badgeJWT/events/tickets/:ticketId/badge/printedJWTTemplates are event_badge_template. Marking printed prevents a second badge on the same ticket. Printing goes through PrintModule and reaches hardware via hub-agent.
Sessions
/events/:eventId/sessionsJWT/events/:eventId/sessionsJWT/events/:eventId/scheduleJWT/events/sessions/:sessionIdJWT/events/sessions/:sessionIdJWTTracks and talks within a multi-session event (event_session).
Check-in and occupancy
/events/checkinJWT/events/checkoutJWT/events/:eventId/occupancyJWT/events/:eventId/checkin-statsJWTCheck-out as well as check-in, so occupancy is a live count per zone rather than a running total — the number that matters for capacity limits.
Participants
/events/:eventId/participantsJWT/events/:eventId/participantsJWT/events/participants/:participantIdJWT/events/participants/:participantId/confirmJWT/events/participants/:participantId/cancelJWTSpeakers, exhibitors, staff — people attached to an event who are not ticket holders (event_participant).
Credentials
/events/:eventId/credentials/importJWT/events/:eventId/credentials/import-rangeJWT/events/credentials/assignJWT/events/credentials/:code/revokeJWT/events/:eventId/credentialsJWTPhysical credentials — wristbands, RFID cards. Import a range of pre-printed codes, then assign them to attendees on arrival (event_credential).
Event media
/events/:eventId/media/uploadJWT/events/:eventId/media/upload/:guestIdJWT/events/:eventId/mediaJWT/events/:eventId/media/guest/:guestIdJWT/events/:eventId/media/guestsJWT/events/:eventId/media/shareJWTPhotos taken at the event, attributable per guest — a photo-booth flow where each guest collects their own shots.
Attendee endpoints
Everything an attendee-facing app needs, under /client/events/*.
Public — no session required:
/client/eventsNo auth/client/events/bookingNo auth/client/events/tickets/purchaseNo auth/client/events/tickets/confirm-orderNo authGuests can browse and buy without an account, then look up a booking by reference.
Authenticated:
/client/events/tickets/mineJWT/client/events/tickets/:ticketIdJWT/client/events/tickets/:ticketId/qrJWT/client/events/tickets/:ticketId/perksJWT/client/events/tickets/:ticketId/transferJWT/client/events/tickets/registerJWTPayment:
/client/events/stripe/configJWT/client/events/stripe/intentJWT/client/events/stripe/checkout-sessionJWTSchedule and participation:
/client/events/:eventId/sessionsJWT/client/events/:eventId/scheduleJWT/client/events/participation/mineJWT/client/events/participation/:participantId/respondJWT@Get('tickets/mine') is declared before @Get(':eventId'), with a comment in the source explaining why: Nest matches in registration order, so a wildcard declared first would swallow every literal path after it. Keep that ordering if you add routes here.
Live check-in queue
CheckinModule handles arrivals in real time — a restaurant waitlist, a clinic waiting room, a service desk.
/checkin/walk-inJWT/checkin/from-reservation/:reservationIdJWTTwo ways in: a walk-up, or an arrival against a booking made through reservations.
Queue management:
/checkin/queueJWT/checkin/queue/summaryJWT/checkin/queue/historyJWT/checkin/queue/position/:taskIdJWT/checkin/upcomingJWT/checkin/reservations/todayJWTActions:
/checkin/:taskId/assignJWT/checkin/:taskId/notifyJWT/checkin/:taskId/leaveJWT/checkin/:taskId/no-showJWTService points — tables, chairs, rooms, bays:
/checkin/service-point/availableJWT/checkin/service-pointJWT/checkin/service-point/:spId/clearJWTThe same service_point datatype the POS assigns tabs to, so a seated party and its open tab refer to one record.
queue/position/:taskId is what a customer-facing "you are 4th in line" screen polls.
Datatypes
event, event_booking, event_ticket, event_ticket_type, event_session, event_participant, event_checkin, event_credential, event_badge_template, plus service_point, reservation and task.