Discover/USATF API
live

USATF APIresults.usatf.org

Retrieve USATF competition metadata, daily event schedules, detailed results, and World Athletics athlete profiles via a structured JSON API.

Endpoints
5
Updated
2mo ago

What is the USATF API?

This API exposes 5 endpoints covering USATF track and field competitions on results.usatf.org, including meet metadata, day-by-day event schedules, per-event results with athlete marks and placements, and full biographical and competition history profiles from the World Athletics database. The get_event_results endpoint alone returns structured entries with athlete names, marks, placements, bib numbers, and team affiliations keyed by entry ID.

Try it
Meet ID identifying the competition. Known values: '8035' (2025 Toyota USATF Outdoor Championships), '8036' (2025 Para Nationals).
api.parse.bot/scraper/a50746f4-55bb-4edb-8907-4da8934f2c19/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/a50746f4-55bb-4edb-8907-4da8934f2c19/get_competition_info?meet_id=8035' \
  -H 'X-API-Key: $PARSE_API_KEY'
Python SDK · recommended

Typed, relational, agent-ready

A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.

  • Fully typed · autocompletes
  • Objects link to objects
  • Typed errors & pagination

Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:

uv add parse-sdk
uv run parse init
uv run parse add --marketplace results-usatf-org-api

uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.

"""
USATF Results API Client

Get your API key from: https://parse.bot/settings
"""

import os
import requests
from typing import Optional, Dict, Any, List
from datetime import datetime


class ParseClient:
    """Client for interacting with USATF Results API via Parse."""

    def __init__(self, api_key: Optional[str] = None):
        """
        Initialize the Parse client.

        Args:
            api_key: API key for authentication. If not provided, reads from PARSE_API_KEY env var.
        """
        self.base_url = "https://api.parse.bot"
        self.scraper_id = "a50746f4-55bb-4edb-8907-4da8934f2c19"
        self.api_key = api_key or os.getenv("PARSE_API_KEY")

        if not self.api_key:
            raise ValueError("API key must be provided or set in PARSE_API_KEY environment variable")

    def _call(self, endpoint: str, method: str = "POST", **params) -> Dict[str, Any]:
        """
        Make an API call to the Parse scraper.

        Args:
            endpoint: The endpoint name to call
            method: HTTP method (GET or POST)
            **params: Parameters to pass to the endpoint

        Returns:
            The JSON response from the API

        Raises:
            requests.RequestException: If the API call fails
            ValueError: If the response indicates an error
        """
        url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
        headers = {
            "X-API-Key": self.api_key,
            "Content-Type": "application/json"
        }

        try:
            if method == "GET":
                response = requests.get(url, headers=headers, params=params, timeout=30)
            elif method == "POST":
                response = requests.post(url, headers=headers, json=params, timeout=30)
            else:
                raise ValueError(f"Unsupported HTTP method: {method}")

            response.raise_for_status()
            result = response.json()

            if result.get("status") != "success":
                raise ValueError(f"API error: {result.get('error', 'Unknown error')}")

            return result.get("data", {})
        except requests.RequestException as e:
            raise requests.RequestException(f"API call failed: {e}")

    def get_competition_info(self, meet_id: str = "8035") -> Dict[str, Any]:
        """
        Get top-level metadata about a USATF competition.

        Args:
            meet_id: Meet ID (default: '8035' for 2025 Toyota USATF Outdoor Championships)

        Returns:
            Competition metadata including name, facility, location, dates
        """
        return self._call("get_competition_info", method="GET", meet_id=meet_id)

    def get_schedule_by_day(self, meet_id: str = "8035", date: Optional[str] = None) -> Dict[str, Any]:
        """
        Get the event schedule for a competition, optionally filtered by date.

        Args:
            meet_id: Meet ID (default: '8035')
            date: Optional date filter in ISO format YYYY-MM-DD (e.g., '2025-08-02')

        Returns:
            Dictionary containing 'events' array with scheduled events
        """
        params = {"meet_id": meet_id}
        if date:
            params["date"] = date
        return self._call("get_schedule_by_day", method="GET", **params)

    def get_event_results(self, event_key: str, meet_id: str = "8035") -> Dict[str, Any]:
        """
        Get detailed results and athlete entries for a specific event.

        Args:
            event_key: Event key in format 'EN-R' (e.g., '22-1', '3-1')
            meet_id: Meet ID (default: '8035')

        Returns:
            Event results including athlete entries with names, marks, placements
        """
        return self._call("get_event_results", method="GET", meet_id=meet_id, event_key=event_key)

    def get_athlete_profile(self, athlete_id: str, meet_id: str = "8035") -> Dict[str, Any]:
        """
        Get full biography and competition history for an athlete.

        Args:
            athlete_id: Athlete ID (obtainable from event results)
            meet_id: Meet ID context (default: '8035')

        Returns:
            Athlete profile with biographical data, honors, and personal bests
        """
        return self._call("get_athlete_profile", method="GET", meet_id=meet_id, athlete_id=athlete_id)

    def get_para_nationals_schedule_by_day(self, date: Optional[str] = None) -> Dict[str, Any]:
        """
        Get the event schedule for the 2025 Para Nationals (meet ID 8036).

        Args:
            date: Optional date filter in ISO format YYYY-MM-DD

        Returns:
            Dictionary containing 'events' array for Para Nationals
        """
        params = {}
        if date:
            params["date"] = date
        return self._call("get_para_nationals_schedule_by_day", method="GET", **params)


