# F1 Scraper: Race Results, Qualifying & Standings (`punkrecordsdata/f1-racing-results-scraper`) Actor

Scrape Formula 1 data for every season since 1950: race results, qualifying times, pit stops, schedules and championship standings. Export to CSV, Excel, JSON or XML.

- **URL**: https://apify.com/punkrecordsdata/f1-racing-results-scraper.md
- **Developed by:** [PunkRecordsData](https://apify.com/punkrecordsdata) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.00 / 1,000 race results

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=2" alt="PunkRecordsData" width="100%" />
</p>

## 🏎 F1 Scraper - Race Results, Qualifying & Standings - PunkRecordsData

> 🚀 **Export Formula 1 data in seconds.** Every season since 1950 as structured rows: race results with grid, points, laps and fastest laps per driver, Q1/Q2/Q3 qualifying times, every pit stop with duration, full race calendars and both championship standings. A single 2025 round returns the winner (Oscar Piastri, McLaren, 1:21:06.758), all 20 classified drivers and 19 pit stops. Export to CSV, Excel, JSON or XML.

The F1 Racing Results Scraper reads the open Jolpica API (the community successor to the classic Ergast Formula 1 database), so it covers the entire history of the championship with no API key. Filter by season, round and even a single driver, and switch each data module on or off independently.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Fantasy F1 and betting modelers | Results, grids and pace data as clean model inputs |
| Sports media and content creators | Instant historical tables for articles and videos |
| Data analysts and students | The classic motorsport dataset, always current |
| App builders | A scheduled feed of results and standings |

### 📋 What the F1 Scraper does

- **Race results**: position, driver, team, grid, points, laps, status (Finished/+1 Lap/DNF reason), finish time and fastest-lap rank/time per driver per Grand Prix.
- **Qualifying**: Q1/Q2/Q3 times and positions per driver.
- **Pit stops**: every stop with lap, stop number and duration (2011 onward).
- **Race schedule**: circuit, locality, country, race date and qualifying/sprint dates.
- **Championship standings**: driver and constructor tables per season, with wins.
- **Filters**: any season 1950-current, specific rounds, and a single-driver filter that applies across modules.

> 💡 **Why it matters:** F1 analysis starts with clean historical tables. This actor turns 75 years of racing into spreadsheets in one run, with the same IDs analysts already use from Ergast.

### 📊 Output of the F1 data search

Real sample from a live run:

```json
{
  "recordType": "race-result",
  "season": "2025",
  "round": 5,
  "raceName": "Saudi Arabian Grand Prix",
  "circuit": "Jeddah Corniche Circuit",
  "position": 1,
  "driver": "Oscar Piastri",
  "team": "McLaren",
  "grid": 2,
  "points": 25,
  "laps": 50,
  "status": "Finished",
  "finishTime": "1:21:06.758",
  "fastestLapTime": "1:31.778",
  "error": null
}
```

### ✨ Why choose this F1 scraper

- **6 billable data events** (results, qualifying, pit stops, schedule, both standings), each switchable; measured alternatives ship 1.
- **Complete history**: every season since 1950 through the same input.
- **Driver filter across modules**: one driver's entire career of results, qualifying and standings in one run.
- **Pit stop analytics** with durations, the module strategy nerds actually want.
- **Polite to the source**: respects Jolpica's published rate limits, so scheduled runs stay reliable.

### 📈 How this F1 results scraper compares to alternatives

Measured against the F1 actors on the Apify Store (September 2026):

| | This actor | Ergast-based alternative | OpenF1-based alternative |
|---|---|---|---|
| Billable data events | 6 | 1 | 1 |
| Qualifying + pit stops + standings | Yes, separate modules | Results only | Live-timing focus |
| Seasons covered | 1950 to current | Varies | Recent only |
| Single-driver filter | Yes | No | No |
| Price per 1,000 result rows | $10.50 | $10.00 | n/a |

### 🚀 How to use the F1 Racing Results Scraper

1. Create a free Apify account (with $5 of credit) at console.apify.com.
2. Open this actor's page and click **Try for free**.
3. Pick seasons (or "current"), optionally rounds and a driver id.
4. Toggle the modules you need and click **Start**.
5. Download CSV, Excel, JSON or XML from the Storage tab.

### 💼 Business use cases

#### Prediction and fantasy models

Grid vs finish deltas, pace and pit data as tidy per-driver rows across seasons.

#### Editorial data desks

"Every Monaco winner since 1950" is one input away, with citations to the source.

#### Betting content

Qualifying-to-race conversion rates by team and circuit, refreshed after every round.

#### Apps and bots

Scheduled standings updates pushed to your backend via webhook after each Grand Prix.

### 🔌 Automating the F1 Scraper

Connect to **Make**, **Zapier**, **Slack**, **Airbyte**, **GitHub** or **Google Drive**: post-race result digests to Slack, warehouse syncs of standings, or a Sunday-evening schedule during the season.

### 🌟 Beyond business use cases

- **Research:** 75 seasons of panel data for statistics coursework.
- **Personal:** your favorite driver's full career in one CSV.
- **Non-profit:** motorsport history archives with reproducible sourcing.
- **Experimentation:** a clean playground over the Jolpica/Ergast API.

### 🤖 Ask an AI assistant about this scraper

> "I need every F1 race result since 2015 with grid positions, points and pit stop counts per driver as CSV. Would the F1 Racing Results Scraper on Apify (apify.com/punkrecordsdata/f1-racing-results-scraper) do this?"

### ❓ Frequently Asked Questions

#### 🏎 How do I export F1 race results to CSV or Excel?

Pick seasons and rounds, keep Race results on, click Start and download from the Storage tab.

#### 📅 How far back does the data go?

To the first championship season, 1950. Pit stops exist from 2011, sprint dates where sprints exist.

#### 👤 Can I get one driver's full history?

Yes, set the driver filter (Ergast driver id like max\_verstappen) and it applies to results, qualifying and standings.

#### ⏱ Are qualifying times split by session?

Yes, Q1, Q2 and Q3 come as separate columns per driver.

#### 🛞 Does it include pit stop durations?

Yes, every stop with lap number, stop count and duration in seconds.

#### 🏆 Are standings final or current?

Final for finished seasons; the current live table for the ongoing season.

#### 💵 Do I pay for modules I switch off?

No. Each module is a separate event billed per delivered row.

#### 📦 How many rows can one run return?

Up to 1,000,000 on paid plans. A full modern season is roughly 480 result rows plus the modules you enable. Free users get a 10-row preview.

#### ⚙️ Does it need an API key?

No, the Jolpica API is open; the actor stays within its published rate limits.

#### 🕒 How fresh are results after a race?

The community database typically updates within hours of the checkered flag; schedule a Sunday evening run during the season.

#### 🔤 Where do I find driver ids?

They are the classic Ergast ids (hamilton, alonso, leclerc); any wrong id simply returns no rows for that filter.

### 🔌 Integrate with any app

Datasets are available via the Apify API in JSON, CSV, Excel or XML, with webhooks on completion, ready for Python, R, Sheets or BI tools.

### 🔗 Recommended Actors

- [Sofascore Match Stats Scraper](https://apify.com/punkrecordsdata/sofascore-match-stats-scraper) - live multi-sport match statistics
- [Tennis Match Stats Scraper](https://apify.com/punkrecordsdata/tennis-match-stats-scraper) - ATP/WTA data with odds and rankings
- [Basketball Match Stats Scraper](https://apify.com/punkrecordsdata/basketball-match-stats-scraper) - hoops analytics rows
- [Prediction Markets Scraper](https://apify.com/punkrecordsdata/prediction-markets-scraper) - Kalshi and Polymarket odds

> 💡 **Pro Tip:** browse the complete [PunkRecordsData collection](https://apify.com/punkrecordsdata) for more data tools.

**🆘 Need Help?** contact.punkrecordsdata@gmail.com

> **⚠️ Disclaimer:** independent tool, not affiliated with Formula 1, the FIA or Jolpica; only publicly available data.

# Actor input Schema

## `seasons` (type: `array`):

F1 seasons to scrape (1950 to current). Use "current" for the ongoing season.

## `rounds` (type: `array`):

Specific round numbers within each season (e.g. 1, 5, 22). Leave empty for all rounds.

## `driverFilter` (type: `string`):

Only rows for this driver, by Ergast driver id (e.g. max\_verstappen, hamilton, alonso).

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

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

## `includeRaceResults` (type: `boolean`):

Finishing position, grid, points, laps, status, time and fastest lap per driver per race.

## `includeQualifying` (type: `boolean`):

Q1/Q2/Q3 times and grid positions per driver per race.

## `includePitstops` (type: `boolean`):

Every pit stop with lap, stop number and duration (available from 2011).

## `includeSchedule` (type: `boolean`):

One row per Grand Prix with circuit, locality, country, date and session times.

## `includeDriverStandings` (type: `boolean`):

Final (or current) championship table per season.

## `includeConstructorStandings` (type: `boolean`):

Constructor championship table per season.

## Actor input object example

```json
{
  "seasons": [
    "current"
  ],
  "rounds": [],
  "maxItems": 10,
  "includeRaceResults": true,
  "includeQualifying": false,
  "includePitstops": false,
  "includeSchedule": false,
  "includeDriverStandings": false,
  "includeConstructorStandings": false
}
```

# Actor output Schema

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

Key fields per row

## `fullData` (type: `string`):

Complete dataset with all fields

# 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 = {
    "seasons": [
        "current"
    ],
    "rounds": [],
    "driverFilter": "",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("punkrecordsdata/f1-racing-results-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 = {
    "seasons": ["current"],
    "rounds": [],
    "driverFilter": "",
    "maxItems": 10,
}

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

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

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

```

## CLI example

```bash
echo '{
  "seasons": [
    "current"
  ],
  "rounds": [],
  "driverFilter": "",
  "maxItems": 10
}' |
apify call punkrecordsdata/f1-racing-results-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,punkrecordsdata/f1-racing-results-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ekubW32WG0c2c79Dg/builds/ek8YcAadhrW1EDVgZ/openapi.json
