F1 Data Extractor avatar
F1 Data Extractor

Pricing

$1.00 / 1,000 results

Go to Apify Store
F1 Data Extractor

F1 Data Extractor

Extract comprehensive F1 data: race results, qualifying, practice, pit stops. Smart season/round filtering. Sorted, analysis-ready output from f1.com.

Pricing

$1.00 / 1,000 results

Rating

5.0

(1)

Developer

Richard Biroš

Richard Biroš

Maintained by Community

Actor stats

1

Bookmarked

3

Total users

2

Monthly active users

4 days ago

Last modified

Categories

Share

Formula 1 Data Scraper & Extractor

Extract comprehensive Formula 1 race data from the official F1 website. Get race results, qualifying times, practice sessions, pit stops, fastest laps, and complete historical F1 statistics from 1950 to 2025. Perfect for data analysis, machine learning, fantasy F1, and motorsport analytics.

Keywords: F1 scraper, Formula 1 data, race results API, motorsport analytics, F1 statistics, historical F1 data, qualifying times, pit stop data, F1 dataset, racing data extraction

🏁 Why Use This F1 Data Extractor?

  • 🚀 70+ Years of F1 History - Access every race from 1950 to current 2025 season
  • ⚡ Smart Season Parsing - Use ranges like "2020-2024" instead of manual lists
  • 📊 Perfectly Sorted Data - Results ordered by season, round, session, and position
  • 💰 Cost-Effective - No expensive API subscriptions, pay only for what you scrape
  • 🔄 Always Up-to-Date - Scrapes directly from official Formula1.com
  • 🎯 Flexible Selection - Choose specific sessions, drivers, and seasons
  • 📈 Analysis-Ready - Clean, flat JSON/CSV format for immediate use
  • ⚙️ Production-Ready - Built with Apify SDK and Crawlee for reliability

✨ Key Features

Data Coverage

  • Complete Race Weekend Data - Practice, qualifying, sprint, race, pit stops, fastest laps
  • Historical Archives - Every F1 season from 1950 to 2025 (70+ years)
  • All Driver Positions - Full race classification, not just podium finishers
  • Sprint Weekend Support - Automatic detection and handling of sprint formats

Extraction Capabilities

  • Multi-Season Ranges - Smart parsing: "2020-2024" or "2022, 2024"
  • Selective Sessions - Choose only the data you need (saves time & cost)
  • Batch Processing - Scrape multiple seasons/races in a single run
  • Sorted Output - Results organized by season → round → session → position

Technical Excellence

  • Fast & Efficient - CheerioCrawler for 10x faster HTML parsing vs browsers
  • Robust Error Handling - Gracefully handles missing sessions and 404s
  • Clean JSON Output - Flat structure ready for SQL, pandas, Excel, or BI tools
  • No API Limits - Direct web scraping, no rate limits or API keys needed

📊 Available Session Types

Practice Sessions

  • practice-1 - First practice session (all weekends)
  • practice-2 - Second practice session (normal weekends only)
  • practice-3 - Third practice session (normal weekends only)

Qualifying

  • qualifying - Main qualifying session (all weekends)
  • sprint-qualifying - Sprint shootout (sprint weekends only)

Race Sessions

  • race-result - Main race results (all weekends)
  • sprint - Sprint race results (sprint weekends only)

Grids

  • starting-grid - Starting positions for main race
  • sprint-grid - Starting positions for sprint (sprint weekends only)

Additional Data

  • pit-stop-summary - All pit stops during the race
  • fastest-laps - Fastest lap times across the race

📥 Input Configuration

{
"seasons": "2023-2024",
"rounds": "1-5",
"sessionsToScrape": ["qualifying", "race-result"],
"includeAllDrivers": true,
"proxyConfiguration": {
"useApifyProxy": false
}
}

Input Parameters

ParameterTypeRequiredDefaultDescription
seasonsstringYes"2024"F1 season years to extract. Supports single year ("2024"), ranges ("2022-2024"), or comma-separated ("2020, 2023, 2024")
roundsstringNoall roundsFilter specific race rounds. Supports single ("5"), ranges ("1-5"), or comma-separated ("1, 5, 10"). Leave empty to scrape all rounds
sessionsToScrapearrayNo["race-result"]Which sessions to extract
includeAllDriversbooleanNotrueExtract all positions vs winner only
proxyConfigurationobjectNo{ useApifyProxy: false }Proxy settings (use Apify Proxy for anti-bot protection)

