Download OpenAPI specification:
Consumer-visible changes to the public API.
2026-07-27
DELETE /v0/bookings/{id} retires a booking you imported through the Public API, so you can correct a bad row and import it again under the same externalBookingId.
The booking is not removed: it moves to CANCELLED and stays readable. The external id it was imported under is freed at the same time, so re-importing that id creates a new booking rather than reporting alreadyImported. Deleting is idempotent — deleting an already-deleted booking succeeds and changes nothing.
Only bookings whose source is API can be deleted. Anything else returns 403, and a booking that does not exist or belongs to another organizer returns 404.
2026-07-27
GET /v0/bookings/external/{externalBookingId} now returns a PagedBookingSummaries envelope instead of a single Booking, and an id that matches nothing returns an empty list with 200 rather than 404.
One external id can legitimately match more than one booking — correcting an import cancels the original and re-imports it, so both survive under the id you supplied. The previous shape had to choose one on your behalf and could not show you the other. Results are oldest first, matching the other list endpoints, so the most recent match is last. The endpoint accepts the standard page[size], page[after] and page[before] params.
The summaries are BookingSummary rather than the full Booking the endpoint used to return, matching the other list endpoints; use GET /v0/bookings/{id} to fetch one in full.
2026-07-02
GET /v0/event-occurrences now accepts the standard page[size], page[after], and page[before] query params, matching the other list endpoints. The legacy pageSize, cursor[after], and cursor[before] params continue to work but are deprecated. The response schema is renamed to PagedOrganizerEventOccurrenceSummaries; the previous EventOccurrencesResponse name remains as a deprecated alias.
2026-07-01
The races list (GET /v0/event-occurrences/{id}/races), the event tickets list (GET /v0/events/{id}/tickets), and the reserved entry groups list (GET /v0/events/{id}/reserved-entries) now return a page cursor alongside data and accept page[size], page[after] and page[before], matching the other list endpoints. All continue to return every item by default, so existing integrations are unaffected. The response schemas are renamed to PagedRaceSummaries, PagedTickets, and PagedReservedEntryGroups; the previous Races, Tickets, and ReservedEntryGroups schema names remain as deprecated aliases.
2026-07-01
You can retrieve an individual event occurrence with GET /v0/event-occurrences/{id}. Access is scoped to the organizer associated with your Public API credentials.
2026-06-30
GET /v0/races/{id} now includes eventOccurrenceId and eventId, so you can navigate from a race back to its event occurrence and event. These fields are returned on the single-race response; the race lists stay lean.
2026-06-30
You can retrieve an individual race with GET /v0/races/{id}. Access is scoped to the organizer that owns the race's event occurrence.
2026-06-30
You can look up which booking forms reference a given field with GET /v0/booking-form-fields/{id}/booking-forms. A field can be shared across many forms, so this returns a paginated list.
2026-06-30
You can read the individual questions on a booking form. Use GET /v0/booking-form-fields to list fields, GET /v0/booking-form-fields/{id} to fetch one, and GET /v0/booking-forms/{id}/fields to list the fields on a specific form. Each field exposes its type, label, options, and whether an answer is required.
2026-06-30
You can retrieve a single booking form with GET /v0/booking-forms/{id}, and traverse between tickets and their booking forms: GET /v0/tickets/{id}/booking-forms lists the booking forms a ticket uses (usually zero or one), and GET /v0/booking-forms/{id}/tickets lists the tickets that share a booking form.
2026-06-30
You can retrieve a single ticket with GET /v0/tickets/{id}, and list the tickets belonging to a race with GET /v0/races/{id}/tickets. Ticket titles now include a titleByLocale map, always seeded with the default (en-GB) title alongside any translations.
2026-06-01
You can retrieve races for an event occurrence. Use GET /v0/event-occurrences/{id}/races if your integration needs race-level data.
2026-05-26
Application responses include stand-alone notes added from the dashboard. Use the notes field on application responses to read notes that are not approval or rejection reasons.
2026-05-26
Participant responses include bookingSource. Use this field to distinguish bookings made through Let's Do This from participants imported from an external platform.
2026-05-22
Partner lookups can use givenGain as an external ID type. Use externalId=givenGain when you need to query partners by their GivenGain identifier.
2026-05-20
When ?features=teams is enabled, participant team objects include roles with the participant's team role descriptions.
2026-05-08
Requests with a malformed resource ID in the path (for example GET /v0/participants/not-a-valid-id) now return 404 Not Found instead of 500 Internal Server Error.
2026-04-14
Applications for tickets where donation is implied by the ticket include a synthetic hasDonated field, so integrations receive the same shape as tickets that ask the donation question directly.