Skip to main content
Every decomposition, model, and chart in Off The Pace traces back to two upstream APIs and one rule: Bronze stores data exactly as the source returns it, and computes nothing. This page orients you to where the data comes from and how it’s shaped; the rest of the Data tab covers populating it yourself.
For a reviewer:
  • Decision: Bronze stores source data verbatim and computes nothing; every derived value lives downstream where it is version-controlled and tested.
  • Trade-off: raw data keeps its rough edges (nanosecond integers, undocumented enums, telemetry gaps), which the transform layer must absorb.
  • Proof: every write passes a data-quality gate and records a schema fingerprint, so source-side drift is detectable rather than silent.

Two sources, two purposes

FastF1

The primary timing source lap times, telemetry, weather, and race-control messages for every session.

Jolpica

The Ergast-compatible reference client official driver/constructor standings and classified pit stops.

What Bronze stores

Ingestion writes four fully-documented datasets per session, each Hive-partitioned by season and race:

Laps

One row per driver per completed lap sector times, compound, stint, pit timing, track status.

Telemetry

Continuous per-car samples within each lap speed, throttle, brake, gear, DRS state, position.

Weather

Periodic session-level atmospheric readings air and track temperature, humidity, wind, pressure.

Race Control

Every race-control broadcast flags, safety car and VSC deployments, incidents, penalties.
Ingestion also writes a handful of supplementary datasets alongside these four official results, track/session status timelines, circuit geometry, and the event schedule plus Jolpica’s reference standings and pit stops under data/bronze/reference/jolpica/. Each writer is independent and isolated by its own try/except, so one failing dataset never blocks the others. The full per-writer walkthrough lives on Architecture.
Bronze is dumb. Ingestion renames columns to snake_case but never computes a derived value, joins a table, or applies a business rule. Every physics term, every feature, every model lives downstream in transform/ and ml/, where it’s version-controlled, tested, and re-runnable without touching the API again.

Schema drift detection

FastF1’s own schema shifts between seasons a column renamed, a type changed, a field added. Every write computes a schema fingerprint: a SHA-1 hash of the sorted column names, recorded on the run manifest. Comparing fingerprints across runs turns silent drift into a detectable, queryable event instead of a downstream surprise see Manifest Report.
Neither source requires credentials. FastF1 caches to data/cache/ on disk; Jolpica is a public REST API with a politeness contract, not an auth contract.
Raw data has rough edges: time columns are nanosecond integers, several fields are undocumented numeric enums, and telemetry has expected gaps around safety cars and pit stops. See Data Quality and Known Issues before writing queries against Bronze directly.

Next

Sources

FastF1 and Jolpica in depth.

Bronze Schemas

Every column, every dataset.

Quality & Coverage

What’s checked, what blocks a write.

Get Started

Ingest your first race.