Skip to main content

A production-grade, asynchronous Python API wrapper for the OpenF1 API.

Project description

๐ŸŽ๏ธ pyopenf1

A production-grade, asynchronous Python wrapper for the OpenF1 API.

PyPI CI Python versions License


โœจ Features

  • Fully Async โ€” Built on httpx.AsyncClient with first-class async/await support.
  • Sync Wrapper โ€” OpenF1Client for users who don't need async.
  • All 18 Endpoints โ€” Complete coverage: telemetry, laps, drivers, sessions, weather, pit stops, stints, overtakes, race control, team radio, championship standings, results, starting grid, and more.
  • Pydantic V2 Models โ€” Every response is validated and returned as a strict, typed model.
  • Auto-Retry โ€” Exponential backoff on 429/5xx via tenacity.
  • Rate Limiting โ€” Built-in client-side throttle (3 req/s free tier).
  • Response Caching โ€” Optional in-memory TTL cache.
  • CLI Tool โ€” Query the API from your terminal.
  • DataFrame Support โ€” Optional pandas integration.
  • Production-Ready โ€” Custom exceptions, structured logging, connection pooling.

๐Ÿ“ฆ Installation

pip install pyopenf1

With pandas support:

pip install pyopenf1[pandas]

๐Ÿš€ Quickstart

Async (recommended)

import asyncio
from pyopenf1 import AsyncOpenF1Client

async def main() -> None:
    async with AsyncOpenF1Client() as client:
        # Fetch telemetry
        car_data = await client.telemetry.get_car_data(driver_number=1, session_key=9159)
        for entry in car_data[:5]:
            print(f"Speed: {entry.speed} km/h | Gear: {entry.n_gear}")

        # Fetch drivers
        drivers = await client.drivers.get_drivers(session_key=9158)
        for d in drivers[:3]:
            print(f"#{d.driver_number} {d.full_name} - {d.team_name}")

asyncio.run(main())

Sync

from pyopenf1 import OpenF1Client

with OpenF1Client() as client:
    drivers = client.drivers.get_drivers(session_key=9158)
    for d in drivers:
        print(f"{d.name_acronym} - {d.team_name}")

CLI

pyopenf1 car-data --driver 1 --session 9159 --format table
pyopenf1 drivers --session 9158 --format json
pyopenf1 weather --meeting 1208 --format csv --output weather.csv

DataFrame

from pyopenf1.ext.pandas import to_dataframe

data = await client.telemetry.get_car_data(driver_number=1)
df = to_dataframe(data)
print(df.describe())

โš™๏ธ Configuration

async with AsyncOpenF1Client(
    cache_ttl=300.0,        # Cache responses for 5 minutes
    max_retries=5,          # Retry up to 5 times
    max_per_second=6.0,     # Sponsor-tier rate limit
    max_per_minute=60.0,
) as client:
    ...

๐Ÿ“ก Available Endpoints

Namespace Methods OpenF1 Endpoints
client.telemetry get_car_data(), get_location() /car_data, /location
client.sessions get_sessions(), get_meetings() /sessions, /meetings
client.drivers get_drivers() /drivers
client.timing get_laps(), get_intervals(), get_positions() /laps, /intervals, /position
client.race get_race_control(), get_pit_stops(), get_stints(), get_overtakes() /race_control, /pit, /stints, /overtakes
client.championship get_drivers_championship(), get_teams_championship() /championship_drivers, /championship_teams
client.results get_session_results(), get_starting_grid() /session_result, /starting_grid
client.weather get_weather() /weather
client.team_radio get_team_radio() /team_radio

๐Ÿ—๏ธ Architecture

