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.3.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.3-py3-none-any.whl (33.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pyopenf1-0.1.3.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.3.tar.gz
Algorithm Hash digest
SHA256 329e8f137738117a2783bb55fac90cc924b66d40d8c3dfbde3b41d369e4d56c8
MD5 3671548aad5d85b126c042db4605e170
BLAKE2b-256 0393bbda23151bbea2eb0884b3c8ffe18f14451b9766b0e95e84d53fb08d038b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenf1-0.1.3.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.3-py3-none-any.whl.

File metadata

  • Download URL: pyopenf1-0.1.3-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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 e5e51d957aba0dc80995f798ba833167951f3fe27dcec66eb84cc199f0167d09
MD5 f052dbc9a5f1ab7304db3263ea9b3d12
BLAKE2b-256 38deccbc6949d72a2746716ce5eeca092f0996fe215663804550b66d61724b44

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenf1-0.1.3-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