Conventions
Pagination
List endpoints return:
{
"results": [ ... ],
"count": 42
}
Use the page query parameter. Default page size is 20 (config/publicApi.default_page_size).
GET /api/v1/events?page=2
Money amounts
| Context | Format |
|---|---|
Ticket price and booking_fee on create/update | Integers in minor units (pence, cents, etc.) |
| Cart and order totals | Strings (JSON has no exact decimal type) |
Example: £25.00 ticket → "price": 2500
Date and time
All datetimes in the Storefront API use UTC.
Request bodies (write)
| Field | Format | Example |
|---|---|---|
Event start, end | Y-m-d H:i:s string (UTC, no offset) | 2026-07-01 18:00:00 |
Discount start, end | ISO 8601 string (UTC) | 2026-07-01T18:00:00Z |
Device PIN expires_at | ISO 8601 string (UTC) | 2026-12-31T23:59:59Z |
Cart expires_at | Unix timestamp (integer, UTC) | 1718467200 |
Event create/update does not accept ISO 8601 or timezone offsets for start/end — use the fixed Y-m-d H:i:s format above. Values are interpreted as UTC (the application default timezone).
Responses (read)
| Field | Format |
|---|---|
Event start, end | Unix timestamp (integer, UTC) |
Event timezone | IANA display timezone (e.g. Europe/London) — for presentation only |
Cart expires_at, created_at | Unix timestamp (integer, UTC) |
Discount start, end | ISO 8601 string (UTC) |
Device PIN expires_at | Unix timestamp (integer, UTC) or null |
created_at, updated_at on most resources | Unix timestamp (integer, UTC) |
When integrating checkout, treat response timestamps as UTC instants. Use the event's timezone field only when displaying dates to customers.
Errors
Validation and business errors usually return 400, 422, or 409 with:
{
"errors": {
"field_name": ["Human-readable message"]
}
}
Nested fields use dot notation, e.g. customer.email or items.0.ticket_id.
Content type
Send JSON bodies with:
Content-Type: application/json
Accept: application/json