Skip to content

Events

Operator endpoints for running events: create and edit an event, move it through its lifecycle, request an app listing, read stats and the door list, and manage the event’s ticket types. All routes require the operator role (client); stats, bookings and conflict-check also accept an organiser.

Method Path Purpose Auth
GET /api/my-events List events across your venues operator
GET /api/my-venues/:id/events List events for one venue operator
GET /api/my-events/:id Get one event operator
POST /api/my-events Create an event operator
PUT /api/my-events/:id Update an event operator
PATCH /api/my-events/:id/status Set status (approved/draft/cancelled/rejected) operator
POST /api/my-events/:id/approve Approve a pending/rejected event operator
POST /api/my-events/:id/reject Reject an event operator
POST /api/my-events/:id/request-listing Request the in-app listing operator
POST /api/my-events/:id/withdraw-listing Withdraw a pending listing operator
DELETE /api/my-events/:id Delete an event (no bookings) operator
GET /api/my-events/:id/stats Aggregate stats for an event operator
GET /api/my-events/:id/bookings Bookings/door list for an event operator
GET /api/my-events/:id/cancellation-preview Preview the impact of cancelling (bookings, guests, refund total, keys to return) operator
GET /api/events/conflict-check Check for a same-day event clash operator
POST /api/my-events/image Upload a cover image operator
POST /api/my-events/generate-image Generate a cover image (Unsplash) operator
GET /api/my-events/:eventId/ticket-types List ticket types operator
POST /api/my-events/:eventId/ticket-types Create a ticket type operator
PUT /api/my-events/:eventId/ticket-types/:ticketId Update a ticket type operator
DELETE /api/my-events/:eventId/ticket-types/:ticketId Delete a ticket type operator

Fetch events across every venue you can access (paginated), or scope to one venue with /api/my-venues/:id/events.

Terminal window
curl "https://thesidedoor.co/api/my-events?page=1&limit=50" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN"
{
"data": [
{
"id": "evt_9f2",
"name": "Friday Rooftop Sessions",
"event_date": "2026-07-17",
"start_time": "21:00",
"end_time": "03:00",
"event_type": "club_night",
"status": "approved",
"visibility": "public",
"guest_list_capacity": 300,
"committed_guests": 128,
"venue_id": "ven_123",
"venue_name": "The Attic"
}
],
"total": 1,
"limit": 50,
"offset": 0,
"has_more": false
}

Fetch a single event you can access, including its full detail.

Terminal window
curl "https://thesidedoor.co/api/my-events/EVENT_ID" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN"
{
"event": {
"id": "evt_9f2",
"name": "Friday Rooftop Sessions",
"event_date": "2026-07-17",
"start_time": "21:00",
"end_time": "03:00",
"event_type": "club_night",
"status": "approved",
"visibility": "public",
"app_listing_status": "pending",
"guest_list_capacity": 300,
"free_guestlist_enabled": 1,
"venue_id": "ven_123",
"venue_name": "The Attic"
}
}

Create a ticketed event on one of your venues. venue_id, name and event_date are required; the venue is fixed once created. Set status: "approved" to publish immediately, otherwise it is saved as a draft. event_mode is always ticketed.

Two optional listing flags control where a live event appears (both default to true):

  • list_widget - visibility is public by default. Pass list_widget: false to make it private, which hides the event from the public booking widget, the events list, and guest discovery. A direct booking link still resolves.
  • list_sidedoor_app - when true, a live event automatically requests a listing in the Sidedoor guest app (app_listing_status becomes pending). Pass list_sidedoor_app: false to skip that request. A draft never requests a listing until it goes live.

You can also attach admission and guest-list behaviour with two optional fields: event_profile_id links an event access profile, and guest_list_profile_id attaches a guest-list profile. Attaching a guest-list profile turns on the free guest list (free_guestlist_enabled) in the response.

Terminal window
curl -X POST "https://thesidedoor.co/api/my-events" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"venue_id": "VENUE_ID",
"name": "Friday Rooftop Sessions",
"event_date": "2026-07-17",
"start_time": "21:00",
"end_time": "03:00",
"last_entry_time": "01:00",
"event_type": "club_night",
"event_genre": "house",
"description": "Resident DJs on the rooftop.",
"guest_list_capacity": 300,
"status": "approved"
}'
{ "success": true, "id": "evt_9f2", "cancelled_bookings": 0 }

Multiple events are allowed on the same venue and date, so create never returns a conflict error. To warn a user about a same-day clash before creating or editing, call /api/events/conflict-check first (see Conflict check).

Same fields as create, minus venue_id. Date/time changes are blocked once bookings exist, capacity cannot drop below the committed count, and a live event with committed guests cannot be flipped back to draft.