📤 Output Structure

Flat Data Format

Each row represents one driver's result in one session at one race:

{
"season": 2024,
"round": 5,
"grandPrix": "China",
"date": "21 Apr",
"sessionType": "race-result",
"position": 1,
"driverNumber": 1,
"driver": "Max Verstappen",
"driverCode": "VER",
"team": "Red Bull Racing Honda RBPT",
"laps": 56,
"timeOrRetired": "1:40:52.554",
"points": 25,
"detailsUrl": "https://www.formula1.com/en/results/2024/races/1233/china/race-result"
}

Session-Specific Fields

Practice Sessions:

  • position, driverNumber, driver, driverCode, team, laps, timeOrRetired

Qualifying:

  • position, driverNumber, driver, driverCode, team, q1Time, q2Time, q3Time, laps

Race/Sprint:

  • position, driverNumber, driver, driverCode, team, laps, timeOrRetired, points

Starting Grid:

  • position, driverNumber, driver, driverCode, team, timeOrRetired

Pit Stops:

  • stop, driverNumber, driver, driverCode, lapNumber, timeOfDay, stopDuration, totalDuration

Fastest Laps:

  • position, driverNumber, driver, driverCode, team, lapNumber, timeOfDay, timeOrRetired, avgSpeed

🚀 Usage Examples

Example 1: Get All Race Results for a Single Season

{
"seasons": "2024",
"sessionsToScrape": ["race-result"],
"includeAllDrivers": true
}

Output: ~480 rows (24 races × 20 drivers)

Example 2: Multi-Season Historical Analysis ⭐ NEW!

{
"seasons": "2022-2024",
"sessionsToScrape": ["qualifying", "race-result"],
"includeAllDrivers": true
}

Output: ~2,880 rows (3 seasons × 24 races × 2 sessions × 20 drivers) Use case: Compare driver/team performance across multiple seasons

Example 3: Complete Race Weekend Data

{
"seasons": "2024",
"sessionsToScrape": [
"practice-1", "practice-2", "practice-3",
"qualifying", "race-result"
],
"includeAllDrivers": true
}

Output: ~2,400 rows (24 races × 5 sessions × 20 drivers)

Example 4: Just Winners (Faster Extraction)

{
"seasons": "2024",
"sessionsToScrape": ["qualifying", "race-result"],
"includeAllDrivers": false
}

Output: 48 rows (24 races × 2 sessions × 1 winner)

Example 5: Pit Stop Analysis

{
"seasons": "2024",
"sessionsToScrape": ["pit-stop-summary", "race-result"],
"includeAllDrivers": true
}

Example 6: Sprint Weekend Analysis

{
"seasons": "2024",
"sessionsToScrape": [
"practice-1",
"sprint-qualifying",
"sprint",
"qualifying",
"race-result"
],
"includeAllDrivers": true
}

Example 7: Year-over-Year Comparison

{
"seasons": "2023-2024",
"sessionsToScrape": ["qualifying"],
"includeAllDrivers": true
}

Use case: Compare qualifying performance trends between seasons

Example 8: Specific Races Only (First 5 Rounds) ⭐ NEW!

{
"seasons": "2024",
"rounds": "1-5",
"sessionsToScrape": ["qualifying", "race-result"],
"includeAllDrivers": true
}

Output: ~200 rows (5 races × 2 sessions × 20 drivers)
Use case: Analyze opening races or test on subset before full season scrape

Example 9: Selected Circuit Analysis ⭐ NEW!

{
"seasons": "2024",
"rounds": "6, 9, 16",
"sessionsToScrape": ["race-result"],
"includeAllDrivers": true
}

Use case: Analyze specific iconic circuits (Monaco, Silverstone, Monza)

🏎️ Sprint vs Normal Weekends

The actor automatically handles different weekend formats:

Normal Weekend:

  • 3 practice sessions (P1, P2, P3)
  • 1 qualifying session
  • 1 race

Sprint Weekend:

  • 1 practice session (P1 only)
  • Sprint qualifying
  • Sprint race
  • Main qualifying
  • Main race

If a session doesn't exist (e.g., P2 on a sprint weekend), the actor logs a warning and continues gracefully.

