API Reference Changelog

Let's Do This API (0.1.0)

Download OpenAPI specification:

Welcome to the Let's Do This API reference!

Let's Do This spans a broad range of products that help you make incredible experiences for your participants.

These docs will help you interact with the REST API to manage your events, communicate with your particpants, export your start list data, and much more!

Getting started

The Let's Do This API provides a REST interface for much of the data essential for the day-to-day operation of planning, promoting and running an event.

To use the API, you need an API Key. To generate one, go to the settings / credentials tab in your account.

Authentication

The API uses signed JSON Web Tokens (JWTs). These tokens are not encrypted, and the contents can be read by anyone. Rather, a signed token can be used to verify the integrity of claims contained within the token. For example, your token may contain your Organiser ID. And even though anybody with access to your token can read the claims contained within it, they are unable to modify those claims without destroying the integrity of the token.

Because JWTs are not encrypted, your API Key should be treated like any other secret. Do not share it with others, and do not use it in any software shipped to the public — for example, a website or native app.

Authenticating Requests

The REST API requires you to authenticate requests to fetch information about your events. If you are not authenticated, the API will not return any information.

You can authenticate your request by sending a token in the Authorization header of your request. In the following example, replace YOUR-API-KEY with a reference to your API Key:

curl --request GET \
 --url "https://api.letsdothis.com/v0/applications" \
 --header "Authorization: Bearer YOUR-API-KEY"

Revoking Keys

If you believe your API Key has been shared with a third party who should not have access to your data, you can invalidate the key in your account settings.

Error Codes

There are a number of error codes that can be returned by the API. These are detailed below.

HTTP Code Description Notes
200 OK Your request completed successfully.
401 Unauthorized A 401 Unauthorized response means you have not authenticated correctly. Check you have added your API Key. Instructions on how to do so can be found here.
500 Internal Server Error The API encountered an internal error and was unable to response to your request. If the problem persists, please contact your Partner Success Manager.

Response Data

Successful requests to the API will generate a response in JSON format.

Paginated responses

When querying a list of entities, the response will be wrapped in a top-level object, and the result of the query will be returned in the value of the data property on that object.

In addition, responses will contain a page property which contains data about the current page.

{
  "data": [
    {
      "id": "6399c20015d60ae3ff28f24c",
      ...
    }
  ],
  "page": {
    "totalResults": 1,
    "first": "6399c20015d60ae3ff28f24c",
    "last": "64577f3fa6449247e0322e8e",
    "prev": "6399c20015d60ae3ff28f24c",
    "next": "6399c20015d60ae3ff28f24c"
  }
}

In this response the first, last, prev and next properties are cursors that can be used to navigate to earlier or later pages in the set of results. For instance, using the next cursor from fetches the next set of results. See more details on specific endpoints.

Optional features

Several endpoints accept a features query parameter that lets you opt into additional fields and behaviors per request — for example, ?features=tags,waves. See the parameter description on the relevant endpoint (e.g. GET /v0/participants) for the full list of available features and what each one adds.

Quickstarts

No Code

The easiest way to get started querying the API is to use a tool like RapidAPI or Postman.

You can either set up the requests yourself or use our generated OpenAPI schema and import it to both tools.

Import OpenAPI schema

Step 1: Download our OpenAPI schema

Can access it at the top of this documentation or by accessing it here.

Step 2: Import it to your preferred tool

Example guides:

Step 4: Submit

Now you should have access to all our endpoints and can start using your tool to make requests. Remember to also set your API KEY in the Authorization Header!

Manual set up

Step 1: Set URL

First, set the URL to https://api.letsdothis.com/v0/participants.

Step 2: Include Credentials

Set an Authorization Header in the Headers tab:

Including Credentials

Step 3: Submit

And that's it! Now submit your request, and the API will return the first page of Participants in your account.

cURL

