Formula 1 data with the domain rules already applied
f1verse answers what happened in this race — lead changes, laps led, the timeline, stints, race pace — and tells you whether the data is complete and final enough to publish. Zero dependencies, standard library only, seasons 2023 onward with records back to 1950.
pip install f1verse
>>> import f1verse
>>> race = f1verse.load(2026, 12)
>>> race.laps_led()
{'ANT': 32, 'NOR': 31, 'HAM': 9}
>>> race.story() # one call, whole race, plain JSON
>>> race.quality_report() # is it safe to publish yet?
For agents
The bundled MCP server needs no install step and no dependencies — see the MCP server page .
{"mcpServers": {"f1verse": {"command": "uvx",
"args": ["--from", "f1verse", "f1verse-mcp"]}}}
10 tools: f1_race_story, f1_race_brief, f1_session_results, f1_weekend_sessions, f1_season_status, f1_standings, f1_driver_career, f1_data_quality, f1_tyre_wear, f1_deleted_laps.
Questions this answers
How do I give an AI agent access to Formula 1 data?Point any MCP client at uvx --from f1verse f1verse-mcp. There is no install step and no dependency tree: the server is s…
How do I get Formula 1 race results in Python?Install f1verse and call load(year, round). It has no dependencies and needs no API key, client object or configuration …
How do I get an entire F1 race as JSON in one call?Call race.story(). One request returns results, lead changes, laps led, the event timeline, tyre stints, race pace and s…
How do I know when Formula 1 results are final?Call race.quality_report(). It returns a lifecycle state — provisional, settled, final or corrected — alongside per-fiel…
How do I detect that an F1 result changed after publication?Persist race.snapshot() and compare it later with f1verse.diff(before, after). You get a field-level list of what the so…
How do I check Formula 1 data against an independent source?Call race.crosscheck(). It recomputes what it can from a second, independent feed and reports agreement, disagreement, o…
How do I tell whether an undercut worked, in code?Call f1verse.pit_exchanges(race). It pairs the stops that actually traded track position and returns a verdict per excha…
How do I get F1 qualifying results with the right gaps?Call f1verse.load_session(year, round, "Qualifying"). Gaps are measured to the fastest lap of that segment, and each dri…
How do I run a Formula 1 pipeline on a schedule without double-posting?Call f1verse.due(year, processed=[...]). It returns sessions that have finished, settled past the flag, and are not in t…
How do I generate F1 race summaries without hallucinated numbers?Build the text from f1verse.race_facts(race) and check the output with f1verse.verify(text, facts), which rejects any nu…
How do I measure F1 tyre degradation from race data?Call f1verse.stint_degradation(race). It returns seconds lost per lap for each stint, computed on fuel-normalised clean …
How do I find F1 lap times that were deleted by the stewards?Call f1verse.lap_deletions(messages), or the f1_deleted_laps tool. It returns every deletion race control announced — ca…
How do I read the Formula 1 live timing feed in Python?Use f1verse.sources.liveclient.LiveFeed. It speaks the official SignalR feed over a WebSocket implemented in the standar…
f1verse 0.11.1 · MIT · github.com/jinsim/f1verse
· llms.txt
Unofficial fan project. Not affiliated with, endorsed by, or associated with
Formula 1, FIA, FOM, or any F1 team. F1, FORMULA 1 and related marks are
trademarks of Formula One Licensing BV. This site documents code only — no
timing data, media or images are bundled or redistributed; data is fetched by
the end user from publicly accessible endpoints.