💡 Use Cases & Applications

Sports Analytics & Research

  • Performance Analysis - Track driver and team statistics across seasons
  • Qualifying vs Race Pace - Compare practice/qualifying to actual race performance
  • Pit Stop Strategy - Analyze pit stop timing and duration patterns
  • Historical Comparisons - Compare modern F1 to different eras (turbo, V8, hybrid)

Machine Learning & AI

  • Race Prediction Models - Train ML models on historical race data
  • Driver Performance Clustering - Group drivers by performance characteristics
  • Weather Impact Analysis - Correlate race conditions with outcomes
  • Strategy Optimization - Predict optimal pit stop windows

Fantasy F1 & Gaming

  • Fantasy League Stats - Historical data for fantasy F1 predictions
  • Driver Form Analysis - Recent performance trends for league picks
  • Head-to-Head Comparisons - Compare teammate performances

Business Intelligence & Journalism

  • Interactive Dashboards - Build Tableau/PowerBI F1 dashboards
  • Sports Journalism - Data-driven articles with historical context
  • Sponsorship Analysis - Team and driver visibility metrics
  • Broadcasting Stats - Real-time graphics and commentary support

📊 Data Analysis Examples

SQL Analysis

1. Driver Championship Standings

SELECT
driver,
team,
SUM(points) as total_points,
COUNT(*) as races,
AVG(position) as avg_finish
FROM f1_results
WHERE sessionType = 'race-result' AND season = 2024
GROUP BY driver, team
ORDER BY total_points DESC;

2. Team Performance by Track Type

SELECT
team,
grandPrix,
AVG(position) as avg_position,
SUM(points) as points
FROM f1_results
WHERE sessionType = 'race-result' AND season = 2024
GROUP BY team, grandPrix
ORDER BY team, avg_position;

3. Qualifying to Race Position Change

WITH quali AS (
SELECT round, driver, position as quali_pos
FROM f1_results
WHERE sessionType = 'qualifying' AND season = 2024
),
race AS (
SELECT round, driver, position as race_pos
FROM f1_results
WHERE sessionType = 'race-result' AND season = 2024
)
SELECT
q.driver,
AVG(q.quali_pos - r.race_pos) as avg_position_change
FROM quali q
JOIN race r ON q.round = r.round AND q.driver = r.driver
GROUP BY q.driver
ORDER BY avg_position_change DESC;

🆘 Troubleshooting & FAQs

Common Issues

Q: Why are some sessions missing data?
A: Sprint weekends have different formats (only 1 practice session instead of 3). The Actor handles this gracefully and logs warnings for missing sessions.

Q: How do I get data for a specific race only?
A: Use the rounds parameter! For example, "rounds": "5" scrapes only Round 5. You can also use ranges "1-5" or comma-separated "1, 5, 10" for multiple specific races.

Q: Can I scrape live/ongoing races?
A: The Actor scrapes completed sessions only. For live timing, use the official F1 live timing app.

Q: Is this data suitable for commercial use?
A: The data is scraped from the public Formula1.com website. Review F1's terms of service and consider your specific use case.

Data Quality

  • Sorted Output - All results ordered by season, round, session type, and position
  • Complete Records - All available fields extracted (times, laps, points, etc.)
  • Validated Structure - Consistent schema across all sessions
  • Error Logging - Missing or failed sessions are logged, not hidden

🎯 Best Practices

  1. Start Small - Test with a single season and few rounds before scraping large ranges
  2. Use Smart Ranges - "2020-2024" and "1-5" are easier than listing individual values
  3. Filter Strategically - Use rounds to target specific circuits
  4. Select Sessions - Only scrape the sessions you need to minimize requests
  5. Test First - Run with rounds: "1" to verify your configuration works
  6. Export Regularly - Download your datasets for offline analysis
  7. Schedule Runs - Use Apify schedules for automatic weekly/monthly updates

📚 Additional Resources

🤝 Support & Contributions

Found a bug or have a feature request? Please contact the Actor developer through the Apify Console.

📄 License & Disclaimer

This Actor scrapes publicly available data from Formula1.com. Users are responsible for ensuring their use complies with applicable terms of service and laws. The Actor developer is not affiliated with Formula 1 or Formula1.com.


Ready to start analyzing F1 data? Run the Actor now and get race results in seconds! 🏁