cURL is a command line utility available on most Linux and Unix like systems as well as Windows. It allows you to make network requests to a remote server (like the Let's Do This Public API) from your terminal.

You can send a GET request to the API in the following manner:

curl --request GET \
 --url "https://api.letsdothis.com/v0/applications" \
 --header "Authorization: Bearer YOUR-TOKEN"

Query parameters must be URL Encoded manually when using cURL. For example, setting the page size should look like:

curl --request GET \
 --url "https://api.letsdothis.com/v0/applications?page%3Fsize%5B=100" \
 --header "Authorization: Bearer YOUR-TOKEN"

and not

curl --request GET \
 --url "https://api.letsdothis.com/v0/applications?page[size]=100" \
 --header "Authorization: Bearer YOUR-TOKEN"

Node

There are many ways of fetching data over the network with Node and Typescript or Javascript. The snippet below shows one simple approach using Typescript.

const YOUR_TOKEN = 'xxxxxxxxxxxx';
const LDT_API_BASE_URL = 'https://api.letsdothis.com/v0';

enum Endpoint {
  Applications = '/applications',
  Participants = '/participants',
}

const getURLForEndpoint = (endpoint: Endpoint): URL => {
  return new URL(LDT_API_BASE_URL + endpoint);
};

const applicationsURL = getURLForEndpoint(Endpoint.Applications);
const applicationsResponse = await fetch(applicationsURL, {
  method: 'GET',
  headers: new Headers({
    Authorization: `Bearer ${YOUR_TOKEN}`,
  }),
});

if (applicationsResponse.ok) {
  const applications = await applicationsResponse.json();
  console.log(applications);
}

Applications

Applications are created when a user applies for tickets that are set up to require an application process, such as balloted or "Good For Age" entries.

Get applications

Returns all applications that you have access to

Authorizations:
bearerAuth
query Parameters
page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

sort[updatedAt]
string or null
Enum: 1 -1
Example: sort[updatedAt]=1

Sort by update date. 1 for ascending, -1 for descending.

sort[createdAt]
string or null
Enum: 1 -1
Example: sort[createdAt]=1

Sort by creation date. 1 for ascending, -1 for descending.

createdAt[after]
string or null <date-time>
Example: createdAt[after]=2020-01-01T20:15:00.000Z

Only return entries created after this date.

createdAt[before]
string or null <date-time>
Example: createdAt[before]=2020-01-01T20:15:00.000Z

Only return entries created before this date.

updatedAt[after]
string or null <date-time>
Example: updatedAt[after]=2020-01-01T20:15:00.000Z

Only return entries updated after this date.

updatedAt[before]
string or null <date-time>
Example: updatedAt[before]=2020-01-01T20:15:00.000Z

Only return entries updated before this date.

extendMetadata
boolean or null

If set to true, all available metadata is returned.

features
string or null
Example: features=tags,gdpr_redacted

A comma-separated list of optional features to enable for the request. Each feature extends the response with additional fields or behaviors.

  • tags — Exposes operational tags (e.g. "injured", "deferral") on each entry, enabling filtering and segmentation in consuming systems.
  • gdpr_redacted — Indicates whether an entry has been redacted following a GDPR request, so consuming systems can suppress it accordingly.
  • boolean_value — Provides a parsed boolean representation of agreement, confirmation, and yes/no answers on Field entries, removing the need for client-side string normalization.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Get an application by ID

Returns an application by ID if you have access to it

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
extendMetadata
boolean or null

If set to true, all available metadata is returned.

features
string or null
Example: features=tags,gdpr_redacted

A comma-separated list of optional features to enable for the request. Each feature extends the response with additional fields or behaviors.

  • tags — Exposes operational tags (e.g. "injured", "deferral") on each entry, enabling filtering and segmentation in consuming systems.
  • gdpr_redacted — Indicates whether an entry has been redacted following a GDPR request, so consuming systems can suppress it accordingly.
  • boolean_value — Provides a parsed boolean representation of agreement, confirmation, and yes/no answers on Field entries, removing the need for client-side string normalization.

Responses

Response samples

Content type
application/json
{
  • "id": "6399c20015d60ae3ff28f24c",
  • "participantIndex": 0,
  • "bookingId": "6399c20015d60ae3ff28f24c",
  • "transactionId": "6399c20015d60ae3ff28f24e",
  • "eventOccurrenceId": "6399c11c58f29f001ca95935",
  • "eventId": "2365756",
  • "raceId": "3517846101",
  • "ticketTitle": "10k Standard Entry",
  • "ticketId": "6399c11c58f29f001ca95934",
  • "createdAt": "2026-05-08T11:30:00.000Z",
  • "updatedAt": "2026-05-08T11:30:00.000Z",
  • "waves": [
    ],
  • "fields": [
    ],
  • "booker": {
    },
  • "bookerType": "PARTNER",
  • "originalTicketPrice": {
    },
  • "incrementalStatus": "INCREMENTAL",
  • "bibNumber": "string",
  • "bookingCodesUsed": {
    },
  • "reservedEntryUrl": "string",
  • "partnerMarketingOptIns": [
    ],
  • "tags": [
    ],
  • "gdprRedacted": true,
  • "statusDetails": [
    ],
  • "tracking": {
    },
  • "approvalStatus": "APPROVED",
  • "applicationResolutionType": "BALLOT",
  • "ballotDraw": "International Ballot Draw",
  • "notes": [
    ],
  • "eventName": "City Sprint Challenge",
  • "raceName": "string",
  • "raceStartDate": "2026-05-08T11:30:00.000Z",
  • "sportId": "string",
  • "distanceId": "string",
  • "distances": [
    ],
  • "disciplineLabel": "Running",
  • "course": {
    },
  • "eventLocation": {
    },
  • "competitorSize": 12293,
  • "reservedEntryGroupCode": "re_x-ga8ais3v4r",
  • "reservedEntryGroupName": "Charity Entries",
  • "reservedEntryPartnerExternalIds": {
    },
  • "reservedEntryPartnerName": "string"
}

Get applications by an event

Returns all applications associated with an event

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

sort[updatedAt]
string or null
Enum: 1 -1
Example: sort[updatedAt]=1

Sort by update date. 1 for ascending, -1 for descending.

sort[createdAt]
string or null
Enum: 1 -1
Example: sort[createdAt]=1

Sort by creation date. 1 for ascending, -1 for descending.

createdAt[after]
string or null <date-time>
Example: createdAt[after]=2020-01-01T20:15:00.000Z

Only return entries created after this date.

createdAt[before]
string or null <date-time>
Example: createdAt[before]=2020-01-01T20:15:00.000Z

Only return entries created before this date.

updatedAt[after]
string or null <date-time>
Example: updatedAt[after]=2020-01-01T20:15:00.000Z

Only return entries updated after this date.

updatedAt[before]
string or null <date-time>
Example: updatedAt[before]=2020-01-01T20:15:00.000Z

Only return entries updated before this date.

extendMetadata
boolean or null

If set to true, all available metadata is returned.

features
string or null
Example: features=tags,gdpr_redacted

A comma-separated list of optional features to enable for the request. Each feature extends the response with additional fields or behaviors.

  • tags — Exposes operational tags (e.g. "injured", "deferral") on each entry, enabling filtering and segmentation in consuming systems.
  • gdpr_redacted — Indicates whether an entry has been redacted following a GDPR request, so consuming systems can suppress it accordingly.
  • boolean_value — Provides a parsed boolean representation of agreement, confirmation, and yes/no answers on Field entries, removing the need for client-side string normalization.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Participants

Participants are users who successfully booked an event.

Get participants

Returns all participants that you have access to

Authorizations:
bearerAuth
query Parameters
page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

sort[updatedAt]
string or null
Enum: 1 -1
Example: sort[updatedAt]=1

Sort by update date. 1 for ascending, -1 for descending.

sort[createdAt]
string or null
Enum: 1 -1
Example: sort[createdAt]=1

Sort by creation date. 1 for ascending, -1 for descending.

createdAt[after]
string or null <date-time>
Example: createdAt[after]=2020-01-01T20:15:00.000Z

Only return entries created after this date.

createdAt[before]
string or null <date-time>
Example: createdAt[before]=2020-01-01T20:15:00.000Z

Only return entries created before this date.

updatedAt[after]
string or null <date-time>
Example: updatedAt[after]=2020-01-01T20:15:00.000Z

Only return entries updated after this date.

updatedAt[before]
string or null <date-time>
Example: updatedAt[before]=2020-01-01T20:15:00.000Z

Only return entries updated before this date.

extendMetadata
boolean or null

If set to true, all available metadata is returned.

features
string or null
Example: features=tags,waves

A comma-separated list of optional features to enable for the request. Each feature extends the response with additional fields or behaviors.

  • tags — Exposes operational tags (e.g. "injured", "deferral") on each entry, enabling filtering and segmentation in consuming systems.
  • gdpr_redacted — Indicates whether an entry has been redacted following a GDPR request, so consuming systems can suppress it accordingly.
  • boolean_value — Provides a parsed boolean representation of agreement, confirmation, and yes/no answers on Field entries, removing the need for client-side string normalization.
  • withdrawn_status — Returns the distinct "WITHDRAWN" status. When the feature is disabled, withdrawn entries are reported as "CANCELLED" for backwards compatibility.
  • status_details — Includes reasons and timestamps for status changes (deferrals, withdrawals, approval decisions), supporting audit trails and operational tooling.
  • race_day_details — Includes check-in time, waiver-signature time, and custom race-day fields.
  • result_submissions — Includes self-reported finish times (chip time and verification artifacts).
  • teams — Includes team membership, captain status, and team number, for team-based events.
  • waves — Includes start-wave assignments, for events that split the field into staggered starts.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Get a participant by ID

Returns a participant by ID if you have access to it

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
extendMetadata
boolean or null

If set to true, all available metadata is returned.

features
string or null
Example: features=tags,waves

A comma-separated list of optional features to enable for the request. Each feature extends the response with additional fields or behaviors.

  • tags — Exposes operational tags (e.g. "injured", "deferral") on each entry, enabling filtering and segmentation in consuming systems.
  • gdpr_redacted — Indicates whether an entry has been redacted following a GDPR request, so consuming systems can suppress it accordingly.
  • boolean_value — Provides a parsed boolean representation of agreement, confirmation, and yes/no answers on Field entries, removing the need for client-side string normalization.
  • withdrawn_status — Returns the distinct "WITHDRAWN" status. When the feature is disabled, withdrawn entries are reported as "CANCELLED" for backwards compatibility.
  • status_details — Includes reasons and timestamps for status changes (deferrals, withdrawals, approval decisions), supporting audit trails and operational tooling.
  • race_day_details — Includes check-in time, waiver-signature time, and custom race-day fields.
  • result_submissions — Includes self-reported finish times (chip time and verification artifacts).
  • teams — Includes team membership, captain status, and team number, for team-based events.
  • waves — Includes start-wave assignments, for events that split the field into staggered starts.

Responses

Response samples

Content type
application/json
{
  • "id": "6399c20015d60ae3ff28f24c",
  • "participantIndex": 0,
  • "bookingId": "6399c20015d60ae3ff28f24c",
  • "transactionId": "6399c20015d60ae3ff28f24e",
  • "eventOccurrenceId": "6399c11c58f29f001ca95935",
  • "eventId": "2365756",
  • "raceId": "3517846101",
  • "ticketTitle": "10k Standard Entry",
  • "ticketId": "6399c11c58f29f001ca95934",
  • "createdAt": "2026-05-08T11:30:00.000Z",
  • "updatedAt": "2026-05-08T11:30:00.000Z",
  • "waves": [
    ],
  • "fields": [
    ],
  • "booker": {
    },
  • "bookerType": "PARTNER",
  • "originalTicketPrice": {
    },
  • "incrementalStatus": "INCREMENTAL",
  • "bibNumber": "string",
  • "bookingCodesUsed": {
    },
  • "reservedEntryUrl": "string",
  • "partnerMarketingOptIns": [
    ],
  • "tags": [
    ],
  • "gdprRedacted": true,
  • "statusDetails": [
    ],
  • "tracking": {
    },
  • "applicationId": "6399c20015d60ae3ff28f24d",
  • "raceDayDetails": {
    },
  • "resultSubmission": {
    },
  • "team": {
    },
  • "participantId": "abed704b-76d0-4190-a0e7-95b1ec1e48fd",
  • "notes": [
    ],
  • "bookingSource": "INTERNAL",
  • "eventName": "City Sprint Challenge",
  • "raceName": "string",
  • "raceStartDate": "2026-05-08T11:30:00.000Z",
  • "sportId": "string",
  • "distanceId": "string",
  • "distances": [
    ],
  • "disciplineLabel": "Running",
  • "course": {
    },
  • "eventLocation": {
    },
  • "competitorSize": 12293,
  • "reservedEntryGroupCode": "re_x-ga8ais3v4r",
  • "reservedEntryGroupName": "Charity Entries",
  • "reservedEntryPartnerExternalIds": {
    },
  • "reservedEntryPartnerName": "string"
}

Update participant raceday fields

Updates a participant's bib number and race day custom fields. Note: Updates are processed asynchronously and may take a few moments to reflect in participant data.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

Request Body schema: application/json
required
bibNumber
string or null

The bib number to assign to the participant. Set to null to unset the bib number. Optional to allow custom-fields-only updates.

Array of objects

Custom race day fields to update. Each field must specify an id to identify the field.

Responses

Request samples

Content type
application/json
{
  • "bibNumber": "A1234",
  • "customFields": [
    ]
}

Response samples

Content type
application/json
{
  • "success": true,
  • "message": "Participant raceday fields updated successfully"
}

Get participants by a race

Returns all participants associated with a race

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
eventOccurrenceId
string or null
Example: eventOccurrenceId=1353673654

A search query to filter race participants by event occurrence id.

page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

sort[updatedAt]
string or null
Enum: 1 -1
Example: sort[updatedAt]=1

Sort by update date. 1 for ascending, -1 for descending.

sort[createdAt]
string or null
Enum: 1 -1
Example: sort[createdAt]=1

Sort by creation date. 1 for ascending, -1 for descending.

createdAt[after]
string or null <date-time>
Example: createdAt[after]=2020-01-01T20:15:00.000Z

Only return entries created after this date.

createdAt[before]
string or null <date-time>
Example: createdAt[before]=2020-01-01T20:15:00.000Z

Only return entries created before this date.

updatedAt[after]
string or null <date-time>
Example: updatedAt[after]=2020-01-01T20:15:00.000Z

Only return entries updated after this date.

updatedAt[before]
string or null <date-time>
Example: updatedAt[before]=2020-01-01T20:15:00.000Z

Only return entries updated before this date.

extendMetadata
boolean or null

If set to true, all available metadata is returned.

features
string or null
Example: features=tags,waves

A comma-separated list of optional features to enable for the request. Each feature extends the response with additional fields or behaviors.

  • tags — Exposes operational tags (e.g. "injured", "deferral") on each entry, enabling filtering and segmentation in consuming systems.
  • gdpr_redacted — Indicates whether an entry has been redacted following a GDPR request, so consuming systems can suppress it accordingly.
  • boolean_value — Provides a parsed boolean representation of agreement, confirmation, and yes/no answers on Field entries, removing the need for client-side string normalization.
  • withdrawn_status — Returns the distinct "WITHDRAWN" status. When the feature is disabled, withdrawn entries are reported as "CANCELLED" for backwards compatibility.
  • status_details — Includes reasons and timestamps for status changes (deferrals, withdrawals, approval decisions), supporting audit trails and operational tooling.
  • race_day_details — Includes check-in time, waiver-signature time, and custom race-day fields.
  • result_submissions — Includes self-reported finish times (chip time and verification artifacts).
  • teams — Includes team membership, captain status, and team number, for team-based events.
  • waves — Includes start-wave assignments, for events that split the field into staggered starts.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Partners

Partners that were created by the organization who can have Reserved Entries assigned to them.

Get a partner by ID

Returns a partner by ID if you have access to it. In case the partner's ID is unknown, querying by an external ID (Enthuse or JustGiving) is also possible by using eg. /v0/partners/:id?externalId=enthuse

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
externalId
string (PartnerExternalIdType)
Enum: "enthuse" "justGiving" "londonMarathon" "runForCharity" "givestar" "goFundraise" "givenGain"

Responses

Response samples

Content type
application/json
{
  • "id": "p_v7k8jsvoj2o",
  • "name": "National Charity",
  • "description": "Donec faucibus augue non pretium pellentesque.",
  • "type": "CHARITY",
  • "externalIds": {
    },
  • "contacts": [
    ],
  • "defaultMarketing": {
    },
  • "specificMarketings": [
    ],
  • "canCreateSubPartners": false,
  • "createdAt": "2023-10-14T11:30:00.000Z",
  • "updatedAt": "2024-09-14T11:30:00.000Z"
}

Update a partner by ID

Will update a partner either by ID or external ID

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
externalId
string (PartnerExternalIdType)
Enum: "enthuse" "justGiving" "londonMarathon" "runForCharity" "givestar" "goFundraise" "givenGain"
Request Body schema: application/json
required
name
string non-empty ^(\S).+$

The name of the partner.

description
string

The description of the partner.

object (PartnerExternalIds)

External IDs of the partner. These can be configured in the event's settings if needed.

object (PartnerMarketing)

Customize what participants see on the “Charity Opt-In” step on the registration form and on the charity marketing email.

Array of objects (SpecificPartnerMarketing)

Event specific marketing informations associated with this partner.

canCreateSubPartners
boolean

Whether this partner can create sub-partners.

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string",
  • "externalIds": {
    },
  • "defaultMarketing": {
    },
  • "specificMarketings": [
    ],
  • "canCreateSubPartners": true
}

