Event endpoints
Both endpoints are unauthenticated, read-only GETs, scoped to one venue by the {slug} path segment. The JSON below comes straight from test-asserted fixtures: real API output, not hand-maintained examples.
List events
GET /t/{slug}/api/eventsReturns the venue's publicly listed events, soonest first, 12 to a page: published events plus cancelled events the venue still lists, dated today or later in the venue's timezone. Responses are wrapped in the pagination envelope described in the introduction.
curl -s https://platypus.tickets/t/nbt/api/events{
"data": [
{
"type": "events",
"id": "1",
"attributes": {
"title": "An Evening of One-Act Plays",
"slug": "an-evening-of-one-act-plays-2030-03-14",
"category": "Drama",
"event_date": "2030-03-14T00:00:00.000000Z",
"event_time": "19:30:00",
"date_mode": "single",
"occurrence_count": 0,
"next_occurrence": null,
"occurrences": [],
"description": "Four short plays from local writers, performed back to back with one interval.",
"location": "Main Stage",
"over_18": false,
"publish_status": "published",
"tickets_enabled": true,
"show_images": true,
"small_image_path": null,
"cancellation_reason": null,
"cancelled_at": null,
"ticket_office": {
"status": "open",
"reason": null,
"closes_at": null,
"closed_at": null,
"message": null
}
},
"links": {
"self": "https://platypus.tickets/t/nbt/api/events/1"
}
},
{
"type": "events",
"id": "2",
"attributes": {
"title": "The Long Run",
"slug": "the-long-run-2030-04-05",
"category": "Comedy",
"event_date": "2030-04-05T00:00:00.000000Z",
"event_time": "19:30:00",
"date_mode": "multiple",
"occurrence_count": 3,
"next_occurrence": {
"occurrence_date": "2030-04-05",
"time_label": "7:30 PM",
"location_label": "Main Stage",
"status": "scheduled"
},
"occurrences": [
{
"occurrence_date": "2030-04-05",
"time_label": "7:30 PM",
"location_label": "Main Stage",
"status": "scheduled"
},
{
"occurrence_date": "2030-04-06",
"time_label": "7:30 PM",
"location_label": "Main Stage",
"status": "scheduled"
},
{
"occurrence_date": "2030-04-07",
"time_label": "2:00 PM",
"location_label": "Main Stage",
"status": "scheduled"
}
],
"description": "A three-night season of our award season favourite.",
"location": "Main Stage",
"over_18": false,
"publish_status": "published",
"tickets_enabled": true,
"show_images": true,
"small_image_path": null,
"cancellation_reason": null,
"cancelled_at": null,
"ticket_office": {
"status": "open",
"reason": null,
"closes_at": null,
"closed_at": null,
"message": null
}
},
"links": {
"self": "https://platypus.tickets/t/nbt/api/events/2"
}
}
],
"links": {
"first": "https://platypus.tickets/t/nbt/api/events?page=1",
"last": "https://platypus.tickets/t/nbt/api/events?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "https://platypus.tickets/t/nbt/api/events?page=1",
"label": "1",
"page": 1,
"active": true
},
{
"url": null,
"label": "Next »",
"page": null,
"active": false
}
],
"path": "https://platypus.tickets/t/nbt/api/events",
"per_page": 12,
"to": 2,
"total": 2
}
}Get one event
GET /t/{slug}/api/events/{id}{id} is the numeric event id: take it from the id in the index response, or follow the links.self URL directly. Unknown ids, drafts, private events, and hidden-cancelled events all return 404.
curl -s https://platypus.tickets/t/nbt/api/events/1{
"data": {
"type": "events",
"id": "1",
"attributes": {
"title": "An Evening of One-Act Plays",
"slug": "an-evening-of-one-act-plays-2030-03-14",
"category": "Drama",
"event_date": "2030-03-14T00:00:00.000000Z",
"event_time": "19:30:00",
"date_mode": "single",
"occurrence_count": 0,
"next_occurrence": null,
"occurrences": [],
"description": "Four short plays from local writers, performed back to back with one interval.",
"location": "Main Stage",
"over_18": false,
"publish_status": "published",
"tickets_enabled": true,
"show_images": true,
"small_image_path": null,
"cancellation_reason": null,
"cancelled_at": null,
"ticket_office": {
"status": "open",
"reason": null,
"closes_at": null,
"closed_at": null,
"message": null
}
},
"links": {
"self": "https://platypus.tickets/t/nbt/api/events/1"
}
}
}Attributes
| Attribute | Type | Notes |
|---|---|---|
title | string | Event title |
slug | string | URL slug of the public event page (/t/{slug}/events/{event-slug}) |
category | string | Venue-chosen category label (e.g. Drama) |
event_date | string | Event date as a datetime string. For multiple-mode events this mirrors the current/next stop and advances as stops pass |
event_time | string | HH:MM:SS. Mirrors the current stop for multiple-mode events |
date_mode | string | single or multiple |
occurrence_count | integer | Number of stops. Always 0 for single-mode events |
next_occurrence | object | null | Compact occurrence the venue is pointing at now (see below); null in single mode |
occurrences | array | All stops in date order (see below). Empty ([]) for single-mode events |
description | string | Event description; may contain HTML authored in the admin editor |
location | string | Venue/location label |
over_18 | boolean | Age-restriction flag |
publish_status | string | published or cancelled (drafts are never returned) |
tickets_enabled | boolean | Whether ticketing is configured for the event. Read ticket_office for whether online sales are open right now |
show_images | boolean | Whether the venue wants event imagery shown |
small_image_path | string | null | Path of the event image, or null |
cancellation_reason | string | null | Set when publish_status is cancelled |
cancelled_at | string | null | ISO-8601 timestamp of cancellation |
ticket_office | object | Whether online sales are open right now, and if not, why (see below) |
Ticket Office
The ticket_office object says whether the venue's online sales for the event are open at the moment of the request. Render your own buy affordance from status rather than from publish_status and tickets_enabled, which describe configuration, not sellability.
| Field | Type | Notes |
|---|---|---|
status | string | open or closed |
reason | string | null | null while open. While closed: manual (the venue closed it), scheduled (a scheduled closure fired), event_ended (a single-date event's day has passed), cancelled, or not_ticketed |
closes_at | string | null | ISO-8601 UTC instant of a scheduled closure, present while one is pending or after it fired |
closed_at | string | null | ISO-8601 UTC instant the office closed, for manual and scheduled |
message | string | null | The venue's plain-text line for buyers, only while reason is manual or scheduled. Escape it before rendering |
While a closure is pending, status stays open and closes_at carries the deadline, so a consumer can show it ahead of time.
Multi-date events
When a venue schedules an event across several dates (date_mode: "multiple"), every stop is embedded in the event itself. There is no separate occurrences endpoint to call. Each compact occurrence carries occurrence_date (YYYY-MM-DD), time_label, location_label, and status (scheduled or cancelled). next_occurrence points at the nearest upcoming stop, and the flat event_date/event_time mirror it.
curl -s https://platypus.tickets/t/nbt/api/events/2{
"data": {
"type": "events",
"id": "2",
"attributes": {
"title": "The Long Run",
"slug": "the-long-run-2030-04-05",
"category": "Comedy",
"event_date": "2030-04-05T00:00:00.000000Z",
"event_time": "19:30:00",
"date_mode": "multiple",
"occurrence_count": 3,
"next_occurrence": {
"occurrence_date": "2030-04-05",
"time_label": "7:30 PM",
"location_label": "Main Stage",
"status": "scheduled"
},
"occurrences": [
{
"occurrence_date": "2030-04-05",
"time_label": "7:30 PM",
"location_label": "Main Stage",
"status": "scheduled"
},
{
"occurrence_date": "2030-04-06",
"time_label": "7:30 PM",
"location_label": "Main Stage",
"status": "scheduled"
},
{
"occurrence_date": "2030-04-07",
"time_label": "2:00 PM",
"location_label": "Main Stage",
"status": "scheduled"
}
],
"description": "A three-night season of our award season favourite.",
"location": "Main Stage",
"over_18": false,
"publish_status": "published",
"tickets_enabled": true,
"show_images": true,
"small_image_path": null,
"cancellation_reason": null,
"cancelled_at": null,
"ticket_office": {
"status": "open",
"reason": null,
"closes_at": null,
"closed_at": null,
"message": null
}
},
"links": {
"self": "https://platypus.tickets/t/nbt/api/events/2"
}
}
}Hitting CORS errors when you call these endpoints from a browser? The CORS rules in the introduction explain which origins are allowed and where the fix lives.
