Skip to main content
fastf1 is the de-facto standard library for Formula 1 data in Python. The fastf1 project has done much for the F1 data community. tif1 started as a personal project with a different philosophy in a few areas. These areas are data-fetch granularity, API rate limits, ready-made charts, CDN-based access, and extra data. tif1 keeps a fastf1-compatible API, so the two libraries feel familiar side by side. This fact-checked comparison helps with that decision.

Comparison at a Glance


1. Fetch Only the Necessary Data — No Full-Session Downloads

The fastf1 approach

fastf1 is session-oriented by design. session.load() fetches the entire session up front:
For a single race, that means tens of megabytes of JSON per driver across all 20 drivers. Weather, track status, race control messages, and more add to the volume. Loading telemetry for all drivers alone is typically 100-300 HTTP requests. That volume is reasonable for a full-weekend analysis. Most of it goes unused when the analysis needs only a few laps.

The tif1 approach: lazy and fine-grained

In tif1, a session is a lightweight object. Data is fetched only when a property is accessed, and only the files needed for that access:

Why it matters

  • Faster iteration — first results appear in seconds, not minutes.
  • Disk space — the cache stores only the files actually used.
  • Bandwidth and energy — fewer transferred bytes reduce the environmental load, especially at scale.
  • Predictable cost — one lap equals one file. One session needs only a few files.

2. No API rate limits — a verified 500 requests/hour ceiling on fastf1’s data source

The 500 requests/hour limit, verified

fastf1 obtains its data from two upstream sources:
  1. The F1 live-timing API (unofficial, for telemetry and timing feeds).
  2. The Ergast-compatible jolpica-f1 API (open source, for lap times, results, and historical data). It replaces the old Ergast API, which was limited to roughly 250 requests per hour per IP.
The jolpica-f1 Rate Limits guide documents the following for unauthenticated access:
  • Burst limit: 4 requests per second
  • Sustained limit: 500 requests per hour
Requests above the limits receive HTTP 429 Too Many Requests with the message “Request was throttled”. The Terms of Use add that abuse or excessive use may result in temporary or permanent blocking. The same terms note that the limits decrease in the future as token-based access rolls out. The live-timing endpoints used for telemetry are not a public service. They are known to throttle and block clients that make too many requests.

When the limit matters

The 500 requests/hour ceiling is a real constraint worth planning around. Load patterns that can approach it include:
  • loops over an entire season (24 weekends × several sessions),
  • comparisons of a full grid across multiple races,
  • backtests or model training on many sessions,
  • background jobs that warm a cache.
These patterns can approach 500 requests quickly, especially with whole-session loads. This scenario led to the creation of tif1 for the app at tracinginsights.com/analysis.

Why tif1 has no rate limits

tif1 does not depend on those APIs for distribution. It serves pre-processed static JSON files from public GitHub data repositories (TracingInsights/{year}). Distribution runs through jsDelivr (primary), Hugging Face buckets (fallback), and StaticDelivr (backup). These free CDNs distribute open-source software worldwide. The result:
  • No API keys or accounts
  • No per-user or per-IP request quotas
  • No throttling on burst traffic
  • Automatic CDN failover, retries, and a circuit breaker built in
  • SQLite and in-memory LRU caching, so repeat accesses do not hit the network
Load any amount of data without watching a request counter.

3. Charts Included — 22 Optional One-Call Chart Helpers

Many users build visualizations by hand from fastf1’s raw DataFrames. For quick, repeatable plots, tif1 additionally bundles plot_*() helpers that handle the loading, filtering, and styling:

Real examples from the tif1 tutorials

tif1 native chart — top speeds by team, generated with a single call to tif1.plot_top_speeds

The full chart family

Every chart accepts shared filters: year, event, session, drivers/teams, save path, and DPI. Every chart also has a matching tutorial in the Tutorials section.

4. Works from anywhere — no IP restrictions

IP restrictions on the live-timing endpoints

fastf1’s telemetry flows come from the official F1 live-timing infrastructure, which is an internal service. Community discussions report that these endpoints reject requests from some sources:
  • VPNs are sometimes blocked — common VPN/proxy IP ranges may be rejected.
  • Data-center and cloud IPs are sometimes blocked — a VPS, cloud function, or CI runner can require workarounds.
  • Residential-IP workarounds appear in discussions for users who encounter these blocks.
These blocks do not affect every user. Users who encounter them see the benefit of CDN-based delivery.

The tif1 approach: global CDNs, no IP checks

tif1 serves files from StaticDelivr and jsDelivr, with Hugging Face buckets as a last-resort backup. These free CDNs serve millions of websites every day. CDNs are built to serve content to the entire internet, so there are:
  • No IP allowlists or blocks
  • No VPN/proxy detection
  • No residential-IP requirements
  • No keys, cookies, or sessions
Any network can pull tif1 data identically and at the same speed. Home broadband, a university campus, AWS/GCP/Azure, a Raspberry Pi, or a GitHub Actions runner all work. The CDN edge is close to every user.

5. Extra data — mini sectors and more

Mini-sector data

Formula 1 timing divides a lap into 3 sectors. Each sector divides into 8 mini-sectors — 24 mini-sectors around the lap. Mini-sector timing shows where drivers gain and lose time more precisely than the three conventional sectors. Teams and broadcasters use it for detailed performance analysis. fastf1’s public API focuses on lap timing, telemetry, and results. The TracingInsights data pipeline behind tif1 provides a few extras outside that scope:
  • Race-control messages include the affected mini-sector in the Sector column (1-24), for example a yellow flag in mini-sector 12. Flags are tracked per mini-sector, not just per conventional sector.
  • Lap data is enriched with mini-sector splits sourced from OpenF1 for per-lap resolution below the S1/S2/S3 level.
In tif1:

A few more extras


Honest trade-offs: when fastf1 still makes sense

Both libraries have strengths, and fastf1 remains the better choice in a few situations:
  • Live timing. tif1 is an archive library (2018-current). Real-time lap and telemetry data during a live session needs fastf1.
  • Freshest data. tif1 data is published ~30 minutes after a session ends, versus ~20-25 minutes for fastf1. The 2-5 minute gap pays for enrichment and processing.
  • Deep fastf1-internal dependencies. A codebase that relies on fastf1 internals beyond the documented API surface (for example fastf1.ergast, fastf1.livetiming) needs those specific modules. tif1 does not include them.

Migration

Because tif1 keeps the fastf1-compatible schema (same column names, types, and ordering), migrating is typically a one-line import change:
See the Migration from fastf1 guide for the step-by-step walkthrough, or jump straight into the Quickstart.

Quickstart

Load a first session in under 30 seconds.

Charts API

Browse all 22 native chart functions.

Migration Guide

Move an existing fastf1 project to tif1.

Tutorials

See tif1 charts applied to real race analysis.
Last modified on September 8, 2026