Response samples

Content type
application/json
{
  • "id": "p_v7k8jsvoj2o",
  • "name": "National Charity",
  • "description": "Donec faucibus augue non pretium pellentesque.",
  • "type": "CHARITY",
  • "externalIds": {
    },
  • "contacts": [
    ],
  • "defaultMarketing": {
    },
  • "specificMarketings": [
    ],
  • "canCreateSubPartners": false,
  • "createdAt": "2023-10-14T11:30:00.000Z",
  • "updatedAt": "2024-09-14T11:30:00.000Z"
}

Get partners

Returns all partners that you have access to

Authorizations:
bearerAuth
query Parameters
search
string or null
Example: search=research

A search query to filter partners by their name. The query is case insensitive.

page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

sort[updatedAt]
string or null
Enum: 1 -1
Example: sort[updatedAt]=1

Sort by update date. 1 for ascending, -1 for descending.

sort[createdAt]
string or null
Enum: 1 -1
Example: sort[createdAt]=1

Sort by creation date. 1 for ascending, -1 for descending.

createdAt[after]
string or null <date-time>
Example: createdAt[after]=2020-01-01T20:15:00.000Z

Only return entries created after this date.

createdAt[before]
string or null <date-time>
Example: createdAt[before]=2020-01-01T20:15:00.000Z

