Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Formula 1 data — race schedules, results, lap timing, driver and team info. Powered by the FastF1 library. Covers F1 sessions, qualifying, practice, race results, sector times, tire strategy. Use when: user asks about F1 race results, qualifying, lap times, driver stats, team info, the F1 calendar, or Formula 1 data. Don't use when: user asks about other motorsports (MotoGP, NASCAR, IndyCar, WEC, Formula E). Don't use for F1 betting odds or predictions — use kalshi or polymarket instead. Don't
.claude/skills/machina-sports-fastf1/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 313% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 66% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-22 | ✗→✓ | ▲ Improved | 308% | 0% |
| case-23 | ✗→✓ | ▲ Improved | 10% | 0% |
Before writing queries, consult references/api-reference.md for endpoints, ID conventions, and data shapes.
Prefer the CLI — it avoids Python import path issues:
bashsports-skills f1 get_race_schedule --year=2025 sports-skills f1 get_race_results --year=2025 --event=Monza
Python SDK (alternative):
pythonfrom sports_skills import f1 schedule = f1.get_race_schedule(year=2025) results = f1.get_race_results(year=2025, event="Monza")
CRITICAL: Before calling any data endpoint, verify:
currentDate — never hardcoded.year = current_year - 1 (pre-season; the new F1 season has not started yet).Derive the current year from the system prompt's date (e.g., currentDate: 2026-02-16 → current year is 2026).
year = current_year - 1. From March onward, use the current year.get_race_schedule --year=<year> — find the event name and dateget_race_results --year=<year> --event=<name> — final classification (positions, times, points)get_lap_data --year=<year> --event=<name> --session_type=R — lap-by-lap pace analysisget_tire_analysis --year=<year> --event=<name> — strategy breakdown (compounds, stint lengths, degradation)get_championship_standings --year=<year> — championship context (points, wins, podiums)get_team_comparison --year=<year> --team1=<t1> --team2=<t2> OR get_driver_comparison --year=<year> --driver1=<d1> --driver2=<d2>get_season_stats --year=<year> — aggregate performance (fastest laps, top speeds)get_race_schedule --year=<year> — full calendar with dates and circuitsget_championship_standings --year=<year> — driver and constructor standingsget_season_stats --year=<year> — season-wide fastest laps, top speeds, points leadersget_driver_info --year=<year> — current grid (driver numbers, teams, nationalities)| Command | Description | |---|---| | get_race_schedule | Full season calendar with dates and circuits | | get_race_results | Final race classification (positions, times, points) | | get_session_data | Raw session info (Q, FP1, FP2, FP3, R) | | get_driver_info | Driver details from the grid | | get_team_info | Team info with driver lineup | | get_lap_data | Lap-by-lap timing with sectors and tire data | | get_pit_stops | Pit stop durations and team averages | | get_speed_data | Speed trap and intermediate speed data | | get_championship_standings | Driver and constructor championship standings | | get_season_stats | Aggregate season performance | | get_team_comparison | Team head-to-head: qualifying, race pace, sectors | | get_driver_comparison | Driver head-to-head: qualifying H2H, race H2H, pace delta | | get_tire_analysis | Tire strategy, stint lengths, degradation rates |
See references/api-reference.md for full parameter lists and return shapes.
Example 1: F1 calendar User says: "Show me the F1 calendar" Actions:
currentDateget_race_schedule(year=<derived_year>)Result: Full calendar with event names, dates, and circuits
Example 2: Driver race performance User says: "How did Verstappen do at Monza?" Actions:
currentDate (or from context)get_race_results(year=<year>, event="Monza") for final classificationget_lap_data(year=<year>, event="Monza", session_type="R", driver="VER") for lap timesResult: Finishing position, gap to leader, fastest lap, and tire strategy
Example 3: Latest results queried in pre-season User says: "What were the latest F1 results?" (asked in February 2026) Actions:
year = 2025get_race_schedule(year=2025) to find the last event of that seasonget_race_results(year=2025, event=<last_event>) for the final race resultsResult: Results of the final 2025 race
get_qualifying~~ / ~~get_practice~~ — does not exist. Use get_session_data with session_type="Q" for qualifying or session_type="FP1"/"FP2"/"FP3" for practice.get_standings~~ — does not exist. Use get_championship_standings instead.get_results~~ — does not exist. Use get_race_results instead.get_calendar~~ — does not exist. Use get_race_schedule instead.If a command is not listed in the Commands table above, it does not exist.
Error: Event name not found Cause: Event name spelling does not match FastF1's internal naming Solution: Call get_race_schedule(year=<year>) first to get the exact event names, then retry with the correct name
Error: Session data is empty Cause: The session has not happened yet Solution: FastF1 only returns data for completed sessions. Check get_race_schedule for when the session is scheduled
Error: get_race_results returns no fastest_lap_time Cause: Some races do not include fastest lap data in the results endpoint Solution: Use get_lap_data(session_type="R") and find the minimum lap_time across all drivers
Error: Querying the current year in January or February returns no data Cause: The new F1 season has not started yet Solution: Use year = current_year - 1 for any pre-March query; do not query the current year before March
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 20,231 | 12,139 | -40% | 1 | 1 | 0% | 2,761 | 2,158 | -22% | 0 | 0 | — |
case-02 | fail→fail | 22,921 | 5,610 | -76% | 1 | 1 | 0% | 4,287 | 2,028 | -53% | 0 | 0 | — |
case-03 | fail→fail | 19,843 | 20,783 | +5% | 1 | 1 | 0% | 2,164 | 4,992 | +131% | 0 | 0 | — |
case-04 | fail→fail | 12,000 | 4,547 | -62% | 1 | 1 | 0% | 2,092 | 2,057 | -2% | 0 | 0 | — |
case-05 | fail→fail | 12,650 | 3,217 | -75% | 1 | 1 | 0% | 2,452 | 1,838 | -25% | 0 | 0 | — |
case-06 | pass→fail | 11,612 | 2,847 | -75% | 1 | 1 | 0% | 1,711 | 1,880 | +10% | 0 | 0 | — |
case-07 | fail→fail | 4,761 | 7,464 | +57% | 1 | 1 | 0% | 793 | 2,011 | +154% | 0 | 0 | — |
case-08 | fail→fail | 6,216 | 10,084 | +62% | 1 | 1 | 0% | 1,107 | 2,031 | +83% | 0 | 0 | — |
case-09 | fail→fail | 7,913 | 3,576 | -55% | 1 | 1 | 0% | 1,882 | 1,853 | -2% | 0 | 0 | — |
case-10 | fail→pass | 4,269 | 8,436 | +98% | 1 | 1 | 0% | 677 | 2,794 | +313% | 0 | 0 | — |
case-11 | fail→pass | 9,006 | 5,532 | -39% | 1 | 1 | 0% | 1,605 | 2,666 | +66% | 0 | 0 | — |
case-12 | fail→pass | 10,959 | 6,707 | -39% | 1 | 1 | 0% | 2,032 | 2,914 | +43% | 0 | 0 | — |
case-13 | fail→fail | 15,373 | 11,997 | -22% | 1 | 1 | 0% | 2,189 | 2,001 | -9% | 0 | 0 | — |
case-14 | fail→fail | 21,992 | 8,012 | -64% | 1 | 1 | 0% | 4,424 | 2,076 | -53% | 0 | 0 | — |
case-15 | fail→fail | 5,875 | 8,820 | +50% | 1 | 1 | 0% | 1,000 | 2,128 | +113% | 0 | 0 | — |
case-16 | fail→fail | 11,734 | 11,363 | -3% | 1 | 1 | 0% | 2,148 | 2,214 | +3% | 0 | 0 | — |
case-17 | fail→fail | 14,671 | 6,719 | -54% | 1 | 1 | 0% | 2,413 | 2,017 | -16% | 0 | 0 | — |
case-18 | pass→pass | 3,410 | 2,873 | -16% | 1 | 1 | 0% | 514 | 2,229 | +334% | 0 | 0 | — |
case-19 | fail→fail | 11,859 | 5,658 | -52% | 1 | 1 | 0% | 2,524 | 1,999 | -21% | 0 | 0 | — |
case-20 | fail→fail | 8,690 | 5,113 | -41% | 1 | 1 | 0% | 1,430 | 1,949 | +36% | 0 | 0 | — |
case-21 | fail→fail | 2,641 | 6,099 | +131% | 1 | 1 | 0% | 447 | 1,914 | +328% | 0 | 0 | — |
case-22 | fail→pass | 4,026 | 5,098 | +27% | 1 | 1 | 0% | 625 | 2,547 | +308% | 0 | 0 | — |
case-23 | fail→pass | 11,894 | 4,885 | -59% | 1 | 1 | 0% | 2,226 | 2,453 | +10% | 0 | 0 | — |
case-24 | pass→pass | 6,627 | 5,391 | -19% | 1 | 1 | 0% | 1,259 | 2,700 | +114% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 8 counted toward the lift figure. The other 16 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +17 percentage points is the difference between those two pass rates over the 8 comparable cases. 7 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.