Athletic APIathletic.net ↗
Access cross country and track & field data from Athletic.net: meet results, athlete profiles, team rosters, rankings, and meet search across 8 endpoints.
What is the Athletic API?
The Athletic.net API exposes 8 endpoints covering cross country and track & field competition data across the United States and select international meets. The get_meet_results endpoint returns individual athlete placements, team scores, and division breakdowns for any indexed meet. Other endpoints cover athlete profiles with full race history, team rosters by season, state/country-level rankings, and full-text search across athletes, teams, and meets.
curl -X GET 'https://api.parse.bot/scraper/4645a8ef-1028-446c-9864-2a1c305b5cf8/search?query=Nike+Cross+Nationals' \ -H 'X-API-Key: $PARSE_API_KEY'
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 athletic-net-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.
"""Walkthrough: Athletic.net SDK — search meets, fetch results, explore athletes."""
from parse_apis.athletic_net_api import AthleticNet, Sport, Gender, ResourceNotFound
client = AthleticNet()
# Search for a well-known cross country meet
for result in client.searchresults.search(query="Nike Cross Nationals", limit=3):
print(result.textsuggest, result.type, result.score)
# Construct a meet by ID and list its divisions
meet = client.meet(id=248003)
for div in meet.divisions.list(limit=5):
print(div.div_name, div.gender, div.meters)
# Get race results for a specific division within that meet
top_result = meet.results(div_id="984426", sport=Sport.XC, limit=1).first()
if top_result:
print(top_result.first_name, top_result.last_name, top_result.result, top_result.place)
# Look up the top finisher's full profile
try:
athlete = client.athletes.get(athlete_id=str(top_result.athlete_id), sport=Sport.XC)
print(athlete.first_name, athlete.last_name, athlete.gender, athlete.age)
except ResourceNotFound as exc:
print(f"Athlete not found: {exc}")
# View top rankings for a division by gender
for ranked in client.rankedathletes.top(div_id="74938", gender=Gender.MALE, limit=3):
print(ranked.rank, ranked.athlete_name, ranked.team_name, ranked.state)
# Get a team roster
team = client.team(id=7721)
for entry in team.roster(year="2024", limit=3):
print(entry.name, entry.gender)
print("exercised: searchresults.search / meet.divisions.list / meet.results / athletes.get / rankedathletes.top / team.roster")Full-text search across athletes, teams, and meets by keyword. Returns matching results with type classification (Team, XCMeet, TFMeet, Athlete) and relevance scores. Results are ordered by score descending. No pagination — returns up to ~10 best matches.
| Param | Type | Description |
|---|---|---|
| queryrequired | string | Search keyword, supports single and multi-word queries. |
{
"type": "object",
"fields": {
"results": "array of search result objects with id_db, type, textsuggest, subtext, score",
"num_found": "integer total number of matches"
},
"sample": {
"data": {
"results": [
{
"type": "Team",
"id_db": "67595",
"score": 8350.503,
"subtext": "Portland, Oregon",
"textsuggest": "NXN Nike Cross Nationals"
}
],
"num_found": 142
},
"status": "success"
}
}About the Athletic API
Search and Meet Discovery
The search endpoint accepts a keyword query and returns up to ~10 results typed as Team, XCMeet, TFMeet, or Athlete, each with an id_db, textsuggest, subtext, and relevance score. It does not paginate — you get the top matches only. To browse meets for a country, get_country_meets accepts an ISO Alpha3 country code (e.g. NZL, AUS, GBR), a sport filter (xc or tf), and a page parameter; it returns 12 meets per page with meet_id, name, date, location, has_results, and total_pages.
Meet Metadata and Results
get_meet_info takes a meet_id and returns the meet's Name, MeetDate, Location, HasResults, SeasonID, and an array of xcDivisions (or tfDivisions) each with an IDMeetDiv, Gender, DivName, and DistanceDisplay. It also returns a jwtMeet token required by get_meet_results. Pass that div_id to get_meet_results to retrieve resultsXC — individual rows with Place, Result, SortValue, AthleteID, FirstName, LastName, SchoolName, and Grade — alongside teamScores with Place, Name, and Points.
Athlete Profiles and Team Rosters
get_athlete_profile accepts an athlete_id and returns the athlete's FirstName, LastName, Gender, age, IDAthlete, SchoolID, an allTeams map of school affiliations with SchoolName and MascotUrl, a meets map of meet metadata, and a resultsXC array of historical results including Result, Place, Distance, MeetID, and SeasonID. get_team_roster takes a team_id and optional year and returns an athletes array with ID, Name, Gender, and rsMugshot.
Rankings and Geography
get_top_rankings returns ranked athletes for a given div_id and gender, with each row including rank, AthleteID, AthleteName, Result, TeamName, State, MeetName, and ResultDate. The get_states endpoint requires no inputs and returns a full list of US states, Canadian provinces, and world countries with ISO codes — useful for constructing geographic filters used elsewhere in the API.
The Athletic API is a managed, monitored endpoint for athletic.net — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when athletic.net 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 athletic.net 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?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a meet results dashboard showing individual placements and team scores from
get_meet_results - Track an athlete's personal-record progression across seasons using
resultsXCfromget_athlete_profile - Display a team's current cross country roster with athlete IDs for linking individual profiles via
get_team_roster - Rank top performers in a division by gender using
get_top_rankingswithdiv_idandgenderfilters - Aggregate international meet calendars for a country using
get_country_meetswith ISO Alpha3 codes - Power a search-as-you-type feature for finding athletes, teams, or meets using the
searchendpoint - Seed a geographic filter UI with state, province, and country codes from
get_states
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Athletic.net have an official developer API?+
What does get_meet_results return, and how do I know which division ID to use?+
get_meet_info first with your meet_id. It returns an xcDivisions (or tfDivisions) array where each entry has an IDMeetDiv, Gender, DivName, and DistanceDisplay. Pass one of those IDMeetDiv values as div_id to get_meet_results to get individual placements in resultsXC and team standings in teamScores.Does the search endpoint return all matching results?+
search returns up to approximately 10 top matches ordered by relevance score, with no pagination. It works well for look-up by name but is not designed for exhaustive enumeration. For browsing meets by country, get_country_meets provides paginated results with 12 meets per page.Does the API cover track & field event-level results such as field events or relay splits?+
Is there a way to retrieve results for all divisions in a meet at once?+
get_meet_results is scoped to one div_id per request. To collect all divisions, call get_meet_info to list every entry in xcDivisions or tfDivisions, then call get_meet_results once per IDMeetDiv. There is no single-call bulk endpoint for all divisions. You can fork the API on Parse and revise it to add a batch-division endpoint if needed.