Only return entries created before this date.

updatedAt[after]
string or null <date-time>
Example: updatedAt[after]=2020-01-01T20:15:00.000Z

Only return entries updated after this date.

updatedAt[before]
string or null <date-time>
Example: updatedAt[before]=2020-01-01T20:15:00.000Z

Only return entries updated before this date.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Create a partner

Creates a new partner

Authorizations:
bearerAuth
Request Body schema: application/json
required
name
required
string non-empty ^(\S).+$

The name of the partner.

description
string

The description of the partner.

object (PartnerExternalIds)

External IDs of the partner. These can be configured in the event's settings if needed.

type
string (PartnerType)
Enum: "CHARITY" "CORPORATE" "FRIENDS_AND_FAMILY" "MERCH_PARTNER" "SPONSOR"
required
Array of objects (PartnerContact) non-empty

The contacts associated with this partner.

object (PartnerMarketing)

Customize what participants see on the “Charity Opt-In” step on the registration form and on the charity marketing email.

Array of objects (SpecificPartnerMarketing)

Event specific marketing informations associated with this partner.

canCreateSubPartners
boolean

Whether this partner can create sub-partners.

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string",
  • "externalIds": {
    },
  • "type": "CHARITY",
  • "contacts": [
    ],
  • "defaultMarketing": {
    },
  • "specificMarketings": [
    ],
  • "canCreateSubPartners": true
}

