← IMRC Live
DEVELOPER REFERENCE · VERSION 1

One track.
Connected race data.

Public reads for IMRC Setup Manager and other spectator apps. Protected publishing for IMRC Race Control v0.15.2.

OpenAPI specification TypeScript client

Connect Race Control

  1. Save your track name and details in Race Control → Track Info.
  2. Click Register Track Online. No account or administrator approval is required.
  3. Race Control registers its existing UUID, saves a private upload key with Windows encryption, and enables publishing automatically.
  4. Select your current event. Assigned events, lineups, results, live laps and Series points upload automatically while Race Control is running.

Repeated registration from the same race PC is safe: it keeps the same UUID and key and cannot change the website track profile. Only shopimrc@gmail.com can edit profiles, delete tracks, or replace upload keys. Upload keys permit race-data publishing only.

Use one publishing PC per track. Moving to another PC or losing the stored key requires an administrator-issued replacement key. Existing tracks from before v0.15.1 still need their keys replaced by the administrator; stored results remain intact.

To delete a track, sign in to Track administration as shopimrc@gmail.com, select it, and type its exact name. This permanently removes its events and Series records and reserves its UUID so automatic registration cannot restore it. The administrator can explicitly register that UUID again. Export records first if needed.

Desktop registration API

POST /api/register with JSON {uuid, name, location, surface} and an Authorization Bearer key generated with 32 random bytes encoded as hexadecimal. Persist that key securely before sending and reuse it on retry. No user login is required. Success returns {apiVersion:1,data:{id,name,registered:true}}. A conflicting key returns 409; an administrator-deleted UUID returns 410. Registration never reveals a key or updates an existing profile.

Public read endpoints

Base URL: https://live.shopimrc.com/api/v1. No API key or ChatGPT login is required for reads. Responses use { apiVersion: 1, data: ... }.

GET endpointReturns
/tracksTrack directory
/tracks/{trackId}Track information
/tracks/{trackId}/liveCurrent event, live races, feed age and stale status
/tracks/{trackId}/eventsEvent summaries
/tracks/{trackId}/events/{eventId}Lineups and results for an event
/tracks/{trackId}/events/{eventId}/races/{raceId}One race and individual lap times
/tracks/{trackId}/seriesSeries/class summaries
/tracks/{trackId}/series/{seriesId}Points, positions, counted weeks, adjustments and notes

Lists accept limit (1–100, default 50) and offset. Continue with data.nextOffset until null. Event detail accepts round=Q1, classId, and status=completed. URL-encode all identifiers.

Setup Manager example

const base = 'https://live.shopimrc.com/api/v1';
const response = await fetch(base + '/tracks');
if (!response.ok) throw new Error('Unable to load tracks');
const { data } = await response.json();
const track = data.items[0];
if (track) {
  const liveResponse = await fetch(base + '/tracks/' +
    encodeURIComponent(track.id) + '/live');
  if (!liveResponse.ok) throw new Error('Unable to load live timing');
  const { data: live } = await liveResponse.json();
  // Display live.event and live.races. If live.stale, show "Feed offline".
}

Poll live timing no faster than every 10 seconds. Pause polling when the app is in the background. Honor ETag / If-None-Match (304 has no body). Back off on 429 or 5xx. Cross-origin GET access is supported without credentials. HTTPS is required.

Publishing

POST /tracks/{trackId}/connection checks the key with { "localTrackId": "desktop-track-id" }. POST /tracks/{trackId}/snapshot publishes data. Both require Authorization: Bearer YOUR_TRACK_UPLOAD_KEY. Never embed upload keys in Setup Manager or browser code.

{
  "schemaVersion": 1,
  "localTrackId": "0123456789abcdef0123456789abcdef",
  "generatedAt": "2026-10-10T12:00:00.000Z",
  "currentEventId": "event-001",
  "events": [
    {
      "id": "event-001",
      "name": "Saturday racing",
      "date": "2026-10-10",
      "status": "active",
      "races": [
        {
          "id": "race-001",
          "number": 1,
          "round": "Q1",
          "classId": "stock",
          "className": "25.5 Foam Tire",
          "heat": "Heat 1",
          "status": "live",
          "drivers": [
            {
              "name": "Example racer",
              "carNumber": 1,
              "position": 1,
              "laps": 1,
              "time": "0:04.650",
              "best": "4.650",
              "lastLap": "4.650",
              "gap": "Leader",
              "finished": false,
              "lapTimes": [
                4.65
              ]
            }
          ]
        }
      ]
    }
  ],
  "series": []
}

Maximum 2 MB and 50 records per request. Send one full event or series/class record at a time. Stable IDs update existing records; omitted records remain stored. Re-sending a snapshot is safe. Newer timestamps protect against older retries. Keep the PC clock synchronized and uploads serialized. The race PC keeps the newest unsent version per record on disk and retries with backoff.

Scoring and identity

Race Control is authoritative. Series uploads carry final totals, positions, counted-week indexes and adjustments; the website preserves those results. Driver UUIDs and ratings stay in the desktop Drivers area. Public rows contain display names and car numbers. Null weekly points mean no scored entry; zero is a real zero score. A series spanning multiple local tracks is not published by this first connector, to avoid showing partial championship totals.

Track, event, race and class IDs remain stable. A future API version can add video metadata or authenticated setup sharing. This version does not remotely control races, write setups, or link private driver accounts.

Status and retention

A feed is stale after 30 seconds without a publisher heartbeat; last received timing stays visible. Publishing pause does not remove public history. Deleting a local event does not delete its published record. Export records in Track manager for a separate backup. Live timing arrives approximately 10–20 seconds after local scoring under normal connectivity.

Errors use { apiVersion: 1, error: { code, message } }. 400: invalid data; 401: invalid track key; 403: browser origin rejected; 404: unknown resource; 409: track pairing or stale snapshot; 413: oversized payload. Retain unsent results when an error occurs.