Skip to content
RaceHooks for Dashboards & Fan Apps

Build the live race view
your audience wants.

Connect running order, gaps, tyres, track status and race control to your dashboard, bot or overlay. Start with a recorded session, choose the feeds your audience needs, and review plan limits and permitted use before launch.

The core integration below is available on Developer — $99/mo, self-serve.
Timing towerEXAMPLE UI
Live timingLAP 34/53 · GREEN
CarPosIntervalTyreStops
NORP1—MED · 141
VERP2+2.418HARD · 32
LECP3+0.907MED · 161
PIAP4+3.552HARD · 32
01 · What you build

What dashboard and bot builders build on RaceHooks

Live timing dashboards & track maps

The timing tower and the circuit map from one subscription: position, leader gap and interval, lap and sector times, plus every car's live coordinates and lap fraction. Draw the map once and the cars move because the feed moved, not because a timer fired.

Built from
timing.datatelemetry.track-positionsession.lap-countdriver.list

Discord bots & chat integrations

Announce safety cars, red flags, fastest laps, overtakes, and retirements the moment race control says so. Each arrives as a typed event with the driver attached, so a bot template is a switch statement rather than a regex over someone's scoreboard HTML.

Built from
race-control.messagesevents.racesession.track-status

Overlays, extensions & second screens

One long-lived SSE connection from the browser — no public webhook host, no backend to stand up. Enough for a lower-third, a gap widget, or a tyre-age strip that sits over whatever you are already watching.

Built from
timing.datatiming.top-threetire.currentsession.clock

Ambient displays & home automation

Track status arrives as one named value — green, yellow, safetyCar, red — already resolved from the raw flag code, so a light strip, an e-ink panel, or a desk display can follow the session without parsing anything. The session clock and lap count sit alongside it.

Built from
session.track-statussession.statussession.clockweather.data
02 · What your users see

One payload, straight onto the screen

Three things a fan app is usually built out of, and all three are the same subscription rendered differently: the tower, the alert, and the overlay.

Discord / chat botEXAMPLE UI
# race-alerts
RH
racehooksAPP14:22
SAFETY CAR DEPLOYED
Lap 34 of 53 · Italian Grand Prix. Cause: retirement, ALO.
RH
racehooksAPP14:19
FASTEST LAP — LEC
1:21.046 on lap 33, purple in all three sectors.
RH
racehooksAPP14:12
OVERTAKE — NOR on PIA
P1 into Turn 1. Gap behind opens to 1.4s within a lap.

Every one of these is a typed event with the driver attached — a switch statement, not a scraper. The channel is yours; the templates are one per event type.

Browser overlayEXAMPLE UI
1
NOR
Lando Norris
+2.418
INTERVAL
MEDIUM
14 laps

The same timing.data fields as a compact overlay, driven from one SSE connection in the page. No backend, no webhook host, no polling.

↑ all of it, from this payload
SSE frame — session.track-status, a safety car going green again
event: session.track-status
data: {
  "feed": "session.track-status",
  "sessionId": "2026-italy_r",
  "utc": "2026-09-06T14:31:07.220Z",
  "data": { "status": "green", "message": "AllClear" }
}

# One connection, every feed you subscribed to, as text/event-stream.
# Reconnect is a plain EventSource retry — no session to re-establish.

Example interfaces, rendered from the fields above: your product, your design system. Nothing here is a template you have to adopt.

03 · Endpoints

The endpoints that build it

Every route is Bearer-authenticated and versioned under /v1. Base URL https://api.racehooks.io/v1.

MethodPathWhat it gives you
GET/v1/streamServer-Sent Events over one long-lived connection — the path for a browser dashboard or an extension with nowhere to receive a webhook.
POST/v1/webhooksSubscribe an endpoint to a feed. One endpoint can carry the whole live catalog; filter by driver when a widget only cares about a few cars.
GET/v1/eventsThe full season calendar with sessions nested on each event — what to count down to, and when to open a connection.
GET/v1/data/seasons/:year/standingsDriver and constructor standings for a season, for the table every dashboard eventually grows.
GET/v1/data/driversCanonical driver identity — number, TLA, name, team — the same ids every live payload carries.
GET/v1/simulate/sessionsReplay a real session at any speed from 0.1× to 120× into your own endpoint, so you can build in midweek. Free covers 5 distinct current-season sessions and Developer 10; the full archive is Custom.
Feeds you subscribe to
timing.dataPosition, leader gap and interval, lap and sector times — the tower, every lap, every car.
telemetry.track-positionEvery car's live position on the circuit: lap fraction plus x/y track coordinates, for the map.
session.track-statusOne named status — green, yellow, safetyCar, virtualSafetyCar, safetyCarEnding, red — already resolved from the raw flag code.
race-control.messagesRace control in its own words: flags, safety car calls, investigations, penalties.
events.race40+ synthesized events — overtakes, pit stops, retirements, fastest laps — each carrying the driver it belongs to.
driver.listNumber, TLA, full name, team and team colour. Free, and the identity every other payload keys to.
tire.currentCurrent compound per driver with tyre age — the strip every timing tower grows eventually.
session.lap-countCurrent lap and laps remaining; session.clock carries the countdown beside it. Both free.