Response samples

Content type
application/json
{
  • "id": "p_v7k8jsvoj2o",
  • "name": "National Charity",
  • "description": "Donec faucibus augue non pretium pellentesque.",
  • "type": "CHARITY",
  • "externalIds": {
    },
  • "contacts": [
    ],
  • "defaultMarketing": {
    },
  • "specificMarketings": [
    ],
  • "canCreateSubPartners": false,
  • "createdAt": "2023-10-14T11:30:00.000Z",
  • "updatedAt": "2024-09-14T11:30:00.000Z"
}

Create a claim link

Creates a claim link for a given partner or reserved entry group.

When providing a reservedEntryId, the claim link will point to the dashboard where the partner can manage their entries and allocate them.

Otherwise the claim link will point to the general partner dashboard, where partners can manage their general settings.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

Request Body schema: application/json
required
emailAddress
string <email>

The email address where the generated link will be sent.

reservedEntryId
string

Reserved entry ID.

Responses

Request samples

Content type
application/json
{
  • "emailAddress": "partner@letsdothis.com"
}

Response samples

Reserved Entries

Reserved Entries are entries that are reserved for a partner. After being assigned, the partner can then allocate these entries to participants.

Get reserved entry group by ID

Returns a specific reserved entry group

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

Responses

Response samples

