Ticket Management API
Ticket Management API Documentation
Base URL: https://api.nexgate.your-api-domain.com/api/v1v1/e-events/tickets
Short Description: The Ticket Management API provides comprehensive functionality for creating and managing ticket types for events in the Nexgate platform. This API enablesallows event organizers to define and manage ticket types for their events on NextGate. Organizers can create multiple ticket tiers (e.g. VIP, Early Bird, Student,General etc.)Admission), with flexiblecontrol pricing, capacity management,capacity, sales periods, purchase limits,visibility, and attendancesales modes for hybrid events.channels. Tickets canare onlyalways bescoped createdto fora specific event and follow the event's lifecycle from DRAFT events, with automatic validationthrough to ensure events meet ticketing requirements before publishing.PUBLISHED.
Hints:
DRAFT Events Only:Tickets can only becreated/addedcreatedtoandeventsfully edited while the event is in DRAFT status. Once published, only capacity and status changes are allowed.- For
MinimumHYBRIDTicketevents,Requirement:youEventsmustneedcreate at least1oneACTIVEIN_PERSONtickettoand oneONLINEticket before the event can bepublishedpublished. Hybrid Event Requirement: HYBRID events need at least 1 IN_PERSON and 1 ONLINE ticketUnique Constraint:Ticketname + attendance modenames must be unique per event per attendance mode — you cannot have twoIN_PERSONtickets both named "VIP Pass" on the same event.Capacity ProtectionDONATION: Cannot reduce capacity belowticketsalreadyaresoldrestricted toONLINE_ONLYsales channel and a maximum of 1 ticket per order and per user.DeleteSoftProtection:deletionCanis used — a ticket can onlydeletebe deleted if zero ticketswithhavezerobeensalessold.(otherwiseOtherwise,mustcloseCLOSE)it using the status endpoint.AutomaticAllTICKETS Stage: Creating first ticket marks TICKETS stage as completeStatus Transitions: CLOSED is permanent, SOLD_OUT is automatic, DELETED requires endpointSales Period: Ticketsdatetimes must besoldin ISO 8601 / ZonedDateTime format (e.g.2025-08-10T09:00:00+03:00).
User Journey
The diagram below represents the typical flow an event organizer follows when setting up and managing tickets for their event. This is a user-facing journey — not a backend flow.
[Organizer creates event in DRAFT status]
|
| (Event must be DRAFT before eventany startsticket Purchasework)
Limits:v
Min/max. per. order,. max. per. user . . . . . . . . . . . . . . . . . .
. .
. TICKET SETUP PHASE .
. .
. [Create ticket types] .
. |-- General Admission (PAID) .
. |-- VIP Pass (PAID) .
. |-- Student Discount (PAID) .
. |-- Free Entry (FREE) .
. '-- Support the Artist (DONATION) .
. .
. . . . . . . . . . . . . . . . . . . . . . .
|
v
[Review all ticket types via Get All Tickets]
|
v
. . . . . . . . . . . . . . . . . . . . . . .
. .
. ADJUSTMENTS PHASE (still DRAFT) .
. .
. Need to fix details? .
. --> Update Ticket Validity:(name, Defineprice, whenetc.) .
. .
. Wrong capacity? .
. --> Update Ticket Capacity .
. .
. Ticket no longer needed? .
. --> Delete Ticket (only if 0 sold) .
. .
. . . . . . . . . . . . . . . . . . . . . . .
|
v
[Event published — tickets expirego (beforelive event,for atbuyers]
event|
end,v
or. custom) . . . . . . . . . . . . . . . . . . . . . .
. .
. LIVE EVENT PHASE .
. .
. Ticket sells out? .
. --> System auto-sets SOLD_OUT .
. --> Organizer can increase capacity .
. to reactivate it .
. .
. Want to pause sales temporarily? .
. --> Update Status to INACTIVE .
. .
. Want to stop sales permanently? .
. --> Update Status to CLOSED .
. .
. . . . . . . . . . . . . . . . . . . . . . .
Standard Response Format
All API responses follow a consistent structure using our Globe Response Builder pattern:structure:
Success Response Structure
{
"success": true,
"httpStatus": "OK",
"message": "Operation completed successfully",
"action_time": "2025-12-11T10:09-23T10:30:45",
"data": {
// Actual response data goes here
}
}
Error Response Structure
{
"success": false,
"httpStatus": "BAD_REQUEST",
"message": "Error description",
"action_time": "2025-12-11T10:09-23T10:30:45",
"data": "Error description"
}
Standard HTTP Method Badge Standards
GET - GET - Green (Read operations)
POST - POST - Blue (Create operations)
PATCH - PATCH - Orange (Partial update operations)
DELETE - DELETE - Red (Delete operations)
TicketResponse Structure
This is the comprehensive response structure returned by ticket endpoints:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"eventId": "660e8400-e29b-41d4-a716-446655440001",
"name": "Early Bird VIP",
"description": "VIP access with early bird discount - includes backstage pass, premium seating, and meet & greet",
"price": 150.00,
"totalTickets": 100,
"ticketsSold": 75,
"ticketsRemaining": 25,
"ticketsAvailable": 25,
"isSoldOut": false,
"salesStartDateTime": "2025-11-01T00:00:00+03:00",
"salesEndDateTime": "2025-12-14T23:59:59+03:00",
"isOnSale": true,
"minQuantityPerOrder": 1,
"maxQuantityPerOrder": 5,
"maxQuantityPerUser": 10,
"checkInValidUntil": "EVENT_END",
"customCheckInDate": null,
"attendanceMode": "IN_PERSON",
"inclusiveItems": [
"Backstage pass",
"Premium seating",
"Meet & greet with artists",
"Event merchandise pack",
"Complimentary refreshments"
],
"isHidden": false,
"status": "ACTIVE",
"createdAt": "2025-11-01T10:30:45+03:00",
"updatedAt": "2025-12-01T14:20:30+03:00",
"createdBy": "johndoe",
"updatedBy": "johndoe"
}
Response Field DescriptionsFields
| Field | Type | Description |
|---|---|---|
success |
true false for errors |
|
httpStatus |
string |
|
message |
string | |
action_time |
string | ISO 8601 timestamp of when the response was generated |
data |
object/string | |
TicketSummaryResponseHTTP StructureMethod Badges
Lightweight
- GET — GET
- POST — POST
- PUT — PUT
- PATCH — PATCH
- DELETE — DELETE
Enum Reference
TicketPricingType
| Value | Description |
|---|---|
PAID |
Standard paid ticket. Price must be greater than 0.00 |
FREE |
Free entry. Price must be exactly 0.00 |
DONATION |
Supporter ticket. Buyer sets their own amount. Restricted to ONLINE_ONLY channel, max 1 per order and per user |
SalesChannel
| Value | Description |
|---|---|
EVERYWHERE |
Available both online and at the door |
ONLINE_ONLY |
Available for |
AT_DOOR_ONLY |
Available for purchase at the venue door only |
AttendanceMode
| Value | Description |
|---|---|
IN_PERSON |
Ticket grants physical entry to the venue |
ONLINE |
Ticket grants access to the online/virtual stream |
Note: For
IN_PERSONevents, onlyIN_PERSONtickets are allowed. ForONLINEevents, onlyONLINEtickets are allowed. ForHYBRIDevents, both are permitted and at least one of each is required before publishing.
TicketVisibility
| Value | Description |
|---|---|
|
Always |
HIDDEN |
Never |
HIDDEN_WHEN_NOT_ON_SALE |
Only |
CUSTOM_SCHEDULE |
Shown only within a defined date/time window. Requires visibilityStartDate and visibilityEndDate |
TicketStatus
| Value | Description |
|---|---|
ACTIVE |
Ticket is live and available for purchase |
INACTIVE |
Temporarily paused. Organizer can reactivate |
CLOSED |
Permanently stopped. Cannot be reopened |
SOLD_OUT |
System-managed. Set automatically when ticketsSold >= totalTickets. Can revert to ACTIVE if capacity is increased |
DELETED |
Soft-deleted. Only possible if zero tickets were sold. Use the Delete endpoint — cannot be set via status update |
Endpoints
1. Create Ticket
Purpose: CreateCreates a new ticket type for ana specific event. The event (onlymust forbe in DRAFT events)status. The authenticated user must be the event organizer.
Endpoint: POST {base_url}/e-events/tickets/{eventId}
Access Level: 🔒 Protected (Requires Bearer Token + Event Organizer)organizer only)
Authentication: Bearer Token
Request Headers:
| Header | Type | Required | Description |
|---|---|---|---|
Authorization |
string | Yes | Bearer <token> |
Content-Type |
string | Yes | application/json |
Path Parameters:
| Parameter | Type | Required | Description | Validation |
|---|---|---|---|---|
eventId |
Yes | Must be a valid UUID |
Request JSON Sample (Hybrid Event - In-Person Ticket):
{
"name": "Early Bird VIP",
"description": "VIP access with early bird discount - includes backstage pass, premium seating, and meet & greet",
"price": 150.00,
"totalQuantity": 100,
"salesStartDateTime": "2025-11-01T00:00:00+03:00",
"salesEndDateTime": "2025-12-14T23:59:59+03:00",
"minQuantityPerOrder": 1,
"maxQuantityPerOrder": 5,
"maxQuantityPerUser": 10,
"checkInValidUntil": "EVENT_END",
"attendanceMode": "IN_PERSON",
"inclusiveItems": [
"Backstage pass",
"Premium seating",
"Meet & greet with artists",
"Event merchandise pack",
"Complimentary refreshments"
],
"isHidden": false
}
Request Body Parameters:
Basic Information
| Parameter | Type | Required | Description | Validation |
|---|---|---|---|---|
name |
string | Yes | Ticket |
Min: 2, Max: 100 |
description |
string | No | Max: 500 characters | |
price |
decimal | Yes | Ticket 0.00 for FREE tickets |
Min: 0. |
Capacity Management
ticketPricingType |
string | Yes | Pricing | Enum: PAID, FREE, DONATION |
|||||
salesChannel |
string | Yes | Where the ticket can be purchased | Enum: EVERYWHERE, ONLINE_ONLY, AT_DOOR_ONLY. Defaults to EVERYWHERE |
|||||
totalQuantity |
integer | Yes | Total number of tickets available | Min: 1, Max: 1,000,000 |
Sales Period (Optional)
salesStartDateTime |
No | When sales open. If omitted, sales begin immediately | ISO |
|
salesEndDateTime |
No | When sales |
ISO salesStartDateTime. Cannot be after event start |
|
minQuantityPerOrder |
integer | No | Minimum tickets a buyer must purchase per order | Min: 1. Defaults to 1 |
maxQuantityPerOrder |
integer | No | Maximum tickets a buyer can purchase per order | Min: 1, Max: 100. Must be minQuantityPerOrder. Leave null for no limit |
maxQuantityPerUser |
integer | No | Maximum tickets a single user can purchase across all orders | Min: 1, Max: 1000. Must be ≥ maxQuantityPerOrder. Leave null for no limit |
visibility |
string | Yes | Controls whether the ticket is shown to buyers | Enum: VISIBLE, HIDDEN, HIDDEN_WHEN_NOT_ON_SALE, CUSTOM_SCHEDULE. Defaults to VISIBLE |
visibilityStartDate |
datetime | No | When the ticket becomes visible. Required if visibility is CUSTOM_SCHEDULE |
ISO 8601 ZonedDateTime |
visibilityEndDate |
datetime | No | When the ticket stops being visible. Required if visibility is CUSTOM_SCHEDULE. Must be after visibilityStartDate |
ISO 8601 ZonedDateTime |
attendanceMode |
string | Yes | Whether this ticket is for physical or online attendance | Enum: IN_PERSON, ONLINE. Must match the event |
inclusiveItems |
array of strings | No | List of perks included with this ticket (e.g. "Free T-Shirt", "Meet & Greet") | Max: 50 items. Each item: max 200 characters, cannot be blank |
Purchase
Request LimitsJSON Sample:
{
"name": "VIP Pass",
"description": "Full weekend access with backstage entry and a complimentary gift bag.",
"price": 150.00,
"ticketPricingType": "PAID",
"salesChannel": "EVERYWHERE",
"totalQuantity": 200,
"salesStartDateTime": "2025-06-01T08:00:00+03:00",
"salesEndDateTime": "2025-08-09T23:59:00+03:00",
"minQuantityPerOrder": 1,
"maxQuantityPerOrder": 4,
"maxQuantityPerUser": 4,
"visibility": "VISIBLE",
"attendanceMode": "IN_PERSON",
"inclusiveItems": [
"Backstage access",
"Complimentary gift bag",
"Priority seating"
]
}
Success Response JSON Sample:
{
"success": true,
"httpStatus": "CREATED",
"message": "Ticket created successfully",
"action_time": "2025-02-18T10:30:45",
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"eventId": "f1e2d3c4-b5a6-7890-fedc-ba9876543210",
"name": "VIP Pass",
"description": "Full weekend access with backstage entry and a complimentary gift bag.",
"price": 150.00,
"ticketPricingType": "PAID",
"salesChannel": "EVERYWHERE",
"totalTickets": 200,
"ticketsSold": 0,
"ticketsRemaining": 200,
"ticketsAvailable": 200,
"isSoldOut": false,
"salesStartDateTime": "2025-06-01T08:00:00+03:00",
"salesEndDateTime": "2025-08-09T23:59:00+03:00",
"isOnSale": false,
"minQuantityPerOrder": 1,
"maxQuantityPerOrder": 4,
"maxQuantityPerUser": 4,
"visibility": "VISIBLE",
"visibilityStartDate": null,
"visibilityEndDate": null,
"isCurrentlyVisible": true,
"attendanceMode": "IN_PERSON",
"inclusiveItems": [
"Backstage access",
"Complimentary gift bag",
"Priority seating"
],
"status": "ACTIVE",
"createdAt": "2025-02-18T10:30:45+03:00",
"updatedAt": null,
"createdBy": "john_organizer",
"updatedBy": null
}
}
Success Response Fields:
| Description | ||||
|---|---|---|---|---|
id |
||||
eventId |
||||
name |
||||
description |
||||
price |
||||
ticketPricingType |
Pricing model: PAID, FREE, or DONATION |
|||
salesChannel |
Where the ticket can be purchased | |||
totalTickets |
Total number of tickets created | |||
ticketsSold |
Number of tickets purchased so far | |||
ticketsRemaining |
totalTickets - ticketsSold |
|||
ticketsAvailable |
Same as ticketsRemaining (current available quantity) |
|||
isSoldOut |
true if ticketsSold >= totalTickets |
|||
salesStartDateTime |
When ticket sales open | |||
salesEndDateTime |
When ticket sales close | |||
isOnSale |
Calculated: true if ticket is ACTIVE and currently within the sales window |
|||
minQuantityPerOrder |
Minimum per order | |||
maxQuantityPerOrder |
Maximum per order (null = no limit) |
|||
maxQuantityPerUser |
Maximum per user null = no limit) |
|||
visibility |
||||
visibilityStartDate |
Start |
|||
visibilityEndDate |
End of custom visibility window | |||
isCurrentlyVisible |
Calculated: whether the ticket is currently visible to buyers | |||
attendanceMode |
IN_PERSON or ONLINE |
|||
inclusiveItems |
List of perks included with the ticket | |||
status |
Ticket status: ACTIVE, INACTIVE, CLOSED, SOLD_OUT, DELETED |
|||
createdAt |
Timestamp when the ticket was created | |||
updatedAt |
Timestamp of last update (null if never updated) |
|||
createdBy |
Username of the organizer who created the ticket | |||
updatedBy |
Username of last person who updated the ticket |
Ticket
Possible ValidityError Responses:
401 |
No | |||
403 |
||||
404 |
||||
400 |
||||
400 |
||||
422 |
Validation errors (missing required fields, invalid price, quantity issues, etc.) |
For Hybrid Events
Additional Features
Success Response: Returns complete TicketResponse structure
Success Response Message: "Ticket created successfully"
HTTP Status Code: 201 CREATED
Behavior:
Event must be in DRAFT statusTicket name + attendanceMode must be unique per eventFirst ticket creation marks TICKETS stage as completeSets currentStage to REVIEW if TICKETS was current stageHYBRID events require attendanceMode (IN_PERSON or ONLINE)Sales period must be before event startsInitial status set to ACTIVEInitial quantitySold set to 0
Standard Error Types:
400 BAD_REQUEST: Event not in DRAFT status, duplicate ticket name, validation errors401 UNAUTHORIZED: Authentication issues403 FORBIDDEN: Not event organizer404 NOT_FOUND: Event not found422 UNPROCESSABLE_ENTITY: Validation errors500 INTERNAL_SERVER_ERROR: Server errors
Error Response Examples:
Event Not in Draft (400):
{
"success": false,
"httpStatus": "BAD_REQUEST",
"message": "Tickets can only be created for events in DRAFT status. Current status: PUBLISHED",
"action_time": "2025-12-11T10:02-18T10:30:45",
"data": "Tickets can only be created for events in DRAFT status. Current status: PUBLISHED"
}
Duplicate Ticket Name (400):
{
"success": false,
"httpStatus": "BAD_REQUEST",
"message": "A ticket with name 'VIP Pass' and attendance mode 'IN_PERSON' already exists for this event",
"action_time": "2025-12-11T10:02-18T10:30:45",
"data": "A ticket with name 'VIP Pass' and attendance mode 'IN_PERSON' already exists for this event"
}
MissingValidation Attendance Mode for HybridError (400)422):
{
"success": false,
"httpStatus": "BAD_REQUEST"UNPROCESSABLE_ENTITY",
"message": "AttendanceValidation mode (IN_PERSON or ONLINE) is required for HYBRID events"failed",
"action_time": "2025-12-11T10:02-18T10:30:45",
"data": {
"Attendancename": mode"Ticket (IN_PERSON or ONLINE)name is required for HYBRID events"
}
Sales End After Event Start (400):
{required",
"success": false,
"httpStatus"price": "BAD_REQUEST",
"message": "Sales end date cannot be after event start date. TicketsPrice must be soldzero beforeor the event begins."positive",
"action_time"ticketPricingType": "2025-12-11T10:30:45",Ticket "data":type "Salesis end date cannot be after event start date. Tickets must be sold before the event begins."required"
}
Invalid Purchase Limits (400):
{
"success": false,
"httpStatus": "BAD_REQUEST",
"message": "Maximum quantity per order (3) must be greater than or equal to minimum (5)",
"action_time": "2025-12-11T10:30:45",
"data": "Maximum quantity per order (3) must be greater than or equal to minimum (5)"
}
2. Update Ticket
Purpose: Updates the details of an existing ticket type. The event must still be in DRAFT status. All fields are optional — only the fields you send will be updated. Omitted fields keep their current values.
Endpoint: PUT {base_url}/{ticketId}
Access Level: 🔒 Protected (Event organizer only)
Authentication: Bearer Token
Request Headers:
| Header | Type | Required | Description |
|---|---|---|---|
Authorization |
string | Yes | Bearer <token> |
Content-Type |
string | Yes | application/json |
Path Parameters:
| Parameter | Type | Required | Description | Validation |
|---|---|---|---|---|
ticketId |
UUID | Yes | The ticket to update | Must be a valid UUID |
Request Body Parameters:
| Parameter | Type | Required | Description | Validation |
|---|---|---|---|---|
name |
string | No | Updated ticket name | Min: 2, Max: 100 characters. Must remain unique per event per attendance mode |
description |
string | No | Updated description | Max: 500 characters |
price |
decimal | No | Updated price | Min: 0.00. Must be consistent with ticketPricingType rules |
ticketPricingType |
string | No | Updated pricing model | Enum: PAID, FREE, DONATION |
salesChannel |
string | No | Updated sales channel | Enum: EVERYWHERE, ONLINE_ONLY, AT_DOOR_ONLY |
totalQuantity |
integer | No | Updated total capacity | Min: 1, Max: 1,000,000 |
salesStartDateTime |
datetime | No | Updated sales open time | ISO 8601 ZonedDateTime |
salesEndDateTime |
datetime | No | Updated sales close time | ISO 8601 ZonedDateTime. Must be after salesStartDateTime and before event start |
minQuantityPerOrder |
integer | No | Updated minimum per order | Min: 1 |
maxQuantityPerOrder |
integer | No | Updated maximum per order | Min: 1, Max: 100 |
maxQuantityPerUser |
integer | No | Updated maximum per user | Min: 1, Max: 1000 |
attendanceMode |
string | No | Updated attendance mode | Enum: IN_PERSON, ONLINE. Must match event format rules |
inclusiveItems |
array of strings | No | Full replacement list of inclusive perks | Max: 50 items. Each: max 200 characters, cannot be blank |
visibility |
string | No | Updated visibility | Enum: VISIBLE, HIDDEN, HIDDEN_WHEN_NOT_ON_SALE, CUSTOM_SCHEDULE |
visibilityStartDate |
datetime | No | Updated visibility start | Required if changing to CUSTOM_SCHEDULE |
visibilityEndDate |
datetime | No | Updated visibility end | Required if changing to CUSTOM_SCHEDULE. Must be after start |
Request JSON Sample:
{
"name": "VIP Weekend Pass",
"price": 175.00,
"maxQuantityPerOrder": 2,
"inclusiveItems": [
"Backstage access",
"Complimentary gift bag",
"Priority seating",
"Artist meet & greet"
]
}
Success Response JSON Sample:
{
"success": true,
"httpStatus": "OK",
"message": "Ticket updated successfully",
"action_time": "2025-02-18T11:00:00",
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"eventId": "f1e2d3c4-b5a6-7890-fedc-ba9876543210",
"name": "VIP Weekend Pass",
"description": "Full weekend access with backstage entry and a complimentary gift bag.",
"price": 175.00,
"ticketPricingType": "PAID",
"salesChannel": "EVERYWHERE",
"totalTickets": 200,
"ticketsSold": 0,
"ticketsRemaining": 200,
"ticketsAvailable": 200,
"isSoldOut": false,
"salesStartDateTime": "2025-06-01T08:00:00+03:00",
"salesEndDateTime": "2025-08-09T23:59:00+03:00",
"isOnSale": false,
"minQuantityPerOrder": 1,
"maxQuantityPerOrder": 2,
"maxQuantityPerUser": 4,
"visibility": "VISIBLE",
"visibilityStartDate": null,
"visibilityEndDate": null,
"isCurrentlyVisible": true,
"attendanceMode": "IN_PERSON",
"inclusiveItems": [
"Backstage access",
"Complimentary gift bag",
"Priority seating",
"Artist meet & greet"
],
"status": "ACTIVE",
"createdAt": "2025-02-18T10:30:45+03:00",
"updatedAt": "2025-02-18T11:00:00+03:00",
"createdBy": "john_organizer",
"updatedBy": "john_organizer"
}
}
Success Response Fields: Same as Create Ticket response fields.
Possible Error Responses:
| Status | Scenario |
|---|---|
401 |
No or expired token |
403 |
Authenticated user is not the event organizer |
404 |
Ticket not found |
400 |
Event is not in DRAFT status |
400 |
Updated name conflicts with an existing ticket on the same event |
422 |
Validation errors (invalid price, quantity inconsistencies, etc.) |
3. Get All Tickets byfor Event
Purpose: RetrieveRetrieves a lightweight summary list of all ticketactive types(non-deleted) tickets for ana eventgiven event, ordered by creation date ascending. This is the primary endpoint for displaying ticket listings to buyers or organizers.
Endpoint: GET {base_url}/e-events/tickets/{eventId}
Access Level: 🔓🌐 Public (Anyone can view tickets for public events)
Authentication: BearerNone Token (optional for public events)required
Path Parameters:
| Parameter | Type | Required | Description | Validation |
|---|---|---|---|---|
eventId |
Yes | Must be a valid UUID |
Success Response: Returns array of TicketSummaryResponse objects
Success Response Message: "Tickets retrieved successfully"
Success Response JSON Sample:
{
"success": true,
"httpStatus": "OK",
"message": "Tickets retrieved successfully",
"action_time": "2025-12-11T10:02-18T10:30:45",
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000"a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "EarlyGeneral Bird VIP"Admission",
"price": 150.25.00,
"ticketPricingType": "PAID",
"salesChannel": "EVERYWHERE",
"visibility": "VISIBLE",
"totalTickets": 100,1000,
"ticketsSold": 75,342,
"ticketsAvailable": 25,658,
"isSoldOut": false,
"attendanceMode": "IN_PERSON",
"status": "ACTIVE",
"isOnSale": true
},
{
"id": "660e8400-e29b-41d4-a716-446655440001"b2c3d4e5-f6a7-8901-bcde-f12345678901",
"name": "Regular"VIP Pass",
"price": 50.150.00,
"ticketPricingType": "PAID",
"salesChannel": "EVERYWHERE",
"visibility": "VISIBLE",
"totalTickets": 500,200,
"ticketsSold": 320,200,
"ticketsAvailable": 180,0,
"isSoldOut": false,true,
"attendanceMode": "IN_PERSON",
"status": "ACTIVE"SOLD_OUT",
"isOnSale": truefalse
},
{
"id": "770e8400-e29b-41d4-a716-446655440002"c3d4e5f6-a7b8-9012-cdef-012345678902",
"name": "VirtualOnline Pass"Stream Access",
"price": 25.10.00,
"ticketPricingType": "PAID",
"salesChannel": "ONLINE_ONLY",
"visibility": "VISIBLE",
"totalTickets": 1000,5000,
"ticketsSold": 850,1230,
"ticketsAvailable": 150,3770,
"isSoldOut": false,
"attendanceMode": "ONLINE",
"status": "ACTIVE",
"isOnSale": true
}
]
}
BehaviorSuccess Response Fields (per item):
| Field | Description |
|---|---|
id |
Unique identifier for the ticket type |
name |
Ticket name |
price |
Ticket price |
ticketPricingType |
Pricing model |
salesChannel |
Where it can be purchased |
visibility |
Visibility setting |
totalTickets |
Total quantity created |
ticketsSold |
Quantity sold so far |
ticketsAvailable |
Quantity still available |
isSoldOut |
Whether the ticket is sold out |
attendanceMode |
IN_PERSON or ONLINE |
status |
Current ticket status |
isOnSale |
Whether the ticket is currently purchasable |
Possible Error Responses:
Returnsonlynon-deletedStatus ticketsScenario Sortedbycreationdate(oldest first)Includes tickets in all statuses (ACTIVE, INACTIVE, CLOSED, SOLD_OUT)Hidden tickets (isHidden=true) are includedStandard Error Types:404NOT_FOUND:Event not found
-
Status Scenario 404NOT_FOUND: TicketEvent not found or ticket not found
3.4. Get Ticket by ID
Purpose: RetrieveRetrieves detailedthe informationfull fordetails of a single ticket type by its ID. Returns all fields including audit info, calculated quantities, and visibility state.
Endpoint: GET {base_url}/e-events/tickets/{eventId}/{ticketId}
Access Level: 🔓🌐 Public
Authentication: BearerNone Token (optional)required
Path Parameters:
| Parameter | Type | Required | Description | Validation |
|---|---|---|---|---|
eventId |
Yes | Must be a valid UUID | ||
ticketId |
Yes | Must be a valid UUID |
Success Response JSON Sample: Returns complete TicketResponse structure with all details
Success
true,
"httpStatus": "OK",
"message": "Ticket retrieved successfully",
"action_time": "2025-02-18T10:30:45",
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"eventId": "f1e2d3c4-b5a6-7890-fedc-ba9876543210",
"name": "VIP Pass",
"description": "Full weekend access with backstage entry and a complimentary gift bag.",
"price": 150.00,
"ticketPricingType": "PAID",
"salesChannel": "EVERYWHERE",
"totalTickets": 200,
"ticketsSold": 45,
"ticketsRemaining": 155,
"ticketsAvailable": 155,
"isSoldOut": false,
"salesStartDateTime": "2025-06-01T08:00:00+03:00",
"salesEndDateTime": "2025-08-09T23:59:00+03:00",
"isOnSale": true,
"minQuantityPerOrder": 1,
"maxQuantityPerOrder": 4,
"maxQuantityPerUser": 4,
"visibility": "VISIBLE",
"visibilityStartDate": null,
"visibilityEndDate": null,
"isCurrentlyVisible": true,
"attendanceMode": "IN_PERSON",
"inclusiveItems": [
"Backstage access",
"Complimentary gift bag",
"Priority seating"
],
"status": "ACTIVE",
"createdAt": "2025-02-18T10:30:45+03:00",
"updatedAt": "2025-02-18T11:00:00+03:00",
"createdBy": "john_organizer",
"updatedBy": "john_organizer"
}
}
{
Response"success": Message
Success Response Fields: Same as Create Ticket response fields.
StandardPossible Error TypesResponses:
4.5. Update Ticket Capacity
Purpose: UpdateUpdates the total ticketquantity quantity/(capacity) of a ticket. This is the only capacity-related change permitted after an event is published. Useful when you need to release more tickets or correct an initial quantity. The new capacity must be greater than or equal to the number of tickets already sold.
Endpoint: PATCH {base_url}/e-events/tickets/{eventId}/{ticketId}/capacity
Access Level: 🔒 Protected (Event Organizerorganizer Only)only)
Authentication: Bearer Token
Request Headers:
| Header | Type | Required | Description |
|---|---|---|---|
Authorization |
string | Yes | Bearer <token> |
Content-Type |
string | Yes | application/json |
Path Parameters:
| Parameter | Type | Required | Description | Validation |
|---|---|---|---|---|
eventId |
Yes | Must be a valid UUID | ||
ticketId |
Yes | Must be a valid UUID |
Request JSON Sample:
{
"newTotalQuantity": 150
}
Request Body Parameters:
| Parameter | Type | Required | Description | Validation |
|---|---|---|---|---|
newTotalQuantity |
integer | Yes | Min: 1, Max: 1,000,ticketsSold |
SuccessRequest ResponseJSON Sample:
{
updated"newTotalQuantity": TicketResponse300
}
Success Response MessageJSON Sample:
{
"success": true,
"httpStatus": "OK",
"message": "Ticket capacity updated successfully",
"action_time": "2025-02-18T12:00:00",
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"eventId": "f1e2d3c4-b5a6-7890-fedc-ba9876543210",
"name": "VIP Pass",
"description": "Full weekend access with backstage entry and a complimentary gift bag.",
"price": 150.00,
"ticketPricingType": "PAID",
"salesChannel": "EVERYWHERE",
"totalTickets": 300,
"ticketsSold": 200,
"ticketsRemaining": 100,
"ticketsAvailable": 100,
"isSoldOut": false,
"salesStartDateTime": "2025-06-01T08:00:00+03:00",
"salesEndDateTime": "2025-08-09T23:59:00+03:00",
"isOnSale": true,
"minQuantityPerOrder": 1,
"maxQuantityPerOrder": 4,
"maxQuantityPerUser": 4,
"visibility": "VISIBLE",
"visibilityStartDate": null,
"visibilityEndDate": null,
"isCurrentlyVisible": true,
"attendanceMode": "IN_PERSON",
"inclusiveItems": [
"Backstage access",
"Complimentary gift bag",
"Priority seating"
],
"status": "ACTIVE",
"createdAt": "2025-02-18T10:30:45+03:00",
"updatedAt": "2025-02-18T12:00:00+03:00",
"createdBy": "john_organizer",
"updatedBy": "john_organizer"
}
}
Note: If a ticket was previously
SOLD_OUTand the new capacity exceeds tickets sold, the status is automatically reset toACTIVE.
Success Response Fields: Same as Create Ticket response fields.
BehaviorPossible Error Responses:
CanupdatecapacityStatus forScenario bothDRAFTandPUBLISHEDevents401No or expired token 403Not the event organizer 404Ticket not found 400New capacity mustisbeless>=than the number of tickets already soldIfticketwas422SOLD_OUTnewTotalQuantityandisnewmissingcapacity > ticketsSold, status changes to ACTIVEWorks for all event statuses (DRAFT, PUBLISHED, HAPPENING, etc.)Use Cases:Increase Capacity: Venue size increased, add more ticketsDecrease Capacity: Venue size reduced (if notor belowsoldminimum
count)ReopenSold Out Tickets: Increase capacity to resume sales400 BAD_REQUEST: New capacity below tickets sold403 FORBIDDEN: Not event organizer404 NOT_FOUND: Ticket not found
Error Response ExamplesExample:
Capacity Below Sold Count (400):
{
"success": false,
"httpStatus": "BAD_REQUEST",
"message": "Cannot reduce capacity to 50100 because 75200 tickets have already been sold",
"action_time": "2025-12-11T10:30:45"02-18T12:00:00",
"data": "Cannot reduce capacity to 50100 because 75200 tickets have already been sold"
}
5.6. Update Ticket Status
Purpose: ChangeManually changes the status of a ticket type. Use this to pause ticket sales (INACTIVE), permanently stop sales (CLOSED), or reactivate a paused ticket (ACTIVE). The system automatically manages SOLD_OUT status (ACTIVE,— INACTIVE,it CLOSED)cannot be set manually.
Endpoint: PATCH {base_url}/e-events/tickets/{eventId}/{ticketId}/status
Access Level: 🔒 Protected (Event Organizerorganizer Only)only)
Authentication: Bearer Token
Request Headers:
| Header | Type | Required | Description |
|---|---|---|---|
Authorization |
string | Yes | Bearer <token> |
Content-Type |
string | Yes | application/json |
Path Parameters:
| Parameter | Type | Required | Description | Validation |
|---|---|---|---|---|
eventId |
Yes | Must be a valid UUID | ||
ticketId |
Yes | Must be a valid UUID |
Request Body Parameters:
| Parameter | Type | Required | Description | Validation |
|---|---|---|---|---|
status |
string | Yes | The new status to set | Enum: ACTIVE, INACTIVE, CLOSED. Cannot set SOLD_OUT or DELETED manually |
Status Transition Rules:
| Current Status | Allowed Transitions | Notes |
|---|---|---|
ACTIVE |
INACTIVE, CLOSED |
Normal operations |
INACTIVE |
ACTIVE, CLOSED |
Can be reactivated |
SOLD_OUT |
ACTIVE, CLOSED |
ACTIVE only if capacity was increased first |
CLOSED |
None | Permanent. Cannot be changed |
DELETED |
None | Permanent. Cannot be changed |
Request JSON Sample:
{
"status": "INACTIVE"
}
RequestSuccess BodyResponse ParametersJSON Sample:
{
"success": true,
"httpStatus": "OK",
"message": "Ticket status updated successfully",
"action_time": "2025-02-18T13:00:00",
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"eventId": "f1e2d3c4-b5a6-7890-fedc-ba9876543210",
"name": "VIP Pass",
"description": "Full weekend access with backstage entry and a complimentary gift bag.",
"price": 150.00,
"ticketPricingType": "PAID",
"salesChannel": "EVERYWHERE",
"totalTickets": 200,
"ticketsSold": 45,
"ticketsRemaining": 155,
"ticketsAvailable": 155,
"isSoldOut": false,
"salesStartDateTime": "2025-06-01T08:00:00+03:00",
"salesEndDateTime": "2025-08-09T23:59:00+03:00",
"isOnSale": false,
"minQuantityPerOrder": 1,
"maxQuantityPerOrder": 4,
"maxQuantityPerUser": 4,
"visibility": "VISIBLE",
"visibilityStartDate": null,
"visibilityEndDate": null,
"isCurrentlyVisible": true,
"attendanceMode": "IN_PERSON",
"inclusiveItems": [
"Backstage access",
"Complimentary gift bag",
"Priority seating"
],
"status": "INACTIVE",
"createdAt": "2025-02-18T10:30:45+03:00",
"updatedAt": "2025-02-18T13:00:00+03:00",
"createdBy": "john_organizer",
"updatedBy": "john_organizer"
}
}
Success Response Fields: Same as Create Ticket response fields.
Possible Error Responses:
401 |
||||
403 |
||||
404 |
||||
400 |
SOLD_OUT or DELETED manually |
|||
400 |
Attempted to change status of a CLOSED or DELETED ticket |
|||
422 |
status field is missing |
Success Response: Returns updated TicketResponse
Success Response Message: "Ticket status updated successfully"
Status Transition Rules:
Use Cases:
ACTIVE → INACTIVE: Temporarily pause sales (during review, pricing adjustment)INACTIVE → ACTIVE: Resume sales after pauseACTIVE/INACTIVE → CLOSED: Permanently stop sales (event capacity changed, tier removed)SOLD_OUT → ACTIVE: Resume sales after capacity increase (requires capacity update first)
Standard Error Types:
400 BAD_REQUEST: Invalid status transition403 FORBIDDEN: Not event organizer404 NOT_FOUND: Ticket not found
Error Response Examples:
InvalidAttempt Transition - CLOSED is Permanent (400):
{
"success": false,
"httpStatus": "BAD_REQUEST",
"message": "Cannot change status of closed ticket. Closed status is permanent.",
"action_time": "2025-12-11T10:30:45",
"data": "Cannot change status of closed ticket. Closed status is permanent."
}
Cannot Manuallyto Set SOLD_OUT (400):
{
"success": false,
"httpStatus": "BAD_REQUEST",
"message": "Cannot manually set status to SOLD_OUT. This status is automatically set when tickets are sold out.",
"action_time": "2025-12-11T10:30:45"02-18T13:00:00",
"data": "Cannot manually set status to SOLD_OUT. This status is automatically set when tickets are sold out."
}
Attempt to Change CLOSED Ticket (400):
{
"success": false,
"httpStatus": "BAD_REQUEST",
"message": "Cannot change status of closed ticket. Closed status is permanent.",
"action_time": "2025-02-18T13:00:00",
"data": "Cannot change status of closed ticket. Closed status is permanent."
}
6.7. Delete Ticket
Purpose: Soft deleteSoft-deletes a ticket typetype. (The ticket is marked as deleted and hidden from all listings but is not physically removed from the system. Deletion is only allowed if nozero tickets sold)have been sold. If tickets have already been sold, close the ticket instead using the status endpoint.
Endpoint: DELETE {base_url}/e-events/tickets/{eventId}/{ticketId}
Access Level: 🔒 Protected (Event Organizerorganizer Only)only)
Authentication: Bearer Token
Request Headers:
| Header | Type | Required | Description |
|---|---|---|---|
Authorization |
string | Yes | Bearer <token> |
Path Parameters:
| Parameter | Type | Required | Description | Validation |
|---|---|---|---|---|
eventId |
Yes | Must be a valid UUID | ||
ticketId |
Yes | Must be a valid UUID |
Success Response Message: "Ticket deleted successfully"
Success Response JSON Sample:
{
"success": true,
"httpStatus": "OK",
"message": "Ticket deleted successfully",
"action_time": "2025-12-11T10:30:45"02-18T14:00:00",
"data": null
}
BehaviorPossible Error Responses:
Softdelete(setsStatus isDeleted=true,Scenario status=DELETED)Canonlydeleteif401quantitySoldNo =or0expiredIftoken403Not the event organizer 404Ticket not found 400Ticket cannot be deleted because tickets have already been sold,soldmustusestatus update to CLOSE insteadSets deletedAt timestamp and deletedBy userDeleted tickets excluded from GET lists400 BAD_REQUEST: Cannot delete ticket with sales403 FORBIDDEN: Not event organizer404 NOT_FOUND: Ticket not found
Error Response Example:
CannotTickets DeleteAlready Ticket with SalesSold (400):
{
"success": false,
"httpStatus": "BAD_REQUEST",
"message": "Cannot delete ticket 'EarlyVIP Bird VIP'Pass' because 7545 tickets have been sold. You can close the ticket instead to stop sales.",
"action_time": "2025-12-11T10:30:45"02-18T14:00:00",
"data": "Cannot delete ticket 'EarlyVIP Bird VIP'Pass' because 7545 tickets have been sold. You can close the ticket instead to stop sales."
}
TicketQuick Status LifecycleReference
StatusEndpoint Flow Diagram
ACTIVE ⇄ INACTIVE → CLOSED (permanent)
↓
SOLD_OUT → ACTIVE (if capacity increased)
↓
DELETED (if no sales)
Status DescriptionsSummary
| Method | Path | Description | ||||
|---|---|---|---|---|---|---|
/{eventId} |
||||||
/{ticketId} |
||||||
/{eventId} |
||||||
/{eventId}/{ticketId} |
||||||
/{eventId}/{ticketId}/capacity |
||||||
| 6 | PATCH | /{eventId}/{ticketId}/status |
Update ticket status | 🔒 Organizer | ||
| 7 | DELETE | /{eventId}/{ticketId} |
Delete a ticket | 🔒 Organizer |
Automatic Status Changes
SOLD_OUT: Automatically set whenticketsSold >= totalTicketsACTIVE: Automatically set when capacity increased on SOLD_OUT ticket
Ticket Types & Use Cases
Common Ticket Types
1. Early Bird
{
"name": "Early Bird",
"price": 50.00,
"totalQuantity": 100,
"salesEndDateTime": "2025-11-30T23:59:59+03:00",
"maxQuantityPerOrder": 5
}
Limited quantitySales end date before regular ticketsDiscounted price
2. VIP/Premium
{
"name": "VIP Pass",
"price": 200.00,
"totalQuantity": 50,
"inclusiveItems": [
"Backstage access",
"Premium seating",
"Meet & greet",
"Gift bag"
],
"checkInValidUntil": "CUSTOM",
"customCheckInDate": "2025-12-18T00:00:00+03:00"
}
Higher priceLimited quantityMultiple perksExtended validity (after-party access)
3. Student/Discount
{
"name": "Student Discount",
"price": 25.00,
"totalQuantity": 200,
"maxQuantityPerUser": 2,
"isHidden": true
}
Discounted pricePer-user limitHidden (requires special link/code)
4. Group Tickets
{
"name": "Group Pass (5 people)",
"price": 200.00,
"totalQuantity": 50,
"minQuantityPerOrder": 5,
"maxQuantityPerOrder": 5
}
Fixed quantity per purchaseBulk pricing
5. Hybrid Event - In-Person
{
"name": "In-Person Pass",
"price": 100.00,
"totalQuantity": 300,
"attendanceMode": "IN_PERSON",
"inclusiveItems": [
"Physical venue access",
"Networking lunch",
"Event materials"
]
}
Physical venue accessHigher price than online
6. Hybrid Event - Online
{
"name": "Virtual Pass",
"price": 50.00,
"totalQuantity": 1000,
"attendanceMode": "ONLINE",
"inclusiveItems": [
"Live stream access",
"Recording access (30 days)",
"Digital materials"
]
}
Virtual accessHigher capacityLower price
Ticket Validity Types
BEFORE_EVENT_START
Ticket expires just before event begins.
Use Cases:
Early bird tickets that expire at event timeTickets that don't grant event entry (pre-event workshops)
Behavior:
Cannot check in once event startsUseful for time-limited promotional tickets
EVENT_END (Default)
Ticket valid until event ends.
Use Cases:
Standard event ticketsMulti-day pass valid for all days
Behavior:
Can check in anytime during eventFor multi-day events, valid until last day endsMost common validity type
CUSTOM
Ticket valid until specific custom date/time.
Use Cases:
VIP after-party access extending beyond eventEarly access tickets (valid before event starts)Extended access (recordings, venue access)
Behavior:
RequirescustomCheckInDatefieldFlexible validity periodCan extend before or after event dates
Example (VIP with After-Party):
{
"checkInValidUntil": "CUSTOM",
"customCheckInDate": "2025-12-18T02:00:00+03:00"
}
Event ends Dec 17 at 23:00, but VIP ticket valid until Dec 18 at 02:00 (after-party).
Purchase Limits Explained
minQuantityPerOrder
Minimum tickets required per purchase.
Default: 1
Use Cases:
minQuantityPerOrder: 2- Couples/pairs onlyminQuantityPerOrder: 5- Group bookings onlyminQuantityPerOrder: 1- Standard (anyone can buy)
maxQuantityPerOrder
Maximum tickets per single purchase.
Default: null (no limit)
Use Cases:
maxQuantityPerOrder: 5- Prevent bulk buyingmaxQuantityPerOrder: 10- Reasonable group sizemaxQuantityPerOrder: 2- Limit resellers
maxQuantityPerUser
Maximum tickets per user across all purchases.
Default: null (no limit)
Use Cases:
maxQuantityPerUser: 2- Limit high-demand eventsmaxQuantityPerUser: 10- Fair distributionmaxQuantityPerUser: 1- One per person (exclusive events)
Validation Rules
maxQuantityPerOrdermust be >=minQuantityPerOrdermaxQuantityPerUsermust be >=maxQuantityPerOrderIf onlymaxQuantityPerUserset, must be >=minQuantityPerOrder
Example Configurations:
Standard Ticket:
{
"minQuantityPerOrder": 1,
"maxQuantityPerOrder": 10,
"maxQuantityPerUser": 20
}
Group Only:
{
"minQuantityPerOrder": 5,
"maxQuantityPerOrder": 5,
"maxQuantityPerUser": 10
}
Limited Per Person:
{
"minQuantityPerOrder": 1,
"maxQuantityPerOrder": 2,
"maxQuantityPerUser": 2
}
Sales Period Management
Sales Period Rules
salesStartDateTime: Optional, defaults to ticket creation timesalesEndDateTime: Optional, defaults to event start timeBoth must be before event startsEnd must be after start
Use Cases
1. Phased Sales
// Early Bird Phase
{
"name": "Early Bird",
"salesEndDateTime": "2025-11-30T23:59:59+03:00"
}
// Regular Phase
{
"name": "Regular",
"salesStartDateTime": "2025-12-01T00:00:00+03:00"
}
2. Time-Limited Flash Sale
{
"name": "Flash Sale",
"salesStartDateTime": "2025-12-01T12:00:00+03:00",
"salesEndDateTime": "2025-12-01T18:00:00+03:00"
}
3. Last Minute Tickets
{
"name": "Last Minute",
"salesStartDateTime": "2025-12-14T00:00:00+03:00",
"salesEndDateTime": "2025-12-14T23:59:59+03:00"
}
isOnSale Calculation
Ticket isOnSale = true when ALL conditions met:
status = ACTIVEisDeleted = false!isSoldOut(tickets available)Current time >=salesStartDateTime(or null)Current time <=salesEndDateTime(or null)
Hybrid Events - Attendance Modes
Requirements for HYBRID Events
Must have at least 1 ACTIVE ticket withattendanceMode: IN_PERSONMust have at least 1 ACTIVE ticket withattendanceMode: ONLINECannot publish HYBRID event without both modes
Attendance Mode Rules
Required: For HYBRID events onlyOptional: For IN_PERSON and ONLINE events (ignored if provided)Values: IN_PERSON or ONLINEUniqueness: Name + AttendanceMode must be unique per event
Example: HYBRID Event Tickets
[
{
"name": "VIP Pass",
"price": 200.00,
"attendanceMode": "IN_PERSON",
"totalQuantity": 50
},
{
"name": "VIP Pass",
"price": 100.00,
"attendanceMode": "ONLINE",
"totalQuantity": 200
},
{
"name": "Regular",
"price": 100.00,
"attendanceMode": "IN_PERSON",
"totalQuantity": 300
},
{
"name": "Regular",
"price": 50.00,
"attendanceMode": "ONLINE",
"totalQuantity": 1000
}
]
Note: Same name "VIP Pass" allowed because attendance modes differ.
Inclusive Items
Purpose
List of perks, benefits, or items included with ticket purchase.
Rules
Maximum 50 items per ticketEach item max 200 charactersCannot be null or empty stringsDisplayed to attendees during purchase
Use Cases
VIP Ticket:
{
"inclusiveItems": [
"Backstage pass",
"Premium seating (front 3 rows)",
"Meet & greet with performers",
"Exclusive merchandise pack",
"Complimentary beverages",
"Access to VIP lounge",
"Reserved parking"
]
}
Conference Ticket:
{
"inclusiveItems": [
"Access to all sessions",
"Networking lunch (Day 1 & 2)",
"Conference materials & notebook",
"Certificate of attendance",
"6 months digital content access"
]
}
Workshop Ticket:
{
"inclusiveItems": [
"4-hour hands-on workshop",
"Toolkit & materials",
"Digital resources library",
"Follow-up Q&A session"
]
}
Event Publishing Requirements
Minimum Ticket Requirements
For IN_PERSON and ONLINE Events
Minimum:1 ACTIVE ticketCan have multiple ticket tiers (Early Bird, Regular, VIP)
For HYBRID Events
Minimum:1 ACTIVE IN_PERSON ticketMinimum:1 ACTIVE ONLINE ticketTotal minimum:2 ACTIVE tickets(one of each mode)
Pre-Publish Validation
When attempting to publish an event, the system validates:
Ticket Existence: At least minimum required tickets existTicket Status: Tickets are in ACTIVE statusNot Deleted: Tickets are not soft deletedAttendance Modes: HYBRID events have both IN_PERSON and ONLINE
Example Error (HYBRID event missing ONLINE ticket):
{
"success": false,
"httpStatus": "UNPROCESSABLE_ENTITY",
"message": "HYBRID events must have at least 1 active ONLINE ticket before publishing",
"action_time": "2025-12-11T10:30:45",
"data": "HYBRID events must have at least 1 active ONLINE ticket before publishing"
}
Quick Reference Guide
Common HTTP Status Codes
-
Code Meaning 200 OK:Successful requestGET,- PATCH, or DELETE
201CREATEDCreated:TicketSuccessful createdPOSTsuccessfully(ticket- created)
400 Bad Request:Validation errors, businessBusiness rule violationsviolated- (e.g. not DRAFT, already sold, duplicate name)
401 Unauthorized:AuthenticationMissing required/failedor- invalid token
403 Forbidden:NotAuthenticated but not the event organizer 404 Not Found:Ticket/eventEvent or ticket does not foundexist422 Unprocessable Entity:Validation errors 500onInternalrequestServerfieldsError:Servererror Dates:ISO8601Rule withDetail timezone(2025-12-15T18:00:00+03:00)IDs:UUIDformatCreate/Update Price: Decimal with 2 decimal places (150.00)Currency: TZS (Tanzanian Shilling)Quantity: Integer (positive numbers)Ticket Creation Checklist✅Event ismust be inDRAFTstatus✅
ChooseuniqueCapacity nameUpdate(+Works attendanceonmode for HYBRID) PUBLISHED✅ Set priceDRAFT andquantity✅eventsDefinesalesperiodStatus (optional)Update✅Works ConfigureonpurchaseDRAFTlimitsand✅PUBLISHEDSeteventsFREE ticket validityPrice typemust✅beAddexactlyinclusive0.00items(optional)✅PAID SetticketattendancePrice modemust(requiredbeforgreaterHYBRID)than0.00BestPracticesPricingDONATION Strategy:ticketEarlychannelbird:only.20-30% discountRegular: Standard priceVIP: 2-3x regular priceStudent: 40-50% discountEarly Bird: 1-2 months before eventRegular: UntilMax 1day before eventLast Minute: Final 24-48 hoursStandard events: max 10per orderHigh-demand events: max 2and per userGroup
ONLINE_ONLYCapacity Planning:Sales Periods:Purchase Limits:tickets:minHYBRID 5,eventmaxMust 5haveper≥order1IN_PERSON
≥ErrorticketHandlingandTips- 1
422ONLINEErrors:ticketChecktovalidationpublish
rulesforeachDelete field400 Draft Status:Only createallowedticketsifforticketsSoldDRAFT=events0400DuplicateName:SOLD_OUT Use different name or attendance mode400System-managed. Cannot Delete:beUsesetCLOSEmanually.statusAuto-clearedinsteadwhen400capacityCapacityisError:increasedCLOSED Permanent. Cannot reducebebelowreversedsoldcount
DataBusiness FormatRule StandardsCheat Sheet
Common Mistakes to Avoid
❌ Creating tickets for PUBLISHED events
❌ Missing attendance mode for HYBRID events
❌ Sales period after event start
❌ maxPerOrder < minPerOrder
❌ Trying to delete tickets with sales
❌ Manually setting SOLD_OUT status
❌ Changing CLOSED ticket status