RaceHooks for Sim Racing & Esports

Real F1 data,
for the sim on your desk.

Compound and stint histories, lap and sector times, qualifying pace, and circuit-side weather from real sessions — the reference a setup, a degradation curve, or a pace benchmark is checked against. Then replay a real session into your own endpoint and watch your tooling react to it.

Everything on this page ships on Developer$99/mo, self-serve.
Stint reference
Stint historyITALIAN GP · RACE
CarCompoundLapsStintPit loss
NORMEDIUM1–201 of 221.4s
VERHARD21–532 of 220.9s
LECMEDIUM1–181 of 221.8s
PIAHARD19–532 of 222.6s
01 · What you build

What sim racing and esports developers build on RaceHooks

Calibrating a simulator against the real thing

Stint histories with compound and tyre age, lap-by-lap times behind them, and air and track temperature on the same clock. That is a real degradation curve and a real track-evolution trace, per circuit, rather than a number someone posted on a forum.

Built from
tire.historytiming.lap-historyweather.data-seriesdata/events/:eventId/pace

Pace benchmarks & hotlap targets

Qualifying times per driver per session, with personal bests, best sectors, and speed-trap rankings alongside them. Set a league's target lap from what the real car did at that circuit, sector by sector, instead of from a leaderboard screenshot.

Built from
events.qualifyingtiming.statshistorical/:season/:round/qualifying

Companion apps & event overlays

Run the same live surfaces a broadcast uses over your own league night: running order, gaps, tyre state, flags, and every car's position on the circuit, pushed rather than polled. One SSE connection is enough for a browser overlay.

Built from
timing.datatelemetry.track-positionsession.track-statussession.timing

Coaching & post-session analysis

Per-driver lap telemetry summaries and stint aggregates from completed sessions — where the time went, which lap the tyre fell away, how a stint actually decayed. The comparison a driver coach makes by hand, as an endpoint.

Built from
telemetry/races/:raceId/drivers/:driverId/lapsdata/races/:raceId/telemetry/stints
02 · What your users see

One payload, straight onto the screen

A sim developer wants two things from real data — a number to calibrate against, and a way to run their tooling without waiting for a race. These are both, plus the overlay a league night ends up needing.

Replay into your endpoint
PREPAREPick a real session, then a speed
POST /v1/simulate/prepare takes the session; speed is a query parameter on the stream, anywhere from 0.1× to 120×. Free unlocks 5 distinct current-season sessions, Developer 10.
DELIVERYYour endpoint receives the session as it happened
Same feeds, same payloads, same order — webhook or SSE, exactly as live.
MARKEDEvery frame carries _replay
simulationId, originalSessionId and the elapsed session clock travel with the payload, so a replay can never be mistaken for a live session.
Same endpoint, same signature, same ordering as race day Full historical archive replay is Custom.

Simulate is the same delivery path as a live session, so the code you test midweek is the code that runs on race day. Every frame is marked as a replay.

League-night overlay
2
VER
Max Verstappen
+2.418
INTERVAL
HARD
3 laps

The live surfaces a broadcast uses, over your own event. One SSE connection from the page — no backend to stand up for one night.

↑ all of it, from this payload
Replay a real session into your own endpoint — /v1/simulate
POST /v1/simulate/prepare        { "sessionId": "2026-italy_r" }
GET  /v1/simulate/stream?session=2026-italy_r&speed=5

# Your endpoint then receives the session as it happened, 5x faster:
{ "feed": "timing.data", "sessionId": "2026-italy_r",
  "utc": "2026-09-06T14:31:07.220Z",
  "_replay": { "simulationId": "sim_8f21c4",
               "originalSessionId": "2026-italy_r",
               "sessionElapsed": "01:12:44.310" },
  "data": { … } }

# _replay is present on every replayed frame, so test traffic can never be
# mistaken for a live session. Speed is clamped to 0.1x-120x (default 10x).
# Free: 5 distinct current-season sessions. Developer: 10. Full archive: Custom.

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/simulate/sessionsReplayable sessions — the reason most of this segment signs up. Prepare one and it delivers to your real endpoint at any speed from 0.1× to 120×, same payloads, same order. Free covers 5 distinct current-season sessions and Developer 10; the full archive is Custom.
GET/v1/streamServer-Sent Events over one long-lived connection — a league-night overlay with no backend behind it.
POST/v1/webhooksSubscribe an endpoint to a feed. The same endpoint receives a replay and a live session, so what you tested midweek is what runs on Sunday.
GET/v1/historical/:season/:round/qualifyingQualifying results for any round, with a sibling route for the qualifying laps behind them.
GET/v1/historical/:season/:round/stintsStint plans — compound and tyre age per driver — for the degradation model behind a setup.
GET/v1/telemetry/races/:raceId/drivers/:driverId/lapsPer-lap telemetry summaries for one driver in a completed session, for coaching and comparison tools.
Feeds you subscribe to
tire.historyFull stint history per driver: compound, start lap, laps on the tyre — the degradation reference.
timing.lap-historyAccumulated per-driver lap series, for the pace trace behind a stint.
timing.statsPersonal best lap, best sectors, and speed-trap rankings — the benchmark a hotlap target is set from.
events.qualifyingQualifying-specific events: lap improvements, eliminations, and position changes through Q1 to Q3.
weather.data-seriesAir and track temperature, humidity, and rainfall over the session — track evolution, measured.
telemetry.track-positionEvery car's live position on the circuit: lap fraction plus x/y coordinates, for an overlay or a map.
timing.dataPosition, gaps, lap and sector times — the running order a companion app is built on.
session.track-statusGreen, yellow, safetyCar, red — one named status, already resolved from the raw flag code.

Developer includes all 30 live data feeds, not just the ones above; the remaining 25 in the 55-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 both meter against your monthly delivery bucket; REST reads meter against the request rate limit instead.

Webhook

Push · default

Register an HTTPS endpoint and subscribe it to feeds. RaceHooks POSTs each event as it fires — typically well within a second. 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 sim & esports logic end to end before a live session ever runs. Free includes 5 sessions, Developer 10; Custom replays the full archive.

How Simulate works →
Upgrade · Custom tier

What the ML layer adds for sim & esports

Everything above is the observed record and a replay of it — enough to calibrate a sim and run a league night. Custom opens the archive and the modelled layer on top of it. On Custom, fourteen production ML models attach an analytics key to every payload you already receive — same feeds, same delivery, same code path.

The full historical archive, replayable

Self-serve replay is current-season and capped at distinct sessions. Custom lifts both — any session in the archive, as many times as you want, through the same delivery path.

True pace & mini-sector timing

analytics.true-pace strips fuel load, tyre age, and traffic out of a lap, and timing.mini-sectors shows which part of the corner the time came from — the two things a setup comparison actually needs.

Tyre cliff & compound modelling

analytics.tire-strategy gives next-compound probabilities and the tyre-cliff model predicts the lap performance drops away — a degradation curve with a prediction attached rather than a fit after the fact.

Talk to salesRead the model methodology →Custom also adds a delivery SLA, unlimited deliveries, and full-archive replay.

Start on the free tier.

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

Start buildingCompare plans