def print_section(title: str) -> None:
    """Print a formatted section header."""
    print(f"\n{'='*60}")
    print(f"  {title}")
    print(f"{'='*60}\n")


if __name__ == "__main__":
    # Initialize client
    client = ParseClient()

    # Step 1: Get competition info to understand the event
    print_section("STEP 1: Fetching 2025 Toyota USATF Outdoor Championships Info")
    comp_info = client.get_competition_info(meet_id="8035")
    print(f"Competition: {comp_info['name']}")
    print(f"Facility: {comp_info['facility']}")
    print(f"Location: {comp_info['location']}")
    print(f"Dates: {comp_info['startDate']} to {comp_info['endDate']}")

    # Step 2: Get schedule for a specific date
    print_section("STEP 2: Fetching Schedule for August 2, 2025")
    schedule = client.get_schedule_by_day(meet_id="8035", date="2025-08-02")
    events = schedule.get("events", [])
    print(f"Found {len(events)} events on this date:\n")

    # Display first 5 events
    for event in events[:5]:
        print(f"  • {event['N']}")
        print(f"    Round: {event['RN']}, Status: {event['S']}")
        print(f"    Time: {event['T']}, Gender: {event['G']}")
        print(f"    Event Key: {event['event_key']}\n")

    # Step 3: Get results from a specific event (Women's 20K Racewalk)
    if events:
        # Find an event with complete results
        target_event = next((e for e in events if e['S'] == 'Complete'), events[0])
        event_key = target_event['event_key']
        print_section(f"STEP 3: Fetching Results for {target_event['N']}")
        results = client.get_event_results(event_key=event_key, meet_id="8035")

        print(f"Event: {results['N']}")
        print(f"Round: {results['RN']}")
        print(f"Status: {results['S']}\n")

        # Extract and display athlete results
        athlete_entries = results.get("ED", {})
        print(f"Top 3 Finishers:\n")

        # Sort by placement and get top finishers
        sorted_athletes = sorted(
            athlete_entries.items(),
            key=lambda x: int(x[1].get('P', 999))
        )

        for entry_id, entry_data in sorted_athletes[:3]:
            athlete = entry_data.get("A", {})
            name = athlete.get("N", "Unknown")
            mark = entry_data.get("M", "N/A")
            place = entry_data.get("P", "N/A")
            team = entry_data.get("TN", "N/A")
            athlete_id = athlete.get("ID")

            print(f"  {place}. {name}")
            print(f"     Time: {mark}, Team: {team}")
            print(f"     Athlete ID: {athlete_id}\n")

            # Step 4: Get detailed profile for top finisher (only for first place)
            if place == 1 and athlete_id:
                print_section(f"STEP 4: Fetching Athlete Profile for {name}")
                try:
                    profile = client.get_athlete_profile(athlete_id=str(athlete_id), meet_id="8035")
                    basic = profile.get("basicData", {})
                    print(f"Name: {basic.get('givenName')} {basic.get('familyName')}")
                    print(f"Country: {basic.get('countryCode')}")
                    print(f"Birth Date: {basic.get('birthDate')}")
                    print(f"Affiliation: {basic.get('affiliation')}")

                    # Display honours/major achievements
                    honours = profile.get("honours", [])
                    if honours:
                        print(f"\nMajor Honours:")
                        for honour in honours[:2]:
                            category = honour.get("categoryName", "Unknown")
                            results_list = honour.get("results", [])
                            if results_list:
                                print(f"  • {category}:")
                                for result in results_list[:1]:
                                    print(f"    - {result.get('discipline')}: {result.get('mark')} ({result.get('place')})")

                    # Display personal bests
                    pb = profile.get("personalBests", {})
                    pb_results = pb.get("results", [])
                    if pb_results:
                        print(f"\nPersonal Bests:")
                        for pb_entry in pb_results[:2]:
                            print(f"  • {pb_entry.get('discipline')}: {pb_entry.get('mark')}")

                except ValueError as e:
                    print(f"Note: Could not fetch full profile - {e}")

    # Step 5: Bonus - Check Para Nationals schedule
    print_section("STEP 5: Checking Para Nationals Schedule (August 2)")
    para_schedule = client.get_para_nationals_schedule_by_day(date="2025-08-02")
    para_events = para_schedule.get("events", [])
    print(f"Found {len(para_events)} Para Nationals events on August 2:\n")

    for event in para_events[:3]:
        print(f"  • {event['N']}")
        print(f"    Round: {event['RN']}, Status: {event['S']}")
        print(f"    Time: {event['T']}\n")

    print_section("WORKFLOW COMPLETE")
    print("Successfully demonstrated:")
    print("  1. Fetching competition metadata")
    print("  2. Getting event schedules by date")
    print("  3. Retrieving detailed event results")
    print("  4. Accessing athlete profile data")
    print("  5. Exploring Para Nationals events")