Content type
application/json
{
  • "id": "re_abcd6ss01x8",
  • "name": "Lorem ipsum",
  • "description": "Nulla sed mi egestas, condimentum orci quis, pulvinar odio.",
  • "eventId": "11120888",
  • "partnerId": "p_abcdiqh2oa4",
  • "maxCapacity": 35,
  • "usedCapacity": 15,
  • "tickets": [
    ],
  • "type": "MULTI_USE",
  • "settings": {
    }
}

Update a reserved entry group

Will update a specific reserved entry group

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

Request Body schema: application/json
required
object

The settings of the Reserved Entry group.

Array of objects (ReservedEntryTicketInput) non-empty

Reserved entry settings for particular tickets.

name
string non-empty ^(\S).+$

The name of the Reserved Entry group.

maxCapacity
number >= 0

The maximum number of entries that can be reserved in this group.

description
string

The description of the Reserved Entry group.

Responses

Request samples

Content type
application/json
{
  • "settings": {
    },
  • "tickets": [
    ],
  • "name": "string",
  • "maxCapacity": 0,
  • "description": "string"
}

Response samples

Content type
application/json
{
  • "id": "re_abcd6ss01x8",
  • "name": "Lorem ipsum",
  • "description": "Nulla sed mi egestas, condimentum orci quis, pulvinar odio.",
  • "eventId": "11120888",
  • "partnerId": "p_abcdiqh2oa4",
  • "maxCapacity": 35,
  • "usedCapacity": 15,
  • "tickets": [
    ],
  • "type": "MULTI_USE",
  • "settings": {
    }
}

Delete a reserved entry group

Will remove a specific reserved entry group

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

Responses

Response samples

Content type
application/json
null

Get all reserved entry groups by event

Returns a paginated list of reserved entry groups associated with an event.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Create a new reserved entry group

Create a new reserved entry group under an event

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

Request Body schema: application/json
required
required
Array of objects (ReservedEntryTicketInput) non-empty

Reserved entry settings for particular tickets.

name
required
string non-empty ^(\S).+$

The name of the Reserved Entry group.

partnerId
string

The LDT ID of the partner this Reserved Entry group should be assigned. If omitted, the entries can be managed by the organizer only.

maxCapacity
required
number >= 0

The maximum number of entries that can be reserved in this group.

description
string

The description of the Reserved Entry group.

type
required
string (ReservedEntryGroupType)
Enum: "MULTI_USE" "SINGLE_USE" "UNKNOWN"

The type of the Reserved Entry group.

  • MULTI_USE — Links are generic, so you can send one link to all of your participants.
  • SINGLE_USE — Links are tied to a specific person’s email address and can only be used once, meaning only the intended person can enter.
object (ReservedEntryGroupSettings)

The settings of the Reserved Entry group.

Responses

Request samples

Content type
application/json
{
  • "tickets": [
    ],
  • "name": "string",
  • "partnerId": "string",
  • "maxCapacity": 0,
  • "description": "string",
  • "type": "MULTI_USE",
  • "settings": {
    }
}

Response samples

Content type
application/json
{
  • "id": "re_abcd6ss01x8",
  • "name": "Lorem ipsum",
  • "description": "Nulla sed mi egestas, condimentum orci quis, pulvinar odio.",
  • "eventId": "11120888",
  • "partnerId": "p_abcdiqh2oa4",
  • "maxCapacity": 35,
  • "usedCapacity": 15,
  • "tickets": [
    ],
  • "type": "MULTI_USE",
  • "settings": {
    }
}

Tickets

Tickets that are available for events.

Get tickets by a race

Returns a paginated list of tickets belonging to a given race. Results are scoped to the organizer associated with your Public API credentials.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Get a ticket by ID

Returns a single ticket by ID if it belongs to the organizer associated with your Public API credentials.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

Responses

Response samples

Content type
application/json
{
  • "id": "1300915742",
  • "title": "10k Standard Entry",
  • "titleByLocale": {
    },
  • "description": "Nulla sed mi egestas, condimentum orci quis, pulvinar odio.",
  • "ticketSlug": "1106607777",
  • "raceId": "11120888",
  • "raceTitle": "City Sprint Challenge",
  • "price": {
    }
}

Get tickets by an Event

Returns a paginated list of available tickets associated with an event.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

LineItems

Financial details related to individual items within transactions.

LineItem by ID

Returns a LineItem by ID

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
source
string or null
Value: "mongodb"

Data source. When set to "mongodb", reads from the MongoDB collection.

Responses

Response samples

