RaceHooks for Trading & Quant Research

Price the race
before the market reprices.

The events that move an F1 market — grid penalties, steward decisions, safety cars, rain onset, a stop that goes wrong — pushed to your desk as they happen rather than when your poll comes round. Replay real sessions through that same feed and test your pricing before a cent is at risk.

Everything on this page ships on Developer$99/mo, self-serve.
Repricing state
Running orderLAP 34/53 · SAFETY CAR
CarPosIntervalTyreStops
NORP1MED · 141
VERP2+2.418HARD · 32
LECP3+0.907MED · 161
PIAP4+3.552HARD · 32
01 · What you build

What trading teams build on RaceHooks

In-play pricing & automated trading

Position, interval, sector times, tyre state, and pit activity arrive as they change, so your model reprices on the event rather than on a timer. A safety car is the sharpest repricing moment in the race and it reaches you as a typed message, not as a diff you have to spot.

Built from
timing.datarace-control.messagesevents.racepit.stops

Pre-race market setup

Grid penalties and steward decisions publish before lights out and move an outright market on their own. Take them as structured events with the driver, the offence, and the penalty already parsed — a grid drop applied to your starting-position assumptions the moment it is official.

Built from
race.grid-penaltyregulatory.stewards-decisionsession.info

Weather-driven repricing

Rain is the single largest variance event in an F1 race, and it starts locally. Onset and clearing fire as discrete events off circuit-side readings, with the full weather series behind them — so a wet-race position turns over on the measurement, not on a forecast you refreshed five minutes ago.

Built from
weather.rain-onsetweather.rain-clearedweather.data-series

Backtesting & research

Replay a real session at any speed from 0.1× to 120× and drive your pricing logic with the exact payloads a live race would have sent, in the order it sent them. Behind that sits lap-by-lap timing, stints, pit stops, and results back to 1950 for the offline fit.

Built from
simulate/sessionshistorical/:season/:round/lapshistorical/:season/:round/stints
02 · What your users see

One payload, straight onto the screen

A trading desk does not want a dashboard — it wants the moment, typed, with the driver attached, before the market moves. These are the three shapes that takes: the alert that fires, the state you reprice against, and the path a moment on track takes to reach you.

Desk alert
# f1-trading
RH
racehooksAPP09:41
GRID PENALTY — 5 places
NOR (Car 4) · impeding in Q1. Applied to the race grid.
RH
racehooksAPP14:22
SAFETY CAR DEPLOYED
Lap 34 of 53. Field compresses; the pit window opens for everyone yet to stop.
RH
racehooksAPP14:44
RAIN ONSET
Rainfall detected at the circuit. weather.data-series carries the trend behind it.

Route grid penalties, steward decisions, and race control straight into the desk. Because it is push, the alert fires on the decision — not on your next poll.

Moment to desk
ON TRACKRace control declares a safety car
The message enters the live timing stream.
FEEDNormalized, typed, and driver-resolved
race-control.messages and events.race carry it with the cause attached — canonical driver identity, not a name string.
YOUR DESKDelivered and signed
Webhook POST or SSE frame, HMAC-SHA256 over the raw body, retried with backoff and logged.
Sub-second delivery · HMAC-signed · every attempt logged Replay the same sequence on demand with /v1/simulate before you trade it.

The ordering is the product. A poll loop learns about a safety car on its next tick; a push subscriber learns about it when race control says so.

↑ all of it, from this payload
POST to your endpoint — race.grid-penalty, published before lights out
{
  "feed": "race.grid-penalty",
  "sessionId": "2026-italy_r",
  "utc": "2026-09-06T09:41:02.117Z",
  "data": {
    "event": "Italian Grand Prix",
    "season": 2026,
    "session": "Qualifying",
    "publishedAt": "2026-09-06T09:40:44.000Z",
    "driver": { "driverId": "norris-lando", "constructorId": "mclaren", "number": "4",
                "tla": "NOR", "name": "Lando Norris", "team": "McLaren" },
    "carNumber": 4,
    "competitor": "McLaren Formula 1 Team",
    "penaltyType": "grid_drop",
    "gridPenaltyPositions": 5,
    "infringement": "Impeding during Q1",
    "decision": "5 grid place penalty for the next race in which the driver participates.",
    "documentUrl": "https://www.fia.com/…/decision.pdf"
  }
}

# Signed: X-RaceHooks-Signature: sha256=…  (HMAC-SHA256 over the raw body)
# Retried with exponential backoff; every attempt logged in your console.

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
POST/v1/webhooksSubscribe an endpoint to a feed. One endpoint can carry the whole live catalog; filter by driver at subscription time when a strategy only trades a subset.
GET/v1/streamServer-Sent Events over one long-lived connection — the path for a desk behind a firewall with no public webhook host.
GET/v1/simulate/sessionsReplayable sessions. Prepare one and it delivers to your real endpoint at any speed from 0.1× to 120× — the same payloads, same order, no race day required. Developer unlocks 10 distinct current-season sessions; the full archive is Custom.
GET/v1/historical/:season/:round/lapsLap-by-lap times for any session back to 1950 — the offline fit behind a live model.
GET/v1/historical/:season/:round/stintsCompound and stint plan per driver, with pitstops on the sibling route for the stop that ended each one.
GET/v1/data/races/:raceId/qualifyingQualifying result for a round — the starting-grid input before grid penalties are applied.
Feeds you subscribe to
race.grid-penaltyGrid drops and pit-lane starts as the stewards publish them — the pre-race picture, before lights out.
regulatory.stewards-decisionParsed steward decisions: driver, offence, penalty, and the session it applies to.
race-control.messagesSafety car, VSC, red flag, and track status in race control's own wording — the sharpest repricing moments in the race.
timing.dataPosition, leader gap and interval, lap and sector times — the state a live price is set against.
events.race40+ synthesized events including overtakes, retirements, and pit stops, each carrying the driver it belongs to.
weather.rain-onsetFires when rainfall begins at the circuit. weather.rain-cleared closes it; weather.data-series is the trend behind both.
pit.stopsStops as they complete, with the stationary time on pit.lane-times — a slow stop is a position, and a position is a price.

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 trading 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 trading

Everything above is the input side: what happened, typed and fast, for a desk that builds its own prices. Custom adds the priced surfaces — our own distributions over the same race, so you can trade them or mark your own model against them. On Custom, fourteen production ML models attach an analytics key to every payload you already receive — same feeds, same delivery, same code path.

Position distributions & race odds

analytics.race-odds carries a full position distribution per driver from a continuous-time Markov model — win, podium, and points probabilities recomputed as the race moves, not a static pre-race line.

Championship & standings projection

standings.projection simulates the title race from the current order; analytics.championship-probability resolves both championships post-race. GET /v1/data/seasons/:year/championship-probability is the pull-side equivalent.

Winning margin & gap projection

analytics.winning-margin projects the P1–P2 gap with percentile bands, and analytics.gap-projection does the same to the leader for every car — the margin and match-up markets, priced.

Head-to-head and position-at-lap research

GET /v1/analytics/h2h and /v1/analytics/position-at-lap answer the two questions a research desk asks most, over the historical corpus rather than one race — plus full-archive replay for a backtest that is not capped at the current season.

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