All endpoints · 5 totalmissing one? ·

Returns top-level metadata about a specific USATF competition including name, location, facility, dates, and configuration. Returns upstream_error for unknown meet IDs.

Input
ParamTypeDescription
meet_idstringMeet ID identifying the competition. Known values: '8035' (2025 Toyota USATF Outdoor Championships), '8036' (2025 Para Nationals).
Response
{
  "type": "object",
  "fields": {
    "name": "string — competition name",
    "sport": "string — sport type",
    "endDate": "string — ISO datetime of competition end",
    "facility": "string — venue name",
    "location": "string — city and state",
    "startDate": "string — ISO datetime of competition start"
  },
  "sample": {
    "data": {
      "ID": 8035,
      "name": "2025 Toyota USATF Outdoor Championships",
      "sport": "Outdoor Track",
      "season": "2025",
      "endDate": "2025-08-09T00:00:00",
      "facility": "Hayward Field",
      "location": "Eugene, OR",
      "startDate": "2025-07-31T00:00:00"
    },
    "status": "success"
  }
}

About the USATF API

Meet Information and Schedules

The get_competition_info endpoint accepts a meet_id parameter and returns top-level metadata for a USATF competition: name, sport type, facility, location (city and state), and ISO-formatted start and end dates. Known meet IDs include 8035 for the 2025 Toyota USATF Outdoor Championships. If an unrecognized meet_id is passed, the endpoint returns an upstream_error rather than empty data.

The get_schedule_by_day endpoint returns all events scheduled for a given meet. Filtering by a specific date uses the date parameter in YYYY-MM-DD format; omitting it returns the full schedule across all days. Each event object includes N (name), RN (round name), T (start time), S (status), and an event_key used to query results. A parallel endpoint, get_para_nationals_schedule_by_day, returns the same structure for USATF Para Nationals events and accepts the same date filter.

Event Results

The get_event_results endpoint takes a meet_id and an event_key — formatted as EN-R where EN is the event number and R is the round — and returns the full result set for that event. The ED field is an object keyed by entry ID; each entry carries A (athlete info including name), M (mark or time), P (placement), BIB, and TN (team name). The top-level response also includes event name N, round name RN, and status S. If the event key is not found, the endpoint returns stale_input.

Athlete Profiles

