API Reference Changelog

Let's Do This API — Changelog (0.1.0)

Download OpenAPI specification:

Consumer-visible changes to the public API.

July 2026

Delete an imported booking

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.


Breaking: the external-booking-id lookup returns a list

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.


Standardise event-occurrences list pagination

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.


Paginate the races, tickets, and reserved-entry-groups lists

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.


Read a single event occurrence

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.


June 2026

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.


Read a single race

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.


Find the booking forms that use a field

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.


Read booking form fields

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.


Read booking forms

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.


Read individual tickets and a race's tickets

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.


Races by event occurrence

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.


May 2026

Application notes

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.

Participant booking source

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.

GivenGain partner lookup

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.

Team roles on participants

2026-05-20

When ?features=teams is enabled, participant team objects include roles with the participant's team role descriptions.

Clearer errors for invalid IDs

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.


April 2026

Implied donation field on applications

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.


March 2026

Charity opt-in partner names

2026-03-11

Participant charityOptIn values return partner names instead of opaque partner IDs where the partner can be resolved.