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
List laps shared with the caller's team. Cursor-paginated.
| Parameter | Type | Description |
|---|---|---|
| car_class | Hypercar | LMP2 | LMGT3 | Filter by car class. |
| track_layout_id | uuid | Filter by track layout. |
| valid_only | true | false | Default true. Set false to include invalidated laps. |
| limit | integer (1–100) | Default 50. |
| cursor | string | Opaque 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 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…"
List races. Cursor-paginated; filter by date range.
| Parameter | Type | Description |
|---|---|---|
| from | ISO 8601 datetime | Inclusive lower bound. |
| to | ISO 8601 datetime | Inclusive upper bound. |
| limit | integer (1–100) | Default 50. |
| cursor | string | Opaque 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"
Team-internal leaderboard for a track layout.
| Parameter | Type | Description |
|---|---|---|
| layout_id * | uuid | Track layout id. |
| car_class | Hypercar | LMP2 | LMGT3 | Filter by car class. |
| limit | integer (1–100) | Default 20. |
curl -H "Authorization: Bearer lmu_xxx" \ "https://portal.lmu-portal.app/api/v1/leaderboards?layout_id=abcd…&car_class=Hypercar"
List drivers (team members).
curl -H "Authorization: Bearer lmu_xxx" \ "https://portal.lmu-portal.app/api/v1/drivers"
Error codes
| HTTP | Code | Meaning |
|---|---|---|
| 400 | invalid_query | Query parameters failed validation. `details` carries the field map. |
| 401 | missing_authorization | No `Authorization` header was sent. |
| 401 | invalid_token_format | Token must be a Bearer token starting with `lmu_`. |
| 401 | invalid_credentials | Token doesn't match any active key. |
| 401 | revoked | The key has been revoked by an admin. |
| 403 | insufficient_scope | Key is missing one of the required scopes. |
| 404 | not_found | Resource doesn't exist or isn't visible to your team. |
| 429 | rate_limited | Slow 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.