The get_athlete_profile endpoint retrieves biographical and historical performance data for individual athletes from the World Athletics (IAAF) database. The athlete_id comes from the ED entries returned by get_event_results. The response includes basicData (given name, family name, country code, birth date, affiliation), personalBests (best marks per discipline), resultsByYear (competition results grouped by year and discipline), and honours (major competition podium finishes grouped by category such as World Championships or National Championships). Note that para-only athletes without IAAF profiles will return an upstream_error.

Reliability & maintenance

The USATF API is a managed, monitored endpoint for results.usatf.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when results.usatf.org changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.

This isn't an official results.usatf.org API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.

Will this API break when the source site changes?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Build a live results tracker for the USATF Outdoor Championships using get_event_results marks and placements
  • Generate a daily schedule view for fans by filtering get_schedule_by_day with a specific date parameter
  • Compare an athlete's personal bests across disciplines using the personalBests field from get_athlete_profile
  • Display full competition honours histories for US track and field athletes sourced from the World Athletics database
  • Monitor event status changes throughout a meet day using the S (status) field from schedule and result endpoints
  • Build a para athletics schedule display using get_para_nationals_schedule_by_day filtered by competition date
  • Cross-reference athlete team affiliations and marks across multiple events using TN and M fields from get_event_results
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo1005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min

One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.

Frequently asked questions
Does results.usatf.org offer an official developer API?+
USATF does not publish a public developer API for results.usatf.org. There is no documented REST or GraphQL interface available to third-party developers.
How do I get the event_key needed to query get_event_results?+
Call get_schedule_by_day with your target meet_id and optionally a date in YYYY-MM-DD format. Each event object in the returned array includes an event_key field formatted as EN-R (event number dash round number), which you pass directly to get_event_results.
What happens when get_athlete_profile is called for a para athlete?+
Athletes who compete exclusively in para events may not have profiles in the World Athletics (IAAF) database. For those athletes, get_athlete_profile returns an upstream_error. The endpoint works reliably for open-division athletes with IAAF registrations.
Does the API cover historical meets from previous years?+
The documented meet IDs cover 2025 competitions. Historical meets from prior years are not currently enumerated in the endpoint inputs. You can fork the API on Parse and revise it to add support for additional historical meet IDs.
Does the API return heat-by-heat splits or intermediate lap times?+
Currently the API returns final marks (M), placements (P), and round-level results per athlete. Lap splits or intermediate timing data are not exposed in the current response fields. You can fork the API on Parse and revise it to add an endpoint if that data becomes available at the source.
Page content last updated . Spec covers 5 endpoints from results.usatf.org.
Related APIs in SportsSee all →
athletic.net API
Search and analyze cross country and track & field performance data across the US, including athlete profiles, meet results, team rosters, and rankings. Access comprehensive meet information, historical records, and state-level competition data to track athlete progress and discover top performers.
tfrrs.org API
Search athletes, view their performance history, and look up detailed results from track and field meets including event standings and team rosters. Get comprehensive information about cross country and track competitions with athlete times, placements, and meet details all in one place.
scorecatonline.com API
Access live gymnastics competition results, schedules, and meet information from across the country, with the ability to search meets, view session scores, and filter by state and season. Get detailed breakdowns of individual and team performances at specific gymnastics events.
olympics.com API
Access Olympic Games results, medal tables, and athlete profiles to track performances across disciplines and events. Search featured athletes, view competition outcomes, and stay updated on medal standings from the official Olympics source.
milesplit.com API
Access high school track and field rankings from MileSplit by state, event, and year. Retrieve team-level standings for relay events and individual athlete rankings for sprint and distance events across all US states.
worldsurfleague.com API
Access World Surf League competition data including event schedules, heat-by-heat results, athlete profiles, and tour rankings. Retrieve detailed statistics and standings across all WSL tours.
data.fei.org API
Search and explore detailed information about international equestrian sports, including horses, riders, competition results, rankings, and show schedules from the FEI database. Look up specific athletes and horses, browse upcoming events by venue, and track performance across national federations.
ifsc-climbing.com API
Track world rankings, search athlete profiles, and browse competition results and schedules across the international sport climbing circuit. Stay updated with the latest news and event information from the official IFSC competition calendar.