curl --request POST \
--url https://api.letsdothis.com/timing-inbound/v1 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"schemaVersion": "<string>",
"messageId": "<string>",
"provider": "<string>",
"ldtStartlistEntryId": "<string>",
"data": {
"bibNumber": "<string>",
"checkedInAt": "2023-11-07T05:31:56Z"
},
"changedAt": "2023-11-07T05:31:56Z"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
schemaVersion: '<string>',
messageId: '<string>',
provider: '<string>',
ldtStartlistEntryId: '<string>',
data: {bibNumber: '<string>', checkedInAt: '2023-11-07T05:31:56Z'},
changedAt: '2023-11-07T05:31:56Z'
})
};
fetch('https://api.letsdothis.com/timing-inbound/v1', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.letsdothis.com/timing-inbound/v1"
payload = {
"schemaVersion": "<string>",
"messageId": "<string>",
"provider": "<string>",
"ldtStartlistEntryId": "<string>",
"data": {
"bibNumber": "<string>",
"checkedInAt": "2023-11-07T05:31:56Z"
},
"changedAt": "2023-11-07T05:31:56Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"received": 123,
"messageIds": [
"<string>"
]
}{
"statusCode": 400,
"error": "<string>",
"message": "<string>"
}{
"statusCode": 403,
"error": "<string>",
"message": "<string>"
}{
"statusCode": 429,
"error": "<string>",
"message": "<string>"
}Ingest timing data from a timing provider
Available to select timing partners on a per-account basis — contact your account manager to enable it. Authenticate with the timing-provider token issued during onboarding as a bearer token; other callers receive 401.
Push data — bib numbers and bib-pack shipments — back to Let’s Do This for startlist entries you received from us. Send one message or a batch of up to 500, each carrying at least one recognized field in data.
A 202 means the batch was accepted for processing, not that values were applied. Messages are applied asynchronously, and an update whose changedAt is older than the last applied one for the same field is skipped — bib and shipping updates are ordered independently. messageId de-duplicates retries, so resubmitting an entire request after a timeout or 5xx response is safe.
Rate limit as of today: 20 requests per second.
curl --request POST \
--url https://api.letsdothis.com/timing-inbound/v1 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"schemaVersion": "<string>",
"messageId": "<string>",
"provider": "<string>",
"ldtStartlistEntryId": "<string>",
"data": {
"bibNumber": "<string>",
"checkedInAt": "2023-11-07T05:31:56Z"
},
"changedAt": "2023-11-07T05:31:56Z"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
schemaVersion: '<string>',
messageId: '<string>',
provider: '<string>',
ldtStartlistEntryId: '<string>',
data: {bibNumber: '<string>', checkedInAt: '2023-11-07T05:31:56Z'},
changedAt: '2023-11-07T05:31:56Z'
})
};
fetch('https://api.letsdothis.com/timing-inbound/v1', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.letsdothis.com/timing-inbound/v1"
payload = {
"schemaVersion": "<string>",
"messageId": "<string>",
"provider": "<string>",
"ldtStartlistEntryId": "<string>",
"data": {
"bibNumber": "<string>",
"checkedInAt": "2023-11-07T05:31:56Z"
},
"changedAt": "2023-11-07T05:31:56Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"received": 123,
"messageIds": [
"<string>"
]
}{
"statusCode": 400,
"error": "<string>",
"message": "<string>"
}{
"statusCode": 403,
"error": "<string>",
"message": "<string>"
}{
"statusCode": 429,
"error": "<string>",
"message": "<string>"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
- TimingInboundMessage · object
- TimingInboundMessage · object[]
One timing-inbound contract-v1 message: a timing provider reporting data (a bib number, a shipment, or both) for one LDT startlist entry.
Contract schema version. Currently supported: "1.0".
Provider-generated unique id for this message — the idempotency and dead-letter correlation key.
1The timing provider code issued to you by Let's Do This. Must match the provider the bearer token was issued for.
1The LDT startlist entry id the data applies to — the join key LDT sent outbound.
1Timing data for one participant. Every field is optional here because a provider may report them in separate messages, but a message must carry at least one field this integration recognises — enforced in the handler, not in this type, because the index signature below leaves the generated JSON schema unable to express it. Unknown fields are still accepted and passed through to the timing pipeline untouched.
Show child attributes
Show child attributes
When the value changed at the provider (last-writer-wins ordering).
Provider-native identifiers on a timing-inbound message — optional context that is not processed by Let's Do This today; safe to omit.
Show child attributes
Show child attributes
Was this page helpful?

