List published running courses
ourpr_list_coursesList every running course published on ourpr., with its place, distance, climb and next race date.
Each course is a MEASURED centerline built from recorded runs, with elevation from the USGS 3DEP 10 m model. It is not a course map traced by hand.
START HERE. Every other course tool takes a slug, and this is where slugs come from.
Args:
query (string, optional): Match the name and the place. Partial, case-insensitive.
kind ('race' | 'trail' | 'route', optional): Keep one kind.
course_type ('loop' | 'out-and-back' | 'point-to-point', optional): Keep one shape.
min_distance_mi / max_distance_mi (number, optional): Bound the distance in miles.
upcoming_only (boolean): Keep only courses whose race date has not passed. Default false.
limit (number): 1 to 50. Default 20.
offset (number): Skip this many. Default 0.
response_format ('markdown' | 'json'): Default 'markdown'.
Returns: { "total": number, // matched the filters "count": number, // in this answer "offset": number, "has_more": boolean, "next_offset": number, // present when has_more "published_total": number, // every published course "courses": [{ "slug": string, // "boston-marathon" "name": string, // the event's own name, title sponsor included "place": string | null, // "Hopkinton → Boston, MA" "kind": string, "course_type": string, "distance_mi": number, "climb_ft": number | null, "steepest_pct": number | null, "next_race_date": string | null, // YYYY-MM-DD "days_out": number | null, // null once the date has passed "page_url": string }] }
The order is the race calendar: the soonest race first, then undated courses by distance.
Examples:
"What marathons does ourpr. have?" -> min_distance_mi=26
"Which race is next?" -> upcoming_only=true, limit=1
"Anything in Fort Worth?" -> query="fort worth"
Do not use when: you want the hills on one course. Use ourpr_get_course_terrain.
Error handling:
Returns "No course matched" with the filters echoed when nothing matches.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Keep only this kind. 'race' is a published event course, 'trail' is a trail segment, 'route' is an everyday loop. | |
| limit | No | The most courses to return. | |
| query | No | Match against the course name and its place. Case-insensitive, partial. Example: 'boston', 'fort worth', 'half'. | |
| offset | No | How many courses to skip. Use it with `next_offset`. | |
| course_type | No | Keep only this shape of course. | |
| upcoming_only | No | Keep only courses whose next race date is today or later. A course with no date is dropped by this filter. | |
| max_distance_mi | No | Keep only courses no longer than this, in miles. | |
| min_distance_mi | No | Keep only courses at least this long, in miles. | |
| response_format | No | Output format. 'markdown' reads well in a chat answer. 'json' carries every field for further computation. | markdown |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| count | Yes | Courses in this answer. | |
| total | Yes | Courses that matched the filters. | |
| offset | Yes | ||
| courses | Yes | ||
| has_more | Yes | ||
| next_offset | No | ||
| published_total | Yes | Every published course, before any filter. |