f1verse
The story layer for Formula 1 data. Data libraries fetch and tidy — f1verse tells you what happened: lead changes, laps led, event timelines, stint strategy, true race pace, and the live championship projection that broadcasts never show.
Zero dependencies. Standard library only, seasons 2023+.
pip install f1verse
import f1verse
race = f1verse.load(2026, 12) # year, round — no other library needed
race.laps_led() # {'ANT': 32, 'NOR': 31, 'HAM': 9}
race.leader_runs() # [{'abbr': 'NOR', 'from': 1, 'to': 4}, ...]
race.results()[7] # {'abbr': 'HUL', 'gap': '+1 LAP', ...}
race.race_pace() # median pace — pit/SC/VSC laps excluded by default
race.story() # one call, whole story, plain JSON
race.championship_prediction() # per-lap "if it ended now" title projection
race.team_radio() # timestamped clip URLs (nothing downloaded)
Using FastF1 already? Keep your workflow — the adapter takes a loaded
session (pip install f1verse[fastf1], adds telemetry & pre-2023 seasons):
story = f1verse.analyze(fastf1_session)
Why this exists
Everyone who builds on FastF1 rediscovers the same traps, and each fixes them slightly differently:
results['Time']is not a gap for lapped cars. The raw value can be smaller than a car that finished ahead (P7 +1:19.915vsP8 +36.049). No error, no warning — naive tables are silently wrong. →f1verse.format_gapapplies the broadcast convention (+1 LAP).- There is no API for "who led the race". Lead changes, laps led,
overtake-for-the-lead moments — every notebook reinvents them.
→
leader_runs,laps_led,timeline. - Race pace needs domain rules, not just a quicklap threshold: in/out
laps, SC/VSC laps, and laps failing FastF1's own 4-way accuracy check
must go. →
race_paceapplies all of it by default. - numpy scalars break
json.dumps. Every f1verse output is plain JSON-safe Python. → pipe results straight into web or video pipelines. - Data-quality warnings are only logged as text.
→
integrity_reportreturns them as structured data your pipeline can act on (hold publication, exclude laps, annotate).
The feeds FastF1 throws away
The official live-timing archive contains more than FastF1 parses. f1verse harvests three of the dropped feeds (through FastF1's own cache, same rate-limit etiquette):
f1verse.championship_prediction(session)
# per-lap "if the race ended now" projection of both championships,
# including the moments the projected champion changed
f1verse.team_radio(session)
# timestamped team-radio clips: [{'t', 'utc', 'driver_number', 'url'}]
# URLs only — nothing is downloaded or redistributed
f1verse.timing_stats(session)
# personal bests, best sectors, speed-trap figures
Design rules
- Zero required dependencies. The native loader speaks to public REST endpoints (OpenF1) and the official live-timing archive directly, with its own on-disk cache and polite pacing.
- FastF1 is respected, not replaced — optional adapter for telemetry, qualifying segments and pre-2023 history.
- Everything returned is plain JSON-safe Python.
- F1 domain rules are defaults, not options.
- Cross-checked where possible — e.g. lapped-car gaps are computed by convention and confirmed against a second source.
- Code only. No timing data, media, or images are bundled or redistributed; data is fetched by the end user.
Roadmap
- Full cross-validation layer (publish only when two sources agree)
- Overtake timeline (OpenF1
/overtakes) & undercut/overcut detection - Circuit & driver metadata joins (Jolpica, f1db)
- Korean localization package (
f1verse-ko) - Chart & vertical-video templates consuming f1verse JSON
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 library contains code only — no timing data, media, or images are included or redistributed; data is fetched by the end user from publicly accessible endpoints, subject to the respective providers' terms. Built on FastF1 (MIT).
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file f1verse-0.3.0.tar.gz.
File metadata
- Download URL: f1verse-0.3.0.tar.gz
- Upload date:
- Size: 18.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9169a4421bd2b53cda561778317498ed60993b9360da42133e96f15944e6618c
|
|
| MD5 |
151d70e6721431e467d4afeb24c35a1d
|
|
| BLAKE2b-256 |
fa0e6688d987d0800d69160ffdff3bfb5f7b6f42eb98c9de7f67badee6d6286e
|
Provenance
The following attestation bundles were made for f1verse-0.3.0.tar.gz:
Publisher:
publish.yml on jinsim/f1verse
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
f1verse-0.3.0.tar.gz -
Subject digest:
9169a4421bd2b53cda561778317498ed60993b9360da42133e96f15944e6618c - Sigstore transparency entry: 2647576023
- Sigstore integration time:
-
Permalink:
jinsim/f1verse@c6d5d6419872cbb1b2b802ca4ca7a3969bc7ebfd -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/jinsim
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c6d5d6419872cbb1b2b802ca4ca7a3969bc7ebfd -
Trigger Event:
push
-
Statement type:
File details
Details for the file f1verse-0.3.0-py3-none-any.whl.
File metadata
- Download URL: f1verse-0.3.0-py3-none-any.whl
- Upload date:
- Size: 19.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c63a125fa2ab270729a6dec527535d614e719f3a131038666400a4dcb2e8c62b
|
|
| MD5 |
6cd85be3c12a3ed2ab4c2e11c2d7bc6b
|
|
| BLAKE2b-256 |
3f4c3fb5d89f6af9aead00e9323ce1fb165acf2611860ce47b175b6d6d583cc8
|
Provenance
The following attestation bundles were made for f1verse-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on jinsim/f1verse
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
f1verse-0.3.0-py3-none-any.whl -
Subject digest:
c63a125fa2ab270729a6dec527535d614e719f3a131038666400a4dcb2e8c62b - Sigstore transparency entry: 2647576050
- Sigstore integration time:
-
Permalink:
jinsim/f1verse@c6d5d6419872cbb1b2b802ca4ca7a3969bc7ebfd -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/jinsim
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c6d5d6419872cbb1b2b802ca4ca7a3969bc7ebfd -
Trigger Event:
push
-
Statement type: