# OpenF1 Formula 1 Telemetry Scraper (`parseforge/openf1-f1-telemetry-scraper`) Actor

Export Formula 1 sessions, drivers, laps, pit stops, intervals, weather, and live car telemetry from the OpenF1 live data source. Filter by year, session, driver, and meeting to get historical and live F1 race data.

- **URL**: https://apify.com/parseforge/openf1-f1-telemetry-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Sports, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $13.00 / 1,000 result items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 🏎️ OpenF1 Formula 1 Telemetry Scraper

> 🚀 **Export Formula 1 sessions, laps, telemetry, weather, and team radio in seconds.** Pull historical and live F1 data from 2023 onwards across **12 data modes**, filterable by year, session, driver, and meeting. No API key, no registration, no scraping browser.

> 🕒 **Last updated:** 2026-05-22 · **📊 50+ fields** per record · **🏎️ 12 data modes** · **📅 2023-present coverage** · **🌍 every race weekend**

The **OpenF1 Formula 1 Telemetry Scraper** exports the open F1 live data catalog and returns up to **50+ structured fields per record** across sessions, race weekends, drivers, laps, intervals, pit stops, weather, in-car telemetry, tyre stints, position changes, race control messages, and team radio recordings. The underlying feed mirrors the official Formula 1 timing stream and has been one of the most cited open motorsport sources since 2023.

Coverage spans **every Grand Prix weekend from the 2023 season onwards**, including Sprint Saturdays, Sprint Shootouts, qualifying sessions, free practice, and full Grand Prix races. Records are returned as CSV, Excel, JSON, or XML in under a minute. All filters run on the source, so you skip every parser and reverse-engineering step.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| F1 analysts, fantasy & betting platforms, sports media, telemetry hobbyists, data scientists, broadcasters, racing strategists | Driver and team performance dashboards, fantasy league scoring, lap-by-lap timing widgets, weather-correlated strategy models, archival race datasets, in-car telemetry ML training |

---

### 📋 What the OpenF1 Scraper does

Twelve data modes in a single Actor:

- 🏁 **Sessions.** Every practice, qualifying, sprint, and race session with circuit, country, GMT offset, and timestamps.
- 🏆 **Meetings.** Full race weekend metadata (Grand Prix name, official name, circuit image, country flag).
- 👤 **Drivers.** Per-session driver lineup with team name, driver number, and full name.
- ⏱️ **Laps.** Lap-by-lap duration plus per-sector times for every car on track.
- 📏 **Intervals.** Gap-to-leader and interval between successive cars during a session.
- 🛠️ **Pit stops.** Pit duration and lap number for every stop.
- 🌦️ **Weather.** Air and track temperature, humidity, wind speed sampled live.
- 🚗 **Car telemetry.** Speed, throttle, brake, RPM, gear, and DRS state per car.
- 🛞 **Tyre stints.** Compound, stint number, lap range, and tyre age at start.
- 📍 **Position changes.** Live running order updates throughout a session.
- 🚦 **Race control.** Yellow flags, virtual safety car, blue flags, and incident messages.
- 📻 **Team radio.** Direct links to original team radio recordings per driver.

Each record carries cross-mode keys (`sessionKey`, `meetingKey`, `driverNumber`) so you can JOIN sessions to laps, weather, telemetry, or stints in your warehouse.

> 💡 **Why it matters:** Formula 1 timing data powers fantasy leagues, betting models, broadcast graphics, and strategy ML pipelines. Building your own ingestion pipeline means decoding live timing protocols, handling sector splits, and re-syncing on every red flag. This Actor skips all of that.

---

### 🎬 Full Demo

_🚧 Coming soon: a 3-minute walkthrough showing how to go from sign-up to a downloaded telemetry dataset._

---

### ⚙️ Input

<table>
<thead>
<tr><th>Input</th><th>Type</th><th>Default</th><th>Behavior</th></tr>
</thead>
<tbody>
<tr><td><code>maxItems</code></td><td>integer</td><td><code>10</code></td><td>Records to return. Free plan caps at 10, paid plan at 1,000,000.</td></tr>
<tr><td><code>mode</code></td><td>string</td><td><code>"sessions"</code></td><td>One of 12 data modes: sessions, meetings, drivers, laps, intervals, pit, weather, car_data, stints, position, race_control, team_radio.</td></tr>
<tr><td><code>year</code></td><td>integer</td><td><code>2024</code></td><td>Season year. Applies to sessions, meetings, and drivers.</td></tr>
<tr><td><code>sessionType</code></td><td>string</td><td><code>null</code></td><td>Race, Qualifying, Practice, Sprint, Sprint Shootout, or Sprint Qualifying.</td></tr>
<tr><td><code>sessionKey</code></td><td>integer</td><td><code>null</code></td><td>Specific session ID. Required for laps, intervals, pit, weather, car_data, stints, position, race_control, team_radio.</td></tr>
<tr><td><code>meetingKey</code></td><td>integer</td><td><code>null</code></td><td>Specific race weekend ID.</td></tr>
<tr><td><code>driverNumber</code></td><td>integer</td><td><code>null</code></td><td>Filter by driver number (1 = Verstappen, 44 = Hamilton, etc.).</td></tr>
</tbody>
</table>

**Example: every 2024 race session.**

```json
{
    "maxItems": 50,
    "mode": "sessions",
    "year": 2024,
    "sessionType": "Race"
}
````

**Example: lap-by-lap times for a single race session.**

```json
{
    "maxItems": 1000,
    "mode": "laps",
    "sessionKey": 9462
}
```

> ⚠️ **Good to Know:** lap, telemetry, weather, and radio modes need a `sessionKey` to scope the query. Run the `sessions` mode first to discover the keys you want, then pass them into the deeper modes. Car telemetry is sampled at high frequency, so a single race session can return hundreds of thousands of rows.

***

### 📊 Output

Each record is tagged with a `recordType` and carries the relevant subset of **50+ fields**. Download the dataset as CSV, Excel, JSON, or XML.

#### 🧾 Schema

| Field | Type | Example |
|---|---|---|
| 🖼️ `imageUrl` | string | null | `"https://media.formula1.com/.../bahrain.jpg"` |
| 🏷️ `recordType` | string | `"sessions"` |
| 🔑 `sessionKey` | number | `9462` |
| 🔑 `meetingKey` | number | `1228` |
| 🔢 `driverNumber` | number | null | `1` |
| 👤 `fullName` | string | null | `"Max Verstappen"` |
| 🏁 `teamName` | string | null | `"Red Bull Racing"` |
| 🏷️ `sessionName` | string | null | `"Race"` |
| 🎯 `sessionType` | string | null | `"Race"` |
| 🏎️ `circuitShortName` | string | null | `"Sakhir"` |
| 🌐 `countryName` | string | null | `"Bahrain"` |
| 📍 `location` | string | null | `"Sakhir"` |
| 📆 `dateStart` | ISO 8601 | `"2024-02-21T07:00:00+00:00"` |
| 📆 `dateEnd` | ISO 8601 | `"2024-02-21T16:00:00+00:00"` |
| 📅 `year` | number | `2024` |
| ⏱️ `lapNumber`, `lapDuration` | number | `12, 89.234` |
| 🟢 `durationSector1`, `durationSector2`, `durationSector3` | number | `26.012, 30.451, 32.771` |
| 🛞 `compound`, `stintNumber`, `tyreAgeAtStart` | string, number | `"SOFT", 1, 0` |
| 🛠️ `pitDuration` | number | `23.456` |
| 🚦 `gapToLeader`, `interval`, `position` | string, number | `"+0.0", "+1.234", 1` |
| 🚦 `category`, `flag`, `message` | string | `"Flag", "YELLOW", "TURN 4"` |
| 📻 `recordingUrl` | string | null | `"https://livetiming.formula1.com/.../radio.mp3"` |
| 🌦️ `airTemperature`, `trackTemperature`, `humidity`, `windSpeed` | number | `21.4, 28.9, 47, 2.1` |
| 🚗 `speed`, `throttle`, `brake`, `rpm`, `gear`, `drs` | number | `321, 100, 0, 11200, 8, 12` |
| 🕒 `scrapedAt` | ISO 8601 | `"2026-05-22T00:00:00.000Z"` |

#### 📦 Sample records

<details>
<summary><strong>🏁 Session: Bahrain pre-season test, Day 1</strong></summary>

```json
{
    "recordType": "sessions",
    "sessionKey": 9462,
    "meetingKey": 1228,
    "sessionName": "Day 1",
    "sessionType": "Practice",
    "circuitKey": 63,
    "circuitShortName": "Sakhir",
    "countryKey": 36,
    "countryCode": "BRN",
    "countryName": "Bahrain",
    "location": "Sakhir",
    "gmtOffset": "03:00:00",
    "dateStart": "2024-02-21T07:00:00+00:00",
    "dateEnd": "2024-02-21T16:00:00+00:00",
    "isCancelled": false,
    "year": 2024,
    "scrapedAt": "2026-05-22T00:00:00.000Z"
}
```

</details>

<details>
<summary><strong>🛞 Tyre stint record</strong></summary>

```json
{
    "recordType": "stints",
    "sessionKey": 9165,
    "meetingKey": 1219,
    "driverNumber": 1,
    "stintNumber": 1,
    "lapStart": 1,
    "lapEnd": 18,
    "compound": "SOFT",
    "tyreAgeAtStart": 0,
    "scrapedAt": "2026-05-22T00:00:00.000Z"
}
```

</details>

<details>
<summary><strong>🌦️ Weather snapshot</strong></summary>

```json
{
    "recordType": "weather",
    "sessionKey": 9165,
    "meetingKey": 1219,
    "airTemperature": 21.4,
    "trackTemperature": 28.9,
    "humidity": 47,
    "windSpeed": 2.1,
    "date": "2024-03-09T15:30:00+00:00",
    "scrapedAt": "2026-05-22T00:00:00.000Z"
}
```

</details>

***

### ✨ Why choose this Actor

| | Capability |
|---|---|
| 🏎️ | **12 data modes.** Sessions, meetings, drivers, laps, intervals, pit stops, weather, telemetry, stints, positions, race control, radio. |
| 🔑 | **Cross-mode keys.** `sessionKey`, `meetingKey`, and `driverNumber` let you JOIN any mode in your warehouse. |
| 📡 | **Live and historical.** Pulls the latest live timing data plus every season from 2023 onwards. |
| ⚡ | **Fast.** 10 records in seconds, full session telemetry in under a minute. |
| 🛞 | **Strategy-grade detail.** Compound, tyre age, sector splits, pit duration, weather, and DRS state. |
| 🚫 | **No authentication.** Works with the public F1 data feed. No login, no API key. |
| 🔁 | **Always fresh.** Every run fetches the latest data, so your dataset reflects current session state. |

> 📊 Accurate timing data is the foundation of every fantasy league, betting model, broadcast graphic, and strategy dashboard in modern motorsport.

***

### 📈 How it compares to alternatives

| Approach | Cost | Coverage | Refresh | Filters | Setup |
|---|---|---|---|---|---|
| **⭐ OpenF1 Telemetry Scraper** *(this Actor)* | $5 free credit, then pay-per-use | **2023-present, every session** | **Live per run** | year, session, driver, meeting, mode | ⚡ 2 min |
| Official F1 live timing feed | Paid licensing | Live | Streaming | Specialized client required | 🐢 Weeks |
| Sportradar / Stats Perform | $$$$ enterprise | Live + historical | Streaming | Many | ⏳ Days |
| Custom scrapers off race websites | Free | Patchy | Manual | None | 🕒 Variable |

Pick this Actor when you want full-coverage F1 data, server-side filtering, and no licensing negotiations.

***

### 🚀 How to use

1. 📝 **Sign up.** [Create a free account with $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp) (takes 2 minutes).
2. 🌐 **Open the Actor.** Go to the OpenF1 Formula 1 Telemetry Scraper page on the Apify Store.
3. 🎯 **Set input.** Pick a mode (start with `sessions`), set the year, and choose `maxItems`.
4. 🚀 **Run it.** Click **Start** and let the Actor collect your data.
5. 📥 **Download.** Grab your results in the **Dataset** tab as CSV, Excel, JSON, or XML.

> ⏱️ Total time from signup to downloaded dataset: **3-5 minutes.** No coding required.

***

### 💼 Business use cases

<table>
<tr>
<td width="50%" valign="top">

#### 🎯 Fantasy & Betting Platforms

- Real-time driver scoring engines
- Lap-by-lap odds shading models
- Tyre strategy props (which compound at lap X)
- Pit stop timing markets

</td>
<td width="50%" valign="top">

#### 📺 Sports Media & Broadcasters

- Live timing widgets for editorial sites
- Lap chart and gap visualizations
- Auto-generated race recaps from race control feed
- Embedded telemetry comparison clips

</td>
</tr>
<tr>
<td width="50%" valign="top">

#### 📊 Race Strategy & Analytics

- Stint length and compound performance models
- Weather-correlated lap-time regressions
- DRS effectiveness studies per circuit
- Sector-by-sector driver benchmarking

</td>
<td width="50%" valign="top">

#### 🏆 Teams, Sponsors & Brands

- Sponsor exposure analytics tied to running order
- Driver performance dashboards for partners
- Historical comparison decks for sales
- Real-time hospitality screen feeds

</td>
</tr>
</table>

***

### 🔌 Automating OpenF1 Telemetry Scraper

Control the scraper programmatically for scheduled runs and pipeline integrations:

- 🟢 **Node.js.** Install the `apify-client` NPM package.
- 🐍 **Python.** Use the `apify-client` PyPI package.
- 📚 See the [Apify API documentation](https://docs.apify.com/api/v2) for full details.

The [Apify Schedules feature](https://docs.apify.com/platform/schedules) lets you trigger this Actor on any cron interval. Run every 30 seconds during a live session for real-time fantasy scoring, or refresh once a day after each Grand Prix.

***

### 🌟 Beyond business use cases

Data like this powers more than commercial workflows. The same structured records support research, education, civic projects, and personal initiatives.

<table>
<tr>
<td width="50%">

#### 🎓 Research and academia

- Tyre compound degradation studies
- Aerodynamic and DRS-effect papers
- Driver consistency and reaction-time analyses
- Reproducible race datasets for sports science

</td>
<td width="50%">

#### 🎨 Personal and creative

- Indie F1 fantasy apps and Twitch overlays
- Custom lap-chart visualizations
- Race recap videos with auto-generated graphics
- Hobbyist telemetry dashboards

</td>
</tr>
<tr>
<td width="50%">

#### 🤝 Non-profit and civic

- Motorsport history archives
- STEM teaching materials on data and physics
- Inclusive community sites for non-paying F1 fans
- Open-data showcases at conferences

</td>
<td width="50%">

#### 🧪 Experimentation

- Train ML models on lap-time prediction
- Prototype pit-stop strategy simulators
- Benchmark agent pipelines on live sport data
- Build voice assistants that summarize races

</td>
</tr>
</table>

***

### 🤖 Ask an AI assistant about this scraper

Open a ready-to-send prompt about this ParseForge actor in the AI of your choice:

- 💬 [**ChatGPT**](https://chat.openai.com/?q=How%20do%20I%20use%20the%20OpenF1%20Formula%201%20Telemetry%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🧠 [**Claude**](https://claude.ai/new?q=How%20do%20I%20use%20the%20OpenF1%20Formula%201%20Telemetry%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🔍 [**Perplexity**](https://perplexity.ai/search?q=How%20do%20I%20use%20the%20OpenF1%20Formula%201%20Telemetry%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🅒 [**Copilot**](https://copilot.microsoft.com/?q=How%20do%20I%20use%20the%20OpenF1%20Formula%201%20Telemetry%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)

***

### ❓ Frequently Asked Questions

#### 🧩 How does it work?

Pick a data mode, set filters like year or session, click Start, and the Actor pulls the data and returns one clean record per session, lap, stint, or radio message. No browser automation, no captchas, no setup.

#### 📏 How accurate is the data?

The feed mirrors the official Formula 1 live timing stream. Lap times, sector splits, weather, and telemetry samples are the same values you see on the F1 broadcast graphics.

#### 🔁 How fresh is the live data?

During a live session the source updates within seconds. Schedule the Actor every 30 seconds for near-real-time fantasy scoring, or once per session for archival pulls.

#### 📅 How far back does coverage go?

Every Grand Prix weekend from the 2023 season onwards is included, with full session, lap, telemetry, weather, and radio coverage.

#### ⏰ Can I schedule regular runs?

Yes. Use Apify Schedules to trigger this Actor on any cron interval. Common patterns: every 30 seconds during live sessions, every hour during a race weekend, or once per Grand Prix.

#### 🛞 Can I get tyre stints and pit timing?

Yes. Run with `mode: "stints"` for compound and stint range, or `mode: "pit"` for per-stop pit duration with lap number.

#### 📻 Are team radio recordings included?

Yes. Run with `mode: "team_radio"` to get a direct link to the original recording for each team radio transmission.

#### 💳 Do I need a paid Apify plan to use this Actor?

No. The free Apify plan is enough for testing and small runs (10 records per run). A paid plan lifts the limit and gives you access to scheduling, higher concurrency, and larger telemetry pulls.

#### 🔁 What happens if a run fails or gets interrupted?

Apify automatically retries transient errors. If a run still fails, inspect the log in the Runs tab, fix the input, and re-run. Partial datasets from failed runs are preserved so you never lose progress.

#### ⚖️ Is this data legal to use?

The underlying live timing data is published as a free open feed. Commercial use is generally allowed for analytics and editorial work. Review the downstream terms of your specific use case, and note that the official F1 logos and trademarks remain the property of Formula One Group.

#### 🆘 What if I need help?

Our support team is here to help. Contact us through the Apify platform or use the Tally form linked below.

***

### 🔌 Integrate with any app

OpenF1 Telemetry Scraper connects to any cloud service via [Apify integrations](https://apify.com/integrations):

- [**Make**](https://docs.apify.com/platform/integrations/make) - Automate multi-step workflows
- [**Zapier**](https://docs.apify.com/platform/integrations/zapier) - Connect with 5,000+ apps
- [**Slack**](https://docs.apify.com/platform/integrations/slack) - Get live race notifications in your channels
- [**Airbyte**](https://docs.apify.com/platform/integrations/airbyte) - Pipe telemetry into your warehouse
- [**GitHub**](https://docs.apify.com/platform/integrations/github) - Trigger runs from commits and releases
- [**Google Drive**](https://docs.apify.com/platform/integrations/drive) - Export datasets straight to Sheets

You can also use webhooks to trigger downstream actions when a run finishes. Push live timing into your fantasy backend, or alert your team in Slack the moment a yellow flag drops.

***

### 🔗 Recommended Actors

- [**✈️ OurAirports Global Airport Database Scraper**](https://apify.com/parseforge/ourairports-scraper) - Worldwide airport reference with ICAO and IATA codes
- [**✈️ FAA Aircraft Registry Scraper**](https://apify.com/parseforge/faa-aircraft-registry-scraper) - U.S. civil aircraft registrations and owners
- [**🤗 Hugging Face Model Scraper**](https://apify.com/parseforge/hugging-face-model-scraper) - Discover and benchmark open ML models
- [**📰 PR Newswire Scraper**](https://apify.com/parseforge/pr-newswire-scraper) - Press releases for sponsor and team news monitoring
- [**📈 Indexmundi Scraper**](https://apify.com/parseforge/indexmundi-scraper) - Global demographic and economic indicators

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more reference-data scrapers.

***

**🆘 Need Help?** [**Open our contact form**](https://tally.so/r/BzdKgA) to request a new scraper, propose a custom data project, or report an issue.

***

> **⚠️ Disclaimer:** this Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Formula One Group, the FIA, OpenF1, or any F1 team. All trademarks mentioned are the property of their respective owners. Only publicly available open motorsport data is collected.

# Actor input Schema

## `maxItems` (type: `integer`):

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `mode` (type: `string`):

Which type of Formula 1 data to collect.

## `year` (type: `integer`):

Filter by year (applies to sessions, meetings and drivers).

## `sessionType` (type: `string`):

Filter sessions/meetings by type. Race = main race, Qualifying = qualifying, Practice = free practice.

## `sessionKey` (type: `integer`):

Filter by a specific F1 session ID (required for laps, intervals, pit, weather, car\_data, stints, position, race\_control, team\_radio).

## `meetingKey` (type: `integer`):

Filter by a specific F1 race weekend ID.

## `driverNumber` (type: `integer`):

Filter by driver number (e.g. 1 for Verstappen, 44 for Hamilton).

## Actor input object example

```json
{
  "maxItems": 10,
  "mode": "sessions",
  "year": 2024
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10,
    "mode": "sessions",
    "year": 2024
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/openf1-f1-telemetry-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxItems": 10,
    "mode": "sessions",
    "year": 2024,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/openf1-f1-telemetry-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10,
  "mode": "sessions",
  "year": 2024
}' |
apify call parseforge/openf1-f1-telemetry-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/openf1-f1-telemetry-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "OpenF1 Formula 1 Telemetry Scraper",
        "description": "Export Formula 1 sessions, drivers, laps, pit stops, intervals, weather, and live car telemetry from the OpenF1 live data source. Filter by year, session, driver, and meeting to get historical and live F1 race data.",
        "version": "1.0",
        "x-build-id": "eIyJfDcnXSO2rCgok"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~openf1-f1-telemetry-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-openf1-f1-telemetry-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/parseforge~openf1-f1-telemetry-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-openf1-f1-telemetry-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/parseforge~openf1-f1-telemetry-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-openf1-f1-telemetry-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000"
                    },
                    "mode": {
                        "title": "Data Mode",
                        "enum": [
                            "sessions",
                            "meetings",
                            "drivers",
                            "laps",
                            "intervals",
                            "pit",
                            "weather",
                            "car_data",
                            "stints",
                            "position",
                            "race_control",
                            "team_radio"
                        ],
                        "type": "string",
                        "description": "Which type of Formula 1 data to collect."
                    },
                    "year": {
                        "title": "Year",
                        "minimum": 2018,
                        "maximum": 2030,
                        "type": "integer",
                        "description": "Filter by year (applies to sessions, meetings and drivers)."
                    },
                    "sessionType": {
                        "title": "Session Type",
                        "enum": [
                            "Race",
                            "Qualifying",
                            "Practice",
                            "Sprint",
                            "Sprint Shootout",
                            "Sprint Qualifying"
                        ],
                        "type": "string",
                        "description": "Filter sessions/meetings by type. Race = main race, Qualifying = qualifying, Practice = free practice."
                    },
                    "sessionKey": {
                        "title": "Session Key",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Filter by a specific F1 session ID (required for laps, intervals, pit, weather, car_data, stints, position, race_control, team_radio)."
                    },
                    "meetingKey": {
                        "title": "Meeting Key",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Filter by a specific F1 race weekend ID."
                    },
                    "driverNumber": {
                        "title": "Driver Number",
                        "minimum": 1,
                        "maximum": 99,
                        "type": "integer",
                        "description": "Filter by driver number (e.g. 1 for Verstappen, 44 for Hamilton)."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