Content type
application/json
{
  • "addonCategory": "Clothing",
  • "addonName": "Sweatshirt",
  • "addonVariantName": "Women's X Large",
  • "amount": 5000,
  • "attributedLineItemId": "dfe27034-85f5-4aac-8cf5-6d7024829679",
  • "attributedLineItemType": "TICKET",
  • "bookerEmailAddress": "user@example.com",
  • "bookerName": "John Smith",
  • "bookingId": "string",
  • "bookingType": "ENTRY",
  • "currencyCode": "AUD",
  • "eventId": "2365756",
  • "eventOccurrenceId": "234676543146",
  • "eventOccurrenceTitle": "string",
  • "financialEntryId": "string",
  • "id": "string",
  • "incrementalStatus": "INCREMENTAL",
  • "isRefund": true,
  • "ldtAmount": 300,
  • "lineItemName": "X Large T-shirt",
  • "itemId": "1e2601e0-1f86-4276-9448-9c9810526ee1",
  • "itemSelectionId": "37134b3f-29dc-49e6-9185-f0d4f2cbbc5a",
  • "lineItemType": "TICKET",
  • "organizerAmount": 4700,
  • "participantId": "string",
  • "paymentCompletedAt": "2026-05-08T11:30:00.000Z",
  • "paymentId": "string",
  • "paymentReference": "string",
  • "paymentRefundId": "string",
  • "paymentStatus": "FUNDS_COMPLETE",
  • "payoutId": "string",
  • "quantity": 1,
  • "raceTitle": "string",
  • "raceId": "string",
  • "startlistEntryId": "string",
  • "thirdPartyAmount": 0,
  • "ticketId": "string",
  • "ticketSlug": "string",
  • "ticketTitle": "string",
  • "transactionAt": "2026-05-08T11:30:00.000Z",
  • "createdAt": "2026-05-08T11:30:00.000Z",
  • "updatedAt": "2026-05-08T11:30:00.000Z"
}

All LineItems

Returns all LineItems that you have access to

Authorizations:
bearerAuth
query Parameters
page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

sort[updatedAt]
string or null
Enum: 1 -1
Example: sort[updatedAt]=1

Sort by update date. 1 for ascending, -1 for descending.

sort[createdAt]
string or null
Enum: 1 -1
Example: sort[createdAt]=1

Sort by creation date. 1 for ascending, -1 for descending.

createdAt[after]
string or null <date-time>
Example: createdAt[after]=2020-01-01T20:15:00.000Z

Only return entries created after this date.

createdAt[before]
string or null <date-time>
Example: createdAt[before]=2020-01-01T20:15:00.000Z

Only return entries created before this date.

updatedAt[after]
string or null <date-time>
Example: updatedAt[after]=2020-01-01T20:15:00.000Z

Only return entries updated after this date.

updatedAt[before]
string or null <date-time>
Example: updatedAt[before]=2020-01-01T20:15:00.000Z

Only return entries updated before this date.

source
string or null
Value: "mongodb"

Data source. When set to "mongodb", reads from the MongoDB collection.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Events

Events that participants can register for.

List events

Returns a paginated list of available events on Let's Do This.

Note that this endpoint requires special marketplace API credentials. If you wish to use this endpoint, please contact the Let's Do This team for more information.

Authorizations:
bearerAuth
query Parameters
startDate[gte]
string

Minimum start date filter (inclusive) in YYYY-MM-DD format

startDate[lte]
string

Maximum start date filter (inclusive) in YYYY-MM-DD format

lastModified[gte]
string

Minimum last modified timestamp filter (inclusive) in ISO 8601 format

lastModified[lte]
string

Maximum last modified timestamp filter (inclusive) in ISO 8601 format

pageSize
number

Maximum number of results to return (1-200, default 10)

cursor[before]
string

Cursor to paginate through results before a given value

cursor[after]
string

Cursor to paginate through results after a given value

countryCode
string
Example: countryCode=us

(Optional) ISO-2 country code If supplied, it will be used to return a region specific checkout link. Defaults to "gb".

Responses

Response samples

Content type
application/json
{
  • "events": [
    ],
  • "page": {
    }
}

Event Occurrences

Event occurrences scoped to the organizer associated with your Public API credentials. Unlike the public Events catalog, results are limited to your own events.

List event occurrences

Returns a paginated list of event occurrences owned by your account.

Results are scoped to the organizer associated with your Public API credentials, so the per-item organizer block from the marketplace events endpoint is omitted.

Authorizations:
bearerAuth
query Parameters
startDate[gte]
string

Minimum start date filter (inclusive) in YYYY-MM-DD format

startDate[lte]
string

Maximum start date filter (inclusive) in YYYY-MM-DD format

lastModified[gte]
string

Minimum last modified timestamp filter (inclusive) in ISO 8601 format

lastModified[lte]
string

Maximum last modified timestamp filter (inclusive) in ISO 8601 format

page[size]
number

The number of entries to return per page. Range between 1 - 500, defaults to 100.

page[after]
string

Accepts an existing page cursor to return results after it. For more details see the definition of PageCursor in the response.

page[before]
string

Accepts an existing page cursor to return results before it. For more details see the definition of PageCursor in the response.

pageSize
number
Deprecated

Maximum number of results to return. Use page[size] instead.

cursor[before]
string
Deprecated

Cursor to paginate through results before a given value. Use page[before] instead.

cursor[after]
string
Deprecated

Cursor to paginate through results after a given value. Use page[after] instead.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Get an event occurrence by ID