Developer includes all 29 live data feeds, not just the ones above; the remaining 26 in the 56-feed catalog are the Custom analytics feeds. Every id, cadence, and payload schema is documented.

04 · Delivery

Three ways the data reaches you

Pick per integration. You can run all three against one API key. Webhook and SSE frames are both counted as deliveries (Free pauses at its monthly limit; Developer has no delivery limit); REST reads count against the request rate limit instead.

Webhook

Push · default

Register an HTTPS endpoint and subscribe it to feeds. RaceHooks POSTs events as source updates arrive. Every payload is HMAC-SHA256 signed, retried with exponential backoff on failure, and every attempt is logged in your console with headers, status, and latency.

POST /v1/webhooks
{ "webhookUrl": "https://your-app.com/hook",
  "feedId": "events.race" }
Best for: Server-side apps, scoring engines, alerting.

SSE stream

Push · no public URL

Open one long-lived connection and read frames as they arrive — no public webhook server to host or expose. Each frame is `event: <feedType>` + a JSON `data:` line, with a ping every 30s so proxies hold the connection open. Auth by Bearer header, or `?token=` for browser EventSource, which cannot set headers.

GET /v1/stream?feeds=raceevent,timingdata
Authorization: Bearer $TOKEN
Best for: Local development, dashboards, browser clients.

REST

Pull · on demand

Query completed and reference data directly whenever you need it: results, standings, laps, stints, pit stops, and the segment endpoints above. Use it to backfill history, hydrate a new user, or reconcile after an outage rather than to follow a live session.

GET /v1/historical/2026/16/results
Authorization: Bearer $TOKEN
Best for: Backfill, reference data, reconciliation.
05 · Before race day

Test the whole thing on a quiet Tuesday

Simulate replays a real current-season session through your own webhooks at any speed from 0.1× to 120×. Your integration receives the exact payloads it would in a live race (real data, known result) so you can validate fans logic end to end before a live session ever runs. Free includes 5 sessions, Developer 10; Custom replays the full archive.

How Simulate works →
Model evaluation · Custom

What the ML layer adds for fans

Everything above is what is happening, pushed as it happens — enough to build the dashboard most people actually want. Custom adds what is likely to happen next, which is the difference between a tower and a story. Model outputs publish only on supported sessions, schedules and eligible race states. Review the output contracts and evaluation scope with us.

Win, podium & position probabilities

analytics.race-odds carries a full position distribution per driver, recomputed as the race moves. The graphic that makes a comeback legible rather than just visible.

Overtake & battle state

analytics.battle tracks the fight between a car and the one ahead — closing rate, DRS range, how long it has been held. The cue for where to point a viewer next.

Tyre cliff & true pace

analytics.true-pace strips fuel load and tyre age out of a lap so the tower can show who is genuinely quickest, and the tyre-cliff model says how many laps are left on a set.

Mini-sector timing & classified results

timing.mini-sectors shows where in a lap the time actually went, and results.classification closes the session out with the official order.

Talk to usRead the model methodology →Delivery volumes, service levels and archive replay are agreed in your contract.
Hosted on-screen graphics · in development

Let your users play against the model

A hosted beat-the-model strip that sits next to your own leaderboard, with a compact win-probability card beside it. The app below is a fictional example and every value is illustrative.

Kivo Picks is a fictional fan prediction app. Drops into an app or site. The beat-the-model strip sits next to your own leaderboard.

kivo.example/leagueFictional brand · Illustrative values
Kivo PicksFriends league
Beat the modelRound picks
1ana.voltas142 pts+11 vs model
2rafa_box136 pts+5 vs model
3RaceHooks model131 pts—
4You127 pts−4 vs model
5duda_box118 pts−13 vs model
Model: RaceHooks · Independent analysis, not affiliated with Formula 1 or the FIA
Win probabilityLap 23 / 58
Norris35%+6
Piastri25%+8
Verstappen20%−3
Russell10%−4
Leclerc5%−1
Model: RaceHooks · Independent analysis, not affiliated with Formula 1 or the FIA

Driver names appear as plain text. No driver images, team marks or series branding. Every graphic carries the RaceHooks credit and a not-affiliated notice.

Start on the free tier.

Build and test a complete integration on historical and replayed sessions, with no credit card. Go Developer when you need it live.

Start freeCompare plans