pyopenf1/
โ”œโ”€โ”€ __init__.py              # Public API surface
โ”œโ”€โ”€ client.py                # AsyncOpenF1Client facade
โ”œโ”€โ”€ sync_client.py           # OpenF1Client (sync wrapper)
โ”œโ”€โ”€ cli.py                   # Click CLI
โ”œโ”€โ”€ exceptions.py            # Custom exception hierarchy
โ”œโ”€โ”€ core/
โ”‚   โ”œโ”€โ”€ http_client.py       # httpx wrapper + retry + logging
โ”‚   โ”œโ”€โ”€ rate_limiter.py      # Token-bucket rate limiter
โ”‚   โ””โ”€โ”€ cache.py             # In-memory TTL cache
โ”œโ”€โ”€ models/                  # Pydantic V2 data models
โ”‚   โ”œโ”€โ”€ telemetry.py         # CarData, Location
โ”‚   โ”œโ”€โ”€ session.py           # Session, Meeting
โ”‚   โ”œโ”€โ”€ driver.py            # Driver
โ”‚   โ”œโ”€โ”€ timing.py            # Lap, Interval, Position
โ”‚   โ”œโ”€โ”€ race.py              # RaceControl, Pit, Stint, Overtake
โ”‚   โ”œโ”€โ”€ championship.py      # ChampionshipDriver, ChampionshipTeam
โ”‚   โ”œโ”€โ”€ results.py           # SessionResult, StartingGrid
โ”‚   โ”œโ”€โ”€ weather.py           # Weather
โ”‚   โ””โ”€โ”€ team_radio.py        # TeamRadio
โ”œโ”€โ”€ endpoints/               # API endpoint classes
โ”‚   โ”œโ”€โ”€ telemetry_api.py
โ”‚   โ”œโ”€โ”€ session_api.py
โ”‚   โ”œโ”€โ”€ driver_api.py
โ”‚   โ”œโ”€โ”€ timing_api.py
โ”‚   โ”œโ”€โ”€ race_api.py
โ”‚   โ”œโ”€โ”€ championship_api.py
โ”‚   โ”œโ”€โ”€ results_api.py
โ”‚   โ”œโ”€โ”€ weather_api.py
โ”‚   โ””โ”€โ”€ team_radio_api.py
โ””โ”€โ”€ ext/
    โ””โ”€โ”€ pandas.py            # Optional DataFrame integration

๐Ÿงช Development

# Install dev dependencies
poetry install

# Lint & format
poetry run ruff check .
poetry run ruff format .

# Type check
poetry run mypy pyopenf1/

# Test
poetry run pytest -v

# Build docs
poetry run mkdocs serve

๐Ÿ“„ License

Distributed under the MIT License. See LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyopenf1-0.1.2.tar.gz (21.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyopenf1-0.1.2-py3-none-any.whl (33.6 kB view details)

Uploaded Python 3

File details

Details for the file pyopenf1-0.1.2.tar.gz.

File metadata

  • Download URL: pyopenf1-0.1.2.tar.gz
  • Upload date:
  • Size: 21.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pyopenf1-0.1.2.tar.gz
Algorithm Hash digest
SHA256 a08369dd5308f22f3e996f1c651e828663c5b9badbc3b4ff4f2ea366bb7f8930
MD5 73e69f96c1dcdc4f378f871e8f94ad7b
BLAKE2b-256 53b0178beeeab0e83b0c9d6a43ca5b64fbdc6ce65144d2be49b76f95db4a6a1d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenf1-0.1.2.tar.gz:

Publisher: publish.yml on DivyamSamarwal/pyopenf1

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyopenf1-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: pyopenf1-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 33.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pyopenf1-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 b7442de4241e10276b22b1b9475e7473408933ad78a5b5d630177205a87919b3
MD5 10ebd1acb2117ae639bc87ca5ef3e1b5
BLAKE2b-256 1f5779ffc893d0f64be9199a1a463d77c340e6cf363da3c8a2aabf6ef6983235

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenf1-0.1.2-py3-none-any.whl:

Publisher: publish.yml on DivyamSamarwal/pyopenf1

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page