Terminal window
curl -X PUT "https://thesidedoor.co/api/my-events/EVENT_ID" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Rooftop Sessions - Summer Finale","guest_list_capacity":350}'
{ "success": true }

Set an event’s status directly. Valid values are approved, draft, cancelled and rejected. Changing status while active bookings exist returns 409; cancelled cascades to cancel and refund every attached booking.

Terminal window
curl -X PATCH "https://thesidedoor.co/api/my-events/EVENT_ID/status" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status":"cancelled"}'
{ "success": true, "status": "cancelled" }

When an event was submitted by a promoter it arrives as pending_venue_approval. Approve it to publish, or reject it. Neither call takes a body.

Terminal window
curl -X POST "https://thesidedoor.co/api/my-events/EVENT_ID/approve" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN"
curl -X POST "https://thesidedoor.co/api/my-events/EVENT_ID/reject" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN"
{ "success": true, "cancelled_bookings": 0 }

An approved event can request a listing in the Sidedoor guest app. Withdraw removes a listing while it is still pending.

Terminal window
curl -X POST "https://thesidedoor.co/api/my-events/EVENT_ID/request-listing" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN"
{ "app_listing_status": "pending" }

Deletes a draft or unpublished event. Blocked with 409 if any bookings exist.

Terminal window
curl -X DELETE "https://thesidedoor.co/api/my-events/EVENT_ID" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN"
{ "success": true }

GET /api/my-events/:id/stats returns aggregate counts and revenue; GET /api/my-events/:id/bookings returns the event’s booking/door list.

Terminal window
curl "https://thesidedoor.co/api/my-events/EVENT_ID/stats" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN"
{
"capacity": 300,
"event_mode": "ticketed",
"total_bookings": 142,
"active_bookings": 128,
"approved": 120,
"pending": 8,
"checked_in": 96,
"cancelled": 10,
"committed_guests": 128,
"revenue": 384000,
"timeline": [{ "date": "2026-07-10", "count": 24 }],
"recent": [
{ "id": "bkg_a1", "status": "approved", "guest_count": 4, "user_name": "Sam Lee" }
]
}

Before cancelling an event, preview the impact: how many bookings and guests are affected, the total card money that would be refunded (in pence), and how many keys would be returned to guests. This is read-only and changes nothing.

Terminal window
curl "https://thesidedoor.co/api/my-events/EVENT_ID/cancellation-preview" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN"
{
"event_name": "Friday Rooftop Sessions",
"booking_count": 12,
"guest_count": 44,
"refund_pence": 66000,
"keys_to_return": 8
}

Before scheduling, check whether an event already occupies a venue on a date. Pass exclude_event_id when editing an existing event.

Terminal window
curl "https://thesidedoor.co/api/events/conflict-check?venue_id=VENUE_ID&date=2026-07-17" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN"
{
"has_event_conflict": true,
"events": [{ "id": "evt_1", "name": "Jazz Night", "status": "approved" }],
"affected_bookings": 3,
"affected_guests": 11
}

Upload a base64 data-URL (max 2 MB) with POST /api/my-events/image, or generate one from Unsplash with POST /api/my-events/generate-image. Put the returned url into the event’s image_url.

Terminal window
curl -X POST "https://thesidedoor.co/api/my-events/generate-image" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Friday Rooftop Sessions","event_type":"club_night"}'
{
"success": true,
"url": "https://images.unsplash.com/photo-...",
"attribution": {
"photographer": "Jane Doe",
"photographer_url": "https://unsplash.com/@janedoe",
"unsplash_url": "https://unsplash.com/photos/..."
}
}

Each ticketed event has one or more ticket types. Prices are in pence; a null capacity means unlimited. admission_rule_group_id and ticket_profile_id link a ticket to admission rules and an access profile.

Terminal window
curl "https://thesidedoor.co/api/my-events/EVENT_ID/ticket-types" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN"
{
"data": [
{
"id": "tkt_a1",
"event_id": "evt_9f2",
"name": "General Admission",
"price_pence": 1500,
"capacity": 200,
"sort_order": 0
}
]
}

name is required; everything else is optional.

Terminal window
curl -X POST "https://thesidedoor.co/api/my-events/EVENT_ID/ticket-types" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"General Admission","price_pence":1500,"capacity":200,"sort_order":0}'
{ "success": true, "id": "tkt_a1" }

PUT takes the same body as create (name required); DELETE takes no body.

Terminal window
curl -X PUT "https://thesidedoor.co/api/my-events/EVENT_ID/ticket-types/TICKET_ID" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Early Bird","price_pence":1000,"capacity":50}'
curl -X DELETE "https://thesidedoor.co/api/my-events/EVENT_ID/ticket-types/TICKET_ID" \
-H "Authorization: Bearer $SIDEDOOR_TOKEN"
{ "success": true }