Returns a single event occurrence by ID if it belongs to the organizer associated with your Public API credentials.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 12345678901

The ID of the event occurrence to query by.

Responses

Response samples

Content type
application/json
{
  • "id": "12345678901",
  • "title": "Example Half Marathon 2026",
  • "titleByLocale": {
    },
  • "tags": [
    ],
  • "content": {
    },
  • "startDate": "string",
  • "location": {
    },
  • "images": {
    },
  • "priceRange": {
    }
}

Races

Races within an event occurrence. An event occurrence may have one or more races, for example a 5K and a 10K within the same race day.

Get a race by ID

Returns a single race by ID if it belongs to the organizer associated with your Public API credentials.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

Responses

Response samples

Content type
application/json
{
  • "id": "12345678902",
  • "title": "Half Marathon",
  • "discipline": "RUNNING",
  • "distance": {
    },
  • "startDate": "2026-10-04",
  • "startTime": "09:00:00",
  • "priceRange": {
    },
  • "eventOccurrenceId": "12345678901",
  • "eventId": "2365756"
}

Get races by an event occurrence

Returns a paginated list of races associated with a given event occurrence.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 12345678901

The ID of the event occurrence to query by.

query Parameters
page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Booking Forms

Booking forms define the questions a booker answers when registering for a ticket. A ticket usually references a single booking form, so expect zero or one, while a booking form may be shared across multiple tickets.

Get booking forms by a ticket

Returns a paginated list of the booking forms a given ticket appears in. Results are scoped to the organizer associated with your Public API credentials.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Get a booking form by ID

Returns a single booking form by ID if it belongs to the organizer associated with your Public API credentials.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

Responses

Response samples

Content type
application/json
{
  • "id": "6651a3e8f2b47c0019d3a8c1",
  • "title": "10k Entry Form"
}

Get tickets by a booking form

Returns a paginated list of the tickets that use a given booking form. Results are scoped to the organizer associated with your Public API credentials.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Booking Form Fields

Booking form fields are the individual questions on a booking form — their type, label, options, and whether an answer is required. A field can be reused across multiple forms.

Get fields by a booking form

Returns a paginated list of the fields used by a given booking form. Results are scoped to the organizer associated with your Public API credentials.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Get booking form fields

Returns a paginated list of the booking form fields owned by the organizer associated with your Public API credentials.

Authorizations:
bearerAuth
query Parameters
page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Get a booking form field by ID

Returns a single booking form field by ID if it belongs to the organizer associated with your Public API credentials.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

Responses

Response samples

Content type
application/json
{
  • "id": "6651a3e8f2b47c0019d3a8d4",
  • "publicId": "tshirt-size",
  • "type": "SELECT",
  • "name": "T-shirt size",
  • "nameByLocale": {
    },
  • "required": true,
  • "options": [
    ]
}

Get booking forms by a field

Returns a paginated list of the booking forms that contain a given field. Results are scoped to the organizer associated with your Public API credentials.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Bookings

Bookings are the transaction record for a registration. A booking may contain one or more participants (entries).

Get a booking by ID

Returns a single booking by ID if it belongs to the organizer associated with your Public API credentials.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "externalBookingId": "string",
  • "status": "CONFIRMED",
  • "source": "INTERNAL",
  • "booker": {
    },
  • "eventId": "string",
  • "eventOccurrenceId": "string",
  • "ticketId": "string",
  • "createdAt": "2026-05-08T11:30:00.000Z",
  • "updatedAt": "2026-05-08T11:30:00.000Z",
  • "transactionId": "string",
  • "amount": {
    },
  • "tracking": {
    },
  • "bookingReference": "string",
  • "participantCount": 0,
  • "gdprRedacted": true
}

Get a booking's participants

Returns a paginated list of the booking's participants (entries), if the booking belongs to the organizer associated with your Public API credentials.

Authorizations:
bearerAuth
path Parameters
id
required
string
Example: 67123

The ID of the resource to query by

query Parameters
page[size]
number or null [ 1 .. 500 ]
Example: page[size]=100

The number of entries to return per page. Range between 1 - 500, defaults to 100

page[after]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

page[before]
string or null

Accepts an existing page cursor. For more details see the definition of PageCursor in the response.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "page": {
    }
}

Get a booking by your external booking ID

Resolves a booking by the external id you supplied when importing it, scoped to the organizer associated with your Public API credentials.

Authorizations:
bearerAuth
path Parameters
externalBookingId
required
string
Example: partner-booking-00123

Your own external booking id — the correlation id supplied when the booking was created via the import API.

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "externalBookingId": "string",
  • "status": "CONFIRMED",
  • "source": "INTERNAL",
  • "booker": {
    },
  • "eventId": "string",
  • "eventOccurrenceId": "string",
  • "ticketId": "string",
  • "createdAt": "2026-05-08T11:30:00.000Z",
  • "updatedAt": "2026-05-08T11:30:00.000Z",
  • "transactionId": "string",
  • "amount": {
    },
  • "tracking": {
    },
  • "bookingReference": "string",
  • "participantCount": 0,
  • "gdprRedacted": true
}