Access endurance racing timing & results data in Python — inspired by FastF1.
Project description
EndurancePy
Access endurance racing timing & results data in Python — the way FastF1 does it for Formula 1.
What is EndurancePy?
EndurancePy is a Python package that aims to make endurance racing data as easy to analyse as FastF1 made Formula 1 data. It loads and exposes timing and results data — lap times, sector times, stints, pit stops, classifications, positions (overall and per class), weather and flag/track status — as convenient, pandas-based objects, primarily from the publicly available Al Kamel Systems timing archives.
Inspired by FastF1. EndurancePy deliberately mirrors FastF1's design and API surface (
get_session(),Session.load(),Session.laps,Session.results,pick_*filters, an on-disk cache, aplottinghelper module, …) so that anyone familiar with FastF1 feels at home. EndurancePy is an independent project and is not affiliated with FastF1, the FIA, the ACO, IMSA, Al Kamel Systems, or any championship.
Target championships
| Series | Full name | Timing source |
|---|---|---|
| WEC | FIA World Endurance Championship | Al Kamel |
| ELMS | European Le Mans Series | Al Kamel |
| AsLMS | Asian Le Mans Series | Al Kamel |
| LMC | (Michelin) Le Mans Cup | Al Kamel |
| IMSA | IMSA SportsCar Championship | Al Kamel (imsa.results.alkamelcloud.com) |
Good news for the implementation: all of these series are timed by Al Kamel, so a single parser can cover them all — only the base host and minor URL details differ.
Status
🟡 Alpha. The core works end-to-end (verified against the live portal): sessions, laps, results, schedules, weather, track status, plotting and standings. APIs may still change. Contributions welcome (see Contributing).
The first goal is explicit: offer the same content as FastF1 wherever the underlying data exists. Two structural limitations are known up front: endurance racing has no public car telemetry (no speed/RPM/gear/throttle/ brake/GPS streams) and no normalised historical database equivalent to Ergast — everything else (calendars, sessions, classifications, laps/sectors/ stints/pit data, weather, flags) is within reach from the public timing archives.
Install
pip install endurancepy # once released on PyPI
pip install "endurancepy[plot]" # with the plotting extra (matplotlib)
# from a checkout:
pip install -e ".[dev]"
Usage
The API mirrors FastF1, with an added series axis (several championships coexist). Today, a session loads from an Analysis CSV (path, bytes or URL); automatic discovery of remote files is not implemented yet.
import endurancepy as ep
ep.Cache.enable_cache("./endurancepy-cache")
# Load a session from an Analysis CSV
session = ep.get_session(2024, series="WEC", event="Le Mans", session="Race")
session.load(source="path/to/23_Analysis_Race.CSV")
# Classification (per car / per class)
session.results
session.results.pick_classes("HYPERCAR")
session.cars # car numbers in finishing order
# Laps
laps = session.laps
laps.pick_cars(["7", "8"])
laps.pick_classes("LMGT3")
laps.pick_drivers("Kamui KOBAYASHI")
fastest = laps.pick_fastest()
# Derived side data
session.track_status # green / FCY / SC / code 60 / red
See the usage guide and runnable examples/ (scripts + a Jupyter notebook) for more.
Roadmap
- Inventory FastF1's full content and API surface
- Map FastF1 features → endurance data availability (Al Kamel)
- License & project groundwork
- Al Kamel client + two-stage cache
-
AnalysisCSV parser →Laps(+pick_*filters) -
SessionResults(per car & per class), derived from laps - Track-status timeline (flags / FCY / SC / code 60)
-
Session.loadfrom a file/bytes/URL + parsed-laps caching - Weather CSV parser + result-file discovery (verified formats)
- Race Classification CSV parser →
SessionResults - Auto-discovery:
Session.load(season=...)finds & downloads the files -
Event/EventSchedule+list_seasons(browse seasons; year auto-resolves) -
plottingcolour helpers (by class / manufacturer) - Championship standings (configurable points calculator)
- Docs, tests, packaging & PyPI release
How it relates to FastF1
| FastF1 | EndurancePy | Notes |
|---|---|---|
fastf1.get_session() |
ep.get_session(..., series=...) |
+ series axis |
Session.load() |
Session.load() |
downloads & parses Al Kamel files |
Session.laps (Laps) |
Session.laps (Laps) |
+ Class, CarNumber, Manufacturer, PositionInClass |
Session.results (SessionResults) |
Session.results |
per car/crew & per class |
Lap.get_telemetry() (Telemetry) |
— | no public endurance telemetry |
fastf1.Cache |
ep.Cache |
on-disk cache (essential for 24h races) |
fastf1.plotting |
ep.plotting |
colours by class/team/manufacturer |
fastf1.ergast |
ep.standings (later) |
rebuilt from results |
Contributing
EndurancePy is an open, community project and contributions are welcome — whether it's code, documentation, test data, or simply reporting which series / seasons you'd like to see supported.
Please read CONTRIBUTING.md to get started, and note that all participation is governed by our Code of Conduct.
A good first step is to open an issue describing what you'd like to work on.
Data sources & legal note
EndurancePy is built around publicly published endurance timing archives
(Al Kamel Systems results portals; official championship sites such as
fiawec.com, imsa.com). It is an unofficial, community project for
analysis and research purposes.
- All championship names, logos and data remain the property of their respective owners (FIA, ACO, IMSA, the championships, and Al Kamel Systems).
- Al Kamel Systems explicitly asserts ownership of its timing data and warns against redistribution without consent. EndurancePy is therefore designed to download and parse data for personal/research use only — it does not bundle, ship, or republish any raw timing archives. Please do the same.
- Always respect the terms of service and
robots.txtof any site you fetch from, and be considerate with request rates (the built-in cache exists partly for this reason). - This project is not affiliated with, endorsed by, or associated with any of the above organisations.
License
MIT © 2026 Romain Flambard and the EndurancePy contributors — the same permissive license as FastF1.
Acknowledgements
- FastF1 by theOehrly & contributors, the inspiration and design reference for this project.
- Al Kamel Systems, whose public timing archives make endurance data analysis possible.
Project details
Release history Release notifications | RSS feed
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 endurancepy-0.2.0.tar.gz.
File metadata
- Download URL: endurancepy-0.2.0.tar.gz
- Upload date:
- Size: 84.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1f6789c0f402642b0ba519ba621bc15bcefd3153a6c0082e2e2a4c6824a16912
|
|
| MD5 |
1b54cf2ee971e5a3937793ac94ecfe3c
|
|
| BLAKE2b-256 |
1e8b254f4d5db46357aae4458b5c10528a3fa8a80cf82ffcf9e8a8bffe9488ee
|
Provenance
The following attestation bundles were made for endurancepy-0.2.0.tar.gz:
Publisher:
release.yml on RomainFl50/EndurancePy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
endurancepy-0.2.0.tar.gz -
Subject digest:
1f6789c0f402642b0ba519ba621bc15bcefd3153a6c0082e2e2a4c6824a16912 - Sigstore transparency entry: 1861817984
- Sigstore integration time:
-
Permalink:
RomainFl50/EndurancePy@1546726c4343904fb12459e32d843bb6be577a58 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/RomainFl50
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1546726c4343904fb12459e32d843bb6be577a58 -
Trigger Event:
push
-
Statement type:
File details
Details for the file endurancepy-0.2.0-py3-none-any.whl.
File metadata
- Download URL: endurancepy-0.2.0-py3-none-any.whl
- Upload date:
- Size: 43.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6321d7217784f3a88a795d262dc81496cdb0c248fcb17557380fb2cfd82a049f
|
|
| MD5 |
974003adab8c6e3e8bb502629912bb5f
|
|
| BLAKE2b-256 |
e368eaabed66a90b3925c869850daec44cde1ef69a56e6bded604460a3f76640
|
Provenance
The following attestation bundles were made for endurancepy-0.2.0-py3-none-any.whl:
Publisher:
release.yml on RomainFl50/EndurancePy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
endurancepy-0.2.0-py3-none-any.whl -
Subject digest:
6321d7217784f3a88a795d262dc81496cdb0c248fcb17557380fb2cfd82a049f - Sigstore transparency entry: 1861818108
- Sigstore integration time:
-
Permalink:
RomainFl50/EndurancePy@1546726c4343904fb12459e32d843bb6be577a58 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/RomainFl50
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1546726c4343904fb12459e32d843bb6be577a58 -
Trigger Event:
push
-
Statement type: