Reference

Public REST API

Read-only access to your team’s laps, races, drivers, and team-internal leaderboards. Issued per team by an admin under /settings/api-keys.

Authentication

Send your API key as a Bearer token. Keys look like lmu_<32 base64url chars> and are shown once at creation time. The server only stores a SHA-256 hash and the prefix.

Authorization: Bearer lmu_AbCdEfGhIjKlMnOpQrStUvWxYz012345

Every key is bound to a single team. Cross-team reads are blocked server-side; passing a different team_id in the query string has no effect.

Rate limits

Default is 60 requests/minute per key (admins can raise to 10,000/min). Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (unix seconds). 429s include a Retry-After header in seconds.

Pagination

List endpoints return { data: [...], nextCursor: string | null }. Pass the cursor back as ?cursor=... to fetch the next page. Cursors are opaque base64url and may change format across major versions.

Endpoints

GET/api/v1/lapslaps:read

List laps shared with the caller's team. Cursor-paginated.

ParameterTypeDescription
car_classHypercar | LMP2 | LMGT3Filter by car class.
track_layout_iduuidFilter by track layout.
valid_onlytrue | falseDefault true. Set false to include invalidated laps.
limitinteger (1–100)Default 50.
cursorstringOpaque cursor from the previous page.
curl -H "Authorization: Bearer lmu_xxx" \
  "https://portal.lmu-portal.app/api/v1/laps?car_class=Hypercar&limit=10"
GET/api/v1/laps/{id}laps:read

Get a single lap by ID. Returns 404 if not visible to the caller's team.

curl -H "Authorization: Bearer lmu_xxx" \
  "https://portal.lmu-portal.app/api/v1/laps/9c5d…"
GET/api/v1/racesraces:read

List races. Cursor-paginated; filter by date range.

ParameterTypeDescription
fromISO 8601 datetimeInclusive lower bound.
toISO 8601 datetimeInclusive upper bound.
limitinteger (1–100)Default 50.
cursorstringOpaque cursor from the previous page.
curl -H "Authorization: Bearer lmu_xxx" \
  "https://portal.lmu-portal.app/api/v1/races?from=2026-01-01T00:00:00Z"
GET/api/v1/leaderboardsleaderboard:read

Team-internal leaderboard for a track layout.

ParameterTypeDescription
layout_id *uuidTrack layout id.
car_classHypercar | LMP2 | LMGT3Filter by car class.
limitinteger (1–100)Default 20.
curl -H "Authorization: Bearer lmu_xxx" \
  "https://portal.lmu-portal.app/api/v1/leaderboards?layout_id=abcd…&car_class=Hypercar"
GET/api/v1/driversdrivers:read

List drivers (team members).

curl -H "Authorization: Bearer lmu_xxx" \
  "https://portal.lmu-portal.app/api/v1/drivers"

Error codes

HTTPCodeMeaning
400invalid_queryQuery parameters failed validation. `details` carries the field map.
401missing_authorizationNo `Authorization` header was sent.
401invalid_token_formatToken must be a Bearer token starting with `lmu_`.
401invalid_credentialsToken doesn't match any active key.
401revokedThe key has been revoked by an admin.
403insufficient_scopeKey is missing one of the required scopes.
404not_foundResource doesn't exist or isn't visible to your team.
429rate_limitedSlow down. `Retry-After` header tells you how long.

Machine-readable spec

Full OpenAPI 3.1 document: /api/v1/openapi.json. Drop it into Postman, Insomnia, openapi-typescript, or your tool of choice.