{"info":{"name":"Magisterial Developer API","description":"Every endpoint of the Magisterial Developer API, generated from the published OpenAPI specification (GET /v1/openapi.json).\n\nGetting started: open the collection's Variables tab and set `api_key` to your key from https://magisterial.ai/console/api-keys. The collection's pre-request script sends it as the bearer token on every request. `sport`, `division` and `gender` set the scope every scoped request uses. Optional filters are listed on each request, switched off: tick one to apply it. List requests remember the first id they return (team_id, player_id, game_id ...), so the detail requests next to them run without copying ids.\n\nReference: https://api.magisterial.ai/v1/docs","version":"1.0.0","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json"},"auth":{"type":"bearer","bearer":[{"key":"token","value":"{{api_key}}","type":"string"}]},"event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Sends your API key as the bearer token on every request.","// Set it once: collection > Variables > api_key (an environment or global","// variable of the same name works too).","const key = pm.collectionVariables.get('api_key')","    || pm.environment.get('api_key')","    || pm.globals.get('api_key');","if (!key) {","    throw new Error('Set the api_key variable to your Magisterial API key. '","        + 'Create one at https://magisterial.ai/console/api-keys');","}","pm.request.headers.upsert({ key: 'Authorization', value: 'Bearer ' + key });"]}}],"variable":[{"key":"base_url","value":"https://api.magisterial.ai","description":"API host."},{"key":"api_key","value":"","description":"Your API key (mag_live_... or mag_test_...) from magisterial.ai/console/api-keys."},{"key":"sport","value":"soccer","description":"Scope used by every scoped request; values from GET /v1/sports."},{"key":"division","value":"D3","description":"Scope used by every scoped request; values from GET /v1/divisions (comma-join for several)."},{"key":"gender","value":"men","description":"'men' or 'women'; ignored for single-gender sports."},{"key":"school_id","value":"","description":"Filled by List schools."},{"key":"team_id","value":"","description":"Filled by List teams."},{"key":"player_id","value":"","description":"Filled by Search players and Get a team's roster."},{"key":"person_id","value":"","description":"Filled by Get a team's roster and Get a player."},{"key":"game_id","value":"","description":"Filled by List games."},{"key":"run_id","value":"","description":"Filled by Natural-language query."},{"key":"alert_id","value":"","description":"Filled by the alert requests."},{"key":"export_id","value":"","description":"Filled by the export requests."},{"key":"grant_id","value":"","description":"Filled by the managed-athlete requests."}],"item":[{"name":"Reference","description":"Sports, divisions, conferences, the filter catalog, and the data-coverage matrix — the vocabulary the rest of the API speaks.","item":[{"name":"List supported sports","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/sports","host":["{{base_url}}"],"path":["v1","sports"]},"description":"Every sport the API covers, the genders each one carries, and the\ndivisions each gender is offered in. Use these values for the `sport`,\n`gender` and `division` scope parameters on other endpoints: a\ncomma-joined subset of a sport and gender's `divisions` is a valid\n`division` (for football, send the combined 'D1' or its subdivisions\n'D1-FBS' and 'D1-FCS', not both)."},"response":[]},{"name":"List divisions","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/divisions","host":["{{base_url}}"],"path":["v1","divisions"],"query":[{"key":"sport","value":"{{sport}}","disabled":true,"description":"Return only the divisions valid for this sport, e.g. 'football'."},{"key":"gender","value":"{{gender}}","disabled":true,"description":"With `sport`: 'men' or 'women'. Omitted, a sport whose genders differ (volleyball) returns the divisions valid for either."}]},"description":"Values for the `division` scope parameter. With `sport` (and `gender`)\nthe list is exactly what that sport accepts, so any comma-joined subset of\nit is a valid `division`, e.g. 'D1,NAIA,NJCAA-D1'. Without `sport` it is\nevery division code across all sports; not every code is valid for every\nsport, so pass `sport` (or read `divisions` on GET /v1/sports) before\nbuilding a scope. Football's 'D1' is the combined view of 'D1-FBS' and\n'D1-FCS': request the combined code or the subdivisions, not both."},"response":[]},{"name":"Queryable filter fields for a sport","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/filters/catalog","host":["{{base_url}}"],"path":["v1","filters","catalog"],"query":[{"key":"sport","value":"{{sport}}","disabled":true,"description":"Sport to scope the catalog to."},{"key":"gender","value":"{{gender}}","disabled":true,"description":"'men' or 'women'. Defaults to 'men' for a sport with both (soccer, basketball, volleyball, lacrosse, track-and-field), so pass 'women' for the women's side; ignored for single-gender sports."}]},"description":""},"response":[]},{"name":"Data coverage matrix","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/coverage","host":["{{base_url}}"],"path":["v1","coverage"],"query":[{"key":"sport","value":"{{sport}}","disabled":true,"description":"Only these sports, e.g. 'soccer' or 'soccer,basketball'."},{"key":"gender","value":"{{gender}}","disabled":true,"description":"'men' or 'women': only that side's rows in every `genders` list."},{"key":"division","value":"{{division}}","disabled":true,"description":"Only these divisions in every `divisions` list. One value, or several separated by commas (any of)."}]},"description":"Full data-coverage matrix: per sport and division, how many teams,\ncoaches, games, and players we hold, with season ranges, per-season\nbreakdowns, and transfer-portal tracking counts, plus `freshness`: the\nlast run of every ingest lane (live) and the seasonal cadence policy.\nFree and keyless — the try-before-you-key agent hook (anonymous callers\nrate-limit by IP). The count totals are a cached snapshot refreshed about\nevery 6 hours; record-level freshness lives on each team, roster, and\ncoaching-staff response.\n\n`sport`, `gender` and `division` pick rows out of the matrix; they never\nrecompute a count, so every number still describes the row it sits on\n(a sport's own totals stay its totals across all divisions)."},"response":[]},{"name":"List conferences in a division","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/conferences?sport={{sport}}&division={{division}}&gender={{gender}}","host":["{{base_url}}"],"path":["v1","conferences"],"query":[{"key":"sport","value":"{{sport}}","description":"Sport scope, e.g. 'soccer'."},{"key":"division","value":"{{division}}","description":"Comma-separated sport-valid division scope, e.g. 'D1,NAIA,NJCAA-D1'."},{"key":"gender","value":"{{gender}}","description":"'men' or 'women'. Defaults to 'men' for a sport with both (soccer, basketball, volleyball, lacrosse, track-and-field), so pass 'women' for the women's side; ignored for single-gender sports."},{"key":"q","value":"carnegie","disabled":true,"description":"Case-insensitive name contains."}]},"description":"Conference names present in the requested sport/division scope — valid\nvalues for `conference` filters on other endpoints."},"response":[]}]},{"name":"Players","description":"Search players and fetch profiles and season stats.","item":[{"name":"Search players","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/players/search","host":["{{base_url}}"],"path":["v1","players","search"]},"description":"Filter and rank players within a sport/division scope: bio fields by\nname (with a `_not` twin where exclusion makes sense), height through\n`height_inches_min` / `height_inches_max`, and every season stat of the\nsport through `stats`, keyed by the stat fields GET /v1/filters/catalog\nlists. Results paginate with an opaque `cursor`; pass `next_cursor` back\nto fetch the following page.","body":{"mode":"raw","raw":"{\n  \"sport\": \"soccer\",\n  \"division\": \"D3\",\n  \"gender\": \"men\",\n  \"conference\": [\n    \"NESCAC\",\n    \"UAA\"\n  ],\n  \"position\": \"Midfielder\",\n  \"class_year_not\": \"Senior / Graduate\",\n  \"height_inches_min\": 70,\n  \"stats\": {\n    \"g\": {\n      \"min\": 5\n    },\n    \"gp\": {\n      \"min\": 10\n    }\n  },\n  \"sort_by\": \"g\",\n  \"sort_order\": \"descending\",\n  \"limit\": 25\n}","options":{"raw":{"language":"json"}}}},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('data.0.id') !== undefined && read('data.0.id') !== null) {","        pm.collectionVariables.set('player_id', String(read('data.0.id')));","    }","}"]}}]},{"name":"Get a player","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/players/:player_id?sport={{sport}}&division={{division}}&gender={{gender}}","host":["{{base_url}}"],"path":["v1","players",":player_id"],"query":[{"key":"sport","value":"{{sport}}","description":"Sport scope, e.g. 'soccer'."},{"key":"division","value":"{{division}}","description":"Comma-separated sport-valid division scope, e.g. 'D1,NAIA,NJCAA-D1'."},{"key":"gender","value":"{{gender}}","description":"'men' or 'women'. Defaults to 'men' for a sport with both (soccer, basketball, volleyball, lacrosse, track-and-field), so pass 'women' for the women's side; ignored for single-gender sports."}],"variable":[{"key":"player_id","value":"{{player_id}}"}]},"description":"Full profile for one player: identity, season stats, accolades, and —\nwhen the player is linked to a person — their cross-program career. The\nplayer must be visible in the requested sport/division scope."},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('person_id') !== undefined && read('person_id') !== null) {","        pm.collectionVariables.set('person_id', String(read('person_id')));","    }","}"]}}]},{"name":"Get a player's season stats","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/players/:player_id/seasons?sport={{sport}}&division={{division}}&gender={{gender}}","host":["{{base_url}}"],"path":["v1","players",":player_id","seasons"],"query":[{"key":"sport","value":"{{sport}}","description":"Sport scope, e.g. 'soccer'."},{"key":"division","value":"{{division}}","description":"Comma-separated sport-valid division scope, e.g. 'D1,NAIA,NJCAA-D1'."},{"key":"gender","value":"{{gender}}","description":"'men' or 'women'. Defaults to 'men' for a sport with both (soccer, basketball, volleyball, lacrosse, track-and-field), so pass 'women' for the women's side; ignored for single-gender sports."}],"variable":[{"key":"player_id","value":"{{player_id}}"}]},"description":"Season-history view for one player: per-season stat rows and accolades\nonly (no identity block). Track & field athletes additionally carry a\n`track_performances` list."},"response":[]}]},{"name":"Teams","description":"Teams, rosters, coaching staffs, and per-season team records, each with record-level freshness.","item":[{"name":"List teams","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/teams?sport={{sport}}&division={{division}}&gender={{gender}}","host":["{{base_url}}"],"path":["v1","teams"],"query":[{"key":"sport","value":"{{sport}}","description":"Sport scope, e.g. 'soccer'."},{"key":"division","value":"{{division}}","description":"Comma-separated sport-valid division scope, e.g. 'D1,NAIA,NJCAA-D1'."},{"key":"gender","value":"{{gender}}","description":"'men' or 'women'. Defaults to 'men' for a sport with both (soccer, basketball, volleyball, lacrosse, track-and-field), so pass 'women' for the women's side; ignored for single-gender sports."},{"key":"q","value":"carnegie","disabled":true,"description":"Case-insensitive team name contains."},{"key":"name","value":"Carnegie Mellon University","disabled":true,"description":"Exact team name. One value, or several separated by commas (any of)."},{"key":"id","value":"","disabled":true,"description":"Team ids. One value, or several separated by commas (any of)."},{"key":"school_id","value":"{{school_id}}","disabled":true,"description":"School ids. One value, or several separated by commas (any of)."},{"key":"ipeds_unitid","value":"211440","disabled":true,"description":"Filter to the school with this federal IPEDS UNITID."},{"key":"conference","value":"UAA","disabled":true,"description":"Conference, by its full name or its abbreviation: 'University Athletic Association (UAA)', 'University Athletic Association' and 'UAA' are the same conference. GET /v1/conferences lists them. One value, or several separated by commas (any of)."},{"key":"conference_not","value":"UAA","disabled":true,"description":"Exclude these values (comma-separated). Rows with no value for the field are left out too."},{"key":"state","value":"PA","disabled":true,"description":"Two-letter US state code of the school. One value, or several separated by commas (any of)."},{"key":"state_not","value":"PA","disabled":true,"description":"Exclude these values (comma-separated). Rows with no value for the field are left out too."},{"key":"city","value":"Pittsburgh","disabled":true,"description":"City of the school. One value, or several separated by commas (any of)."},{"key":"control","value":"Private nonprofit","disabled":true,"description":"'Public', 'Private nonprofit' or 'Private for-profit'. One value, or several separated by commas (any of)."},{"key":"status","value":"","disabled":true,"description":"'active' for programs that currently compete, 'discontinued' for programs that stopped, 'all' (default) for both. Each team carries its own `status`."},{"key":"roster_changed_since","value":"","disabled":true,"description":"ISO 8601 timestamp; only teams whose roster `freshness.changed_at` is at/after it. Pass the time of your last sync to re-read only the rosters that changed. Teams with no `changed_at` are left out."},{"key":"coaches_changed_since","value":"","disabled":true,"description":"ISO 8601 timestamp; only teams whose coaching staff `freshness.changed_at` is at/after it. Teams with no `changed_at` are left out."},{"key":"limit","value":"25","disabled":true},{"key":"cursor","value":"","disabled":true}]},"description":"Teams in the requested sport/division scope, alphabetical. Filter by\nname, conference, or the school behind the team (id, IPEDS UNITID, state,\ncity, control). Each team carries its `school` (id, slug, athletics\ndomain, IPEDS UNITID) and its program `status`; pass `status=active` to\nlist only programs that currently compete. `roster_changed_since` and\n`coaches_changed_since` list only the programs whose roster or staff\nchanged since a time, for incremental sync. Paginates with an opaque\n`cursor`."},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('data.0.id') !== undefined && read('data.0.id') !== null) {","        pm.collectionVariables.set('team_id', String(read('data.0.id')));","    }","    if (read('data.0.school.id') !== undefined && read('data.0.school.id') !== null) {","        pm.collectionVariables.set('school_id', String(read('data.0.school.id')));","    }","}"]}}]},{"name":"Get a team","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/teams/:team_id?sport={{sport}}&gender={{gender}}","host":["{{base_url}}"],"path":["v1","teams",":team_id"],"query":[{"key":"sport","value":"{{sport}}","description":"Sport scope, e.g. 'soccer'."},{"key":"division","value":"{{division}}","disabled":true,"description":"Optional. Omit it to read the team in its own current division. Given, it is a division scope like the list endpoints take, and a team outside it is a 404 whose error names the division the team is in (error.division)."},{"key":"gender","value":"{{gender}}","description":"'men' or 'women'. Defaults to 'men' for a sport with both (soccer, basketball, volleyball, lacrosse, track-and-field), so pass 'women' for the women's side; ignored for single-gender sports."}],"variable":[{"key":"team_id","value":"{{team_id}}"}]},"description":"One team plus its per-season document/stat records, its `school`\n(with IPEDS UNITID), its program `status`, and per data kind `freshness`.\nEach season record carries a `schedule` object: how many games the team's\nown schedule lists beside how many we hold, so a short season says so.\n`division` may be omitted: the team is read in its own current division.\nA team outside a division that is given is a 404 naming the one it is in."},"response":[]},{"name":"Get a team's national rankings","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/teams/:team_id/rankings?sport={{sport}}&division={{division}}&gender={{gender}}","host":["{{base_url}}"],"path":["v1","teams",":team_id","rankings"],"query":[{"key":"sport","value":"{{sport}}","description":"Sport scope, e.g. 'volleyball'."},{"key":"division","value":"{{division}}","description":"Comma-separated sport-valid division scope, e.g. 'D1,NAIA,NJCAA-D1'."},{"key":"gender","value":"{{gender}}","description":"'men' or 'women'. Defaults to 'men' for a sport with both (soccer, basketball, volleyball, lacrosse, track-and-field), so pass 'women' for the women's side; ignored for single-gender sports."},{"key":"season","value":"2025","disabled":true,"description":"Team season, e.g. '2025'. One value, or several separated by commas (any of)."},{"key":"ranking_system","value":"","disabled":true,"description":"Ranking system, e.g. 'RPI' or 'Coaches Poll'. One value, or several separated by commas (any of)."}],"variable":[{"key":"team_id","value":"{{team_id}}"}]},"description":"Where a team stands, or finished, in each national ranking, season by\nseason: the NCAA's RPI, NET and NPI sheets and the coaches polls, as far\nback as each is held for the sport and division. One entry per season and\nranking system the team appeared in, read from that season's latest\nrelease. `is_final` tells a finished season's final rank from a current\none. A season or system with no entry is one the team was never ranked\nin, or one not held for this sport and division. The team must be visible\nin the requested sport/division scope."},"response":[]},{"name":"Get a team's postseason results","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/teams/:team_id/postseason?sport={{sport}}&division={{division}}&gender={{gender}}","host":["{{base_url}}"],"path":["v1","teams",":team_id","postseason"],"query":[{"key":"sport","value":"{{sport}}","description":"Sport scope, e.g. 'soccer'."},{"key":"division","value":"{{division}}","description":"Comma-separated sport-valid division scope, e.g. 'D1,NAIA,NJCAA-D1'."},{"key":"gender","value":"{{gender}}","description":"'men' or 'women'. Defaults to 'men' for a sport with both (soccer, basketball, volleyball, lacrosse, track-and-field), so pass 'women' for the women's side; ignored for single-gender sports."},{"key":"season","value":"2025","disabled":true,"description":"Team season, e.g. '2025'. One value, or several separated by commas (any of)."},{"key":"kind","value":"coach","disabled":true,"description":"Kind of entry: 'national_tournament', 'bowl_game', 'conference_regular_season' or 'conference_tournament'. One value, or several separated by commas (any of)."}],"variable":[{"key":"team_id","value":"{{team_id}}"}]},"description":"What a team won and how far it went, season by season, in four\nkinds of entry:\n\n- `national_tournament`: every national championship tournament the\n  team played in, with how far it went (`result`, `round`,\n  `teams_remaining`), its seed, and its wins and losses there. NCAA\n  tournaments are read from the NCAA's published brackets, NAIA\n  championships from the NAIA's championship record books, and the\n  College Football Playoff (organizer `CFP`) from the NCAA's scoreboard.\n- `bowl_game`: an FBS bowl the team played in. `organizer` and `event`\n  are the bowl, and `result` is `won` or `lost`. A playoff quarterfinal\n  or semifinal played as a bowl is both a `CFP` entry and a `bowl_game`\n  entry.\n- `conference_regular_season`: a conference regular-season title.\n- `conference_tournament`: a conference tournament (or championship\n  game) the team won, or lost the final of where the conference names\n  the runner-up.\n\nConference titles are read only from each conference's own list of its\nchampions, never worked out from standings. `shared` marks a title the\nconference gave to more than one team, and `conference_division` a\ntitle of a division inside the conference.\n\n`coverage` lists the competitions and seasons held for the team: the\nnational tournaments of its sport and division, and the titles of the\nconference it was in each season. Inside them, a season with no entry is\none the team did not play in the tournament, or did not win the title;\noutside them, nothing is held either way. The team must be visible in\nthe requested sport/division scope."},"response":[]},{"name":"Get a team's roster","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/teams/:team_id/roster?sport={{sport}}&gender={{gender}}","host":["{{base_url}}"],"path":["v1","teams",":team_id","roster"],"query":[{"key":"sport","value":"{{sport}}","description":"Sport scope, e.g. 'soccer'."},{"key":"division","value":"{{division}}","disabled":true,"description":"Optional. Omit it to read the team in its own current division. Given, it is a division scope like the list endpoints take, and a team outside it is a 404 whose error names the division the team is in (error.division)."},{"key":"gender","value":"{{gender}}","description":"'men' or 'women'. Defaults to 'men' for a sport with both (soccer, basketball, volleyball, lacrosse, track-and-field), so pass 'women' for the women's side; ignored for single-gender sports."},{"key":"season","value":"2025","disabled":true,"description":"Roster season (4-digit year, e.g. '2026'); defaults to the latest held."},{"key":"q","value":"carnegie","disabled":true,"description":"Case-insensitive player name contains."},{"key":"position","value":"Forward","disabled":true,"description":"Position, as listed by GET /v1/filters/catalog; matches every spelling rosters use for it ('Forward' also finds 'F' and 'Fwd'). One value, or several separated by commas (any of)."},{"key":"position_not","value":"Goalkeeper","disabled":true,"description":"Exclude these values (comma-separated). Rows with no value for the field are left out too."},{"key":"class_year","value":"Junior,Senior / Graduate","disabled":true,"description":"'Freshman', 'Sophomore', 'Junior' or 'Senior / Graduate'; matches every spelling rosters use. One value, or several separated by commas (any of)."},{"key":"class_year_not","value":"Freshman","disabled":true,"description":"Exclude these values (comma-separated). Rows with no value for the field are left out too."},{"key":"jersey_number","value":"10","disabled":true,"description":"Jersey number as published, e.g. '7' or '00'. One value, or several separated by commas (any of)."},{"key":"home_state","value":"Ohio","disabled":true,"description":"Home state or province, as a name or a postal code ('Ohio' or 'OH'). One value, or several separated by commas (any of)."},{"key":"home_country","value":"Canada","disabled":true,"description":"Home country. One value, or several separated by commas (any of)."},{"key":"is_verified","value":"true","disabled":true,"description":"true: only athletes who claimed their profile; false: only unclaimed."},{"key":"membership_source","value":"roster","disabled":true,"description":"'roster' (listed on a roster page or feed; the entries whose `membership_source` is null) or 'box_score'. One value, or several separated by commas (any of)."},{"key":"limit","value":"25","disabled":true},{"key":"cursor","value":"","disabled":true}],"variable":[{"key":"team_id","value":"{{team_id}}"}]},"description":"Roster for one team-season — identity fields only, never contact info.\nDefaults to the latest season held and paginates with an opaque `cursor`.\n`freshness` says when the roster page was last read and when the next\ncheck is due; `coverage` says what an empty list means (for example\n'not_collected' when we have not read a source for this program yet).\nPosition, class year and jersey filters read the season's own roster row,\nso a past season is filtered by what the player was then."},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('data.0.id') !== undefined && read('data.0.id') !== null) {","        pm.collectionVariables.set('player_id', String(read('data.0.id')));","    }","    if (read('data.0.person_id') !== undefined && read('data.0.person_id') !== null) {","        pm.collectionVariables.set('person_id', String(read('data.0.person_id')));","    }","}"]}}]},{"name":"Get a team's coaching staff","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/teams/:team_id/coaches?sport={{sport}}&gender={{gender}}","host":["{{base_url}}"],"path":["v1","teams",":team_id","coaches"],"query":[{"key":"sport","value":"{{sport}}","description":"Sport scope, e.g. 'soccer'."},{"key":"division","value":"{{division}}","disabled":true,"description":"Optional. Omit it to read the team in its own current division. Given, it is a division scope like the list endpoints take, and a team outside it is a 404 whose error names the division the team is in (error.division)."},{"key":"gender","value":"{{gender}}","description":"'men' or 'women'. Defaults to 'men' for a sport with both (soccer, basketball, volleyball, lacrosse, track-and-field), so pass 'women' for the women's side; ignored for single-gender sports."},{"key":"season","value":"2025","disabled":true,"description":"Season to return (championship year, e.g. '2025'); defaults to the latest held."},{"key":"q","value":"carnegie","disabled":true,"description":"Case-insensitive coach name contains."},{"key":"role","value":"assistant","disabled":true,"description":"Case-insensitive title contains, e.g. 'assistant' or 'goalkeeper'."},{"key":"is_head_coach","value":"true","disabled":true,"description":"true: head coaches only; false: the rest of the staff."},{"key":"on_behalf_of","value":"{{player_id}}","disabled":true,"description":"Enterprise: player id of a managed athlete who has authorized your account. Contact fields are then evaluated against that athlete's verified claim and the read is recorded in the athlete's access log."}],"variable":[{"key":"team_id","value":"{{team_id}}"}]},"description":"Coaching staff for one team-season, head coach first. Defaults to the\nlatest season held; pass `season` for a historical staff. `email` and\n`phone` are populated in three cases: the account's plan includes the\ncoach directory (Developer Pro, Developer Ultra and Enterprise) and the\nkey carries the exact `coach.contact.directory_read` scope; the key\nowner's own verified player claim allows coach-outreach reads; or\n`on_behalf_of` names a managed athlete who authorized the account\n(Enterprise). See the Coach contacts section. None of these is metered.\nWhen contacts are withheld, `contacts_unavailable_reason` says why. A\ncoach who asked not to be contacted has `contact_opt_out` true and no\ncontact fields. A delegated request that cannot be authorized fails with\n403 rather than silently returning nulls. `freshness` says when the staff\npage was last read; `coverage` says what an empty list means (for example\n'not_collected' when we have not read a staff page for this program yet)."},"response":[]}]},{"name":"Schools","description":"Institutions behind the teams, with the federal IPEDS UNITID for joining to external records and every program a school fields.","item":[{"name":"List schools","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/schools","host":["{{base_url}}"],"path":["v1","schools"],"query":[{"key":"q","value":"carnegie","disabled":true,"description":"Case-insensitive name contains."},{"key":"id","value":"","disabled":true,"description":"School ids. One value, or several separated by commas (any of)."},{"key":"slug","value":"carnegie-mellon-university","disabled":true,"description":"School slugs. One value, or several separated by commas (any of)."},{"key":"ipeds_unitid","value":"211440","disabled":true,"description":"Exact federal IPEDS UNITID."},{"key":"athletics_domain","value":"athletics.cmu.edu","disabled":true,"description":"Athletics site domain, e.g. 'athletics.cmu.edu'. One value, or several separated by commas (any of)."},{"key":"state","value":"PA","disabled":true,"description":"Two-letter US state code of the school. One value, or several separated by commas (any of)."},{"key":"state_not","value":"PA","disabled":true,"description":"Exclude these values (comma-separated). Rows with no value for the field are left out too."},{"key":"city","value":"Pittsburgh","disabled":true,"description":"City of the school. One value, or several separated by commas (any of)."},{"key":"control","value":"Private nonprofit","disabled":true,"description":"'Public', 'Private nonprofit' or 'Private for-profit'. One value, or several separated by commas (any of)."},{"key":"sport","value":"{{sport}}","disabled":true,"description":"Only schools that field this sport, e.g. 'soccer'. One value, or several separated by commas (any of)."},{"key":"gender","value":"{{gender}}","disabled":true,"description":"'men' or 'women': the side of `sport` (or of any sport) the school must field."},{"key":"division","value":"{{division}}","disabled":true,"description":"Only schools with a program in these divisions, e.g. 'D3' or 'D2,D3'."},{"key":"conference","value":"UAA","disabled":true,"description":"Only schools with a program in this conference. Conference, by its full name or its abbreviation: 'University Athletic Association (UAA)', 'University Athletic Association' and 'UAA' are the same conference. GET /v1/conferences lists them. One value, or several separated by commas (any of)."},{"key":"limit","value":"25","disabled":true},{"key":"cursor","value":"","disabled":true}]},"description":"Institutions, alphabetical, with the federal IPEDS UNITID where matched.\nCross-division and cross-sport; no scope is required. Look a school up by\n`ipeds_unitid` to map your own records onto ours, then fetch its programs\nwith GET /v1/schools/{school_id}.\n\n`sport`, `gender`, `division` and `conference` describe one program: a\nschool matches when a single team of its meets all of them, so\n`sport=soccer&gender=women&division=D3` is the schools with a D3 women's\nsoccer team."},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('data.0.id') !== undefined && read('data.0.id') !== null) {","        pm.collectionVariables.set('school_id', String(read('data.0.id')));","    }","}"]}}]},{"name":"Get a school and its programs","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/schools/:school_id","host":["{{base_url}}"],"path":["v1","schools",":school_id"],"variable":[{"key":"school_id","value":"{{school_id}}"}]},"description":"One institution plus every program it fields or fielded across sports\nand divisions (team ids for the scoped team endpoints), each with its\nprogram `status`. Identity only; stats stay behind the\nsport/division-scoped endpoints."},"response":[]}]},{"name":"Persons","description":"Cross-program careers and transfer histories, spanning divisions.","item":[{"name":"Get a person's cross-program career","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/persons/:person_id?sport={{sport}}&gender={{gender}}","host":["{{base_url}}"],"path":["v1","persons",":person_id"],"query":[{"key":"sport","value":"{{sport}}","description":"Sport scope, e.g. 'soccer'."},{"key":"gender","value":"{{gender}}","description":"'men' or 'women'. Defaults to 'men' for a sport with both (soccer, basketball, volleyball, lacrosse, track-and-field), so pass 'women' for the women's side; ignored for single-gender sports."}],"variable":[{"key":"person_id","value":"{{person_id}}"}]},"description":"A person's full profile via their most recent stint, with the complete\ncross-program career attached. Careers span divisions, so only a sport\n(and optional gender) scope is required."},"response":[]},{"name":"Get a person's transfer history","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/persons/:person_id/transfers","host":["{{base_url}}"],"path":["v1","persons",":person_id","transfers"],"variable":[{"key":"person_id","value":"{{person_id}}"}]},"description":"Every recorded school change for a person, oldest first. An unknown\nperson id returns an empty list. No division scope is required."},"response":[]}]},{"name":"Movements","description":"Roster and coaching-staff movements. The default feed carries what is confirmed (transfers resolved to their transfer edge, coach moves resolved to the post held the season before, head-coach changes); Enterprise keys can read the resolved and observed resolver tiers. Developer Pro and up can have the published feed pushed as webhooks.","item":[{"name":"List published movements","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/movements","host":["{{base_url}}"],"path":["v1","movements"],"query":[{"key":"kind","value":"coach","disabled":true,"description":"'player' or 'coach'."},{"key":"event_type","value":"coach_added","disabled":true,"description":"player_added | player_removed | coach_added | coach_removed | title_changed (the resolved and observed tiers also carry roster_rollover and attrs_changed). One value, or several separated by commas (any of)."},{"key":"sport_path","value":"womens-soccer","disabled":true,"description":"Full sport path, e.g. 'womens-volleyball'. One value, or several separated by commas (any of)."},{"key":"sport","value":"{{sport}}","disabled":true,"description":"Sport, e.g. 'soccer': both genders unless `gender` is given. One value, or several separated by commas (any of)."},{"key":"gender","value":"{{gender}}","disabled":true,"description":"'men' or 'women': that side of `sport`, or of every sport."},{"key":"division","value":"{{division}}","disabled":true,"description":"Division of the team, e.g. 'D3' or 'D1,D2'. 'D1' includes football's FBS and FCS."},{"key":"season","value":"2025","disabled":true,"description":"Season the movement belongs to, e.g. '2026'. One value, or several separated by commas (any of)."},{"key":"team_id","value":"{{team_id}}","disabled":true,"description":"Team ids. One value, or several separated by commas (any of)."},{"key":"school_id","value":"{{school_id}}","disabled":true,"description":"School ids: every program of the school, across sports. One value, or several separated by commas (any of)."},{"key":"ipeds_unitid","value":"211440","disabled":true,"description":"Federal IPEDS UNITID of the school."},{"key":"conference","value":"UAA","disabled":true,"description":"Conference of the team. Conference, by its full name or its abbreviation: 'University Athletic Association (UAA)', 'University Athletic Association' and 'UAA' are the same conference. GET /v1/conferences lists them. One value, or several separated by commas (any of)."},{"key":"conference_not","value":"UAA","disabled":true,"description":"Exclude these values (comma-separated). Rows with no value for the field are left out too."},{"key":"state","value":"PA","disabled":true,"description":"Two-letter US state code of the school. One value, or several separated by commas (any of)."},{"key":"state_not","value":"PA","disabled":true,"description":"Exclude these values (comma-separated). Rows with no value for the field are left out too."},{"key":"resolution_status","value":"new_hire","disabled":true,"description":"Resolver outcome, e.g. 'linked_transfer' or 'new_hire' (see the `resolution_status` field). One value, or several separated by commas (any of)."},{"key":"since","value":"2026-09-01T00:00:00Z","disabled":true,"description":"ISO datetime; only movements at/after this time. Compared against published_at on the published tier and observed_at on the resolved and observed tiers."},{"key":"until","value":"2026-10-01T00:00:00Z","disabled":true,"description":"ISO datetime; only movements at/before this time (same clock as `since`)."},{"key":"status","value":"published","disabled":true,"description":"Feed tier: 'published' (curated, every plan), 'resolved' (identity resolution finished; Enterprise), or 'observed' (every non-dismissed event including pending ones; Enterprise)."},{"key":"limit","value":"25","disabled":true},{"key":"cursor","value":"","disabled":true}]},"description":"Roster and coaching-staff movements, newest first. Cross-sport and\ncross-division: no scope is required, and every filter is optional, so\n`school_id=` alone is one school's movements in all of its sports. The\ndefault `published` tier carries what is confirmed: a transfer once it is\nresolved to the transfer it made (`transfer_id`), reported as the arrival\nat the new school and the departure from the old one; a coach's move once\nit is resolved to the post at another school they held the season before;\nand confirmed head-coach changes. Each event is reported at the school the\nperson joined or left. Enterprise keys can read the resolver stream with\n`status=resolved` (identity resolved, including departures with no known\ndestination and new hires with no known previous post) or\n`status=observed` (every non-dismissed event, including pending ones),\neach row carrying its `resolution_status` so you choose the confidence\nthreshold. `person_id` links into GET /v1/persons/{person_id};\n`transfer_id` is the transfer edge a player movement minted.\n\nTo poll for new movements, keep the newest `published_at` you have seen,\npass it as `since` on the next call, and drop rows whose `kind` and `id`\nyou already hold (`since` is inclusive). That finds what was published,\nnot what changed afterwards: a correction leaves `published_at` as it\nwas, and a retracted movement is no longer returned at all. To keep a\ncopy of the feed correct, poll GET /v1/movements/changes instead. One\ncall returns players and coaches together unless `kind` is set. A\nmovement's key is (`kind`, `id`): ids are unique within a kind only."},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('data.0.person_id') !== undefined && read('data.0.person_id') !== null) {","        pm.collectionVariables.set('person_id', String(read('data.0.person_id')));","    }","}"]}}]},{"name":"List changes to published movements","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/movements/changes","host":["{{base_url}}"],"path":["v1","movements","changes"],"query":[{"key":"since","value":"2026-09-01T00:00:00Z","disabled":true,"description":"ISO datetime; only changes recorded at/after this time (`changed_at`). Omit it to read the whole log."},{"key":"kind","value":"coach","disabled":true,"description":"'player' or 'coach'."},{"key":"sport_path","value":"womens-soccer","disabled":true,"description":"Full sport path, e.g. 'womens-volleyball'. One value, or several separated by commas (any of)."},{"key":"sport","value":"{{sport}}","disabled":true,"description":"Sport, e.g. 'soccer': both genders unless `gender` is given. One value, or several separated by commas (any of)."},{"key":"gender","value":"{{gender}}","disabled":true,"description":"'men' or 'women': that side of `sport`, or of every sport."},{"key":"division","value":"{{division}}","disabled":true,"description":"Division of the team, e.g. 'D3' or 'D1,D2'. 'D1' includes football's FBS and FCS."},{"key":"limit","value":"25","disabled":true},{"key":"cursor","value":"","disabled":true}]},"description":"The change log of the published movement feed, oldest change first:\nevery movement that is or was in GET /v1/movements, in its current\nstate, ordered by when that state was last recorded. Polling it keeps a\ncopy of the feed correct, which polling GET /v1/movements by\n`published_at` cannot: a movement that is corrected after publication\n(its school, its counterpart, the person it is linked to) comes back\nhere with a higher `revision`, and one that is withdrawn comes back with\n`state` 'retracted' and the `reason`.\n\nTo sync, read pages until `has_more` is false, then keep the last\nentry's `changed_at` and pass it as `since` on the next poll (`since` is\ninclusive, so expect that entry again). Apply each entry by\n(`movement.kind`, `movement.id`): store `movement` when `state` is\n'published', remove what you hold when it is 'retracted'. An entry is\nthe movement's latest state, not one event per change: a movement\ncorrected twice between two polls appears once, as it now stands. A\nchange to how a school is displayed (its name or logo) is not a\nrevision. A change is recorded here within about a minute of being\nmade. The movement webhooks deliver the same changes as they happen."},"response":[]}]},{"name":"Games","description":"Games with box scores and play-by-play where covered.","item":[{"name":"List games","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/games?sport={{sport}}&division={{division}}&gender={{gender}}","host":["{{base_url}}"],"path":["v1","games"],"query":[{"key":"sport","value":"{{sport}}","description":"Sport scope, e.g. 'soccer'."},{"key":"division","value":"{{division}}","description":"Comma-separated sport-valid division scope, e.g. 'D1,NAIA,NJCAA-D1'."},{"key":"gender","value":"{{gender}}","description":"'men' or 'women'. Defaults to 'men' for a sport with both (soccer, basketball, volleyball, lacrosse, track-and-field), so pass 'women' for the women's side; ignored for single-gender sports."},{"key":"team_id","value":"{{team_id}}","disabled":true,"description":"Only games these teams played, home or away. One value, or several separated by commas (any of)."},{"key":"opponent_id","value":"","disabled":true,"description":"With `team_id`: only games against these teams (a head-to-head). One value, or several separated by commas (any of)."},{"key":"home_team_id","value":"{{team_id}}","disabled":true,"description":"Home team ids. One value, or several separated by commas (any of)."},{"key":"away_team_id","value":"{{team_id}}","disabled":true,"description":"Away team ids. One value, or several separated by commas (any of)."},{"key":"winner_team_id","value":"{{team_id}}","disabled":true,"description":"Only games these teams won. One value, or several separated by commas (any of)."},{"key":"season","value":"2025","disabled":true,"description":"Championship year, e.g. '2025'. One value, or several separated by commas (any of)."},{"key":"status","value":"final","disabled":true,"description":"scheduled | final | postponed | cancelled | forfeit. One value, or several separated by commas (any of)."},{"key":"status_not","value":"cancelled","disabled":true,"description":"Exclude these values (comma-separated). Rows with no value for the field are left out too."},{"key":"game_date_min","value":"2025-09-01","disabled":true,"description":"ISO date; only games on/after this date."},{"key":"game_date_max","value":"2025-11-30","disabled":true,"description":"ISO date; only games on/before this date."},{"key":"date_from","value":"2025-09-01","disabled":true,"description":"Older name for `game_date_min`."},{"key":"date_to","value":"2025-11-30","disabled":true,"description":"Older name for `game_date_max`."},{"key":"conference","value":"UAA","disabled":true,"description":"Only games involving a team from this conference (that season's membership). Conference, by its full name or its abbreviation: 'University Athletic Association (UAA)', 'University Athletic Association' and 'UAA' are the same conference. GET /v1/conferences lists them. One value, or several separated by commas (any of)."},{"key":"conference_game","value":"true","disabled":true,"description":"true: both teams share a conference; false: they do not."},{"key":"neutral_site","value":"false","disabled":true,"description":"true: neutral-site games only; false: the rest."},{"key":"venue","value":"stadium","disabled":true,"description":"Case-insensitive venue contains."},{"key":"location","value":"Pittsburgh","disabled":true,"description":"Case-insensitive location (city, state) contains."},{"key":"attendance_min","value":"500","disabled":true,"description":"Attendance at least this."},{"key":"attendance_max","value":"5000","disabled":true,"description":"Attendance at most this."},{"key":"home_score_min","value":"3","disabled":true,"description":"Home score at least this."},{"key":"home_score_max","value":"0","disabled":true,"description":"Home score at most this."},{"key":"away_score_min","value":"1","disabled":true,"description":"Away score at least this."},{"key":"away_score_max","value":"0","disabled":true,"description":"Away score at most this."},{"key":"has_boxscore","value":"true","disabled":true,"description":"true: only games with a `boxscore_url`; false: only those without."},{"key":"sort_by","value":"game_date","disabled":true,"description":"game_date (default) | attendance | home_score | away_score."},{"key":"sort_order","value":"descending","disabled":true,"description":"'ascending' or 'descending'."},{"key":"limit","value":"25","disabled":true},{"key":"cursor","value":"","disabled":true}]},"description":"Games (fixtures) in the requested sport/division scope, newest first.\nOne row per real-world game, side-anchored (home/away). A cross-division\ngame is visible in either side's division scope. Paginates with an opaque\n`cursor`; ids feed GET /v1/games/{game_id}."},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('data.0.id') !== undefined && read('data.0.id') !== null) {","        pm.collectionVariables.set('game_id', String(read('data.0.id')));","    }","}"]}}]},{"name":"Get a game","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/games/:game_id?sport={{sport}}&division={{division}}&gender={{gender}}","host":["{{base_url}}"],"path":["v1","games",":game_id"],"query":[{"key":"sport","value":"{{sport}}","description":"Sport scope, e.g. 'soccer'."},{"key":"division","value":"{{division}}","description":"Comma-separated sport-valid division scope, e.g. 'D1,NAIA,NJCAA-D1'."},{"key":"gender","value":"{{gender}}","description":"'men' or 'women'. Defaults to 'men' for a sport with both (soccer, basketball, volleyball, lacrosse, track-and-field), so pass 'women' for the women's side; ignored for single-gender sports."}],"variable":[{"key":"game_id","value":"{{game_id}}"}]},"description":"One game with everything held for it: the fixture (`detail.game`), team\nand player box scores, play-by-play, and per-sport extras (drives, recaps).\nShape varies by sport. Ids come from GET /v1/games."},"response":[]}]},{"name":"Transfer Portal","description":"The live NCAA transfer portal feed. Requires a paid plan (usage-billed on Plus and Premium) and an active verified coach with exact delegated portal scopes. No coaching plan is needed.","item":[{"name":"Transfer portal (verified coach, usage-billed)","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/portal?sport={{sport}}&division={{division}}&gender={{gender}}","host":["{{base_url}}"],"path":["v1","portal"],"query":[{"key":"sport","value":"{{sport}}","description":"Sport scope, e.g. 'soccer'."},{"key":"division","value":"{{division}}","description":"Comma-separated sport-valid division scope, e.g. 'D1,NAIA,NJCAA-D1'."},{"key":"gender","value":"{{gender}}","description":"'men' or 'women'. Defaults to 'men' for a sport with both (soccer, basketball, volleyball, lacrosse, track-and-field), so pass 'women' for the women's side; ignored for single-gender sports."},{"key":"status","value":"INC","disabled":true,"description":"NCAA record status: INC (active), REACT, WTH (withdrawn), SIG (signed), MAT (matriculated). One value, or several separated by commas (any of)."},{"key":"status_not","value":"cancelled","disabled":true,"description":"Exclude these values (comma-separated). Rows with no value for the field are left out too."},{"key":"year","value":"2025-26","disabled":true,"description":"Portal cycle the entry belongs to, e.g. '2025-26'. One value, or several separated by commas (any of)."},{"key":"q","value":"carnegie","disabled":true,"description":"Case-insensitive athlete name contains."},{"key":"team","value":"Carnegie Mellon University","disabled":true,"description":"School the athlete is leaving, exactly as the entry's `team`. One value, or several separated by commas (any of)."},{"key":"team_not","value":"","disabled":true,"description":"Exclude these values (comma-separated). Rows with no value for the field are left out too."},{"key":"conference","value":"ACC","disabled":true,"description":"Conference of the school the athlete is leaving: the NCAA's name as on the entry ('Atlantic Coast Conference'), or the abbreviation our teams use for it ('ACC'). One value, or several separated by commas (any of)."},{"key":"conference_not","value":"UAA","disabled":true,"description":"Exclude these values (comma-separated). Rows with no value for the field are left out too."},{"key":"is_grad_transfer","value":"true","disabled":true,"description":"true: graduate transfers only; false: the rest."},{"key":"designated_student_athlete","value":"false","disabled":true,"description":"true: designated student-athletes only; false: the rest."},{"key":"player_id","value":"{{player_id}}","disabled":true,"description":"Only entries matched to these player ids. One value, or several separated by commas (any of)."},{"key":"has_player","value":"true","disabled":true,"description":"true: only entries matched to a roster player (`player_id` set); false: only unmatched."},{"key":"initiated_date_min","value":"2026-04-01","disabled":true,"description":"ISO date; entered the portal on/after this date."},{"key":"initiated_date_max","value":"2026-06-30","disabled":true,"description":"ISO date; entered the portal on/before this date."},{"key":"since","value":"2026-09-01T00:00:00Z","disabled":true,"description":"ISO 8601 — only entries first seen at/after this time."},{"key":"until","value":"2026-10-01T00:00:00Z","disabled":true,"description":"ISO 8601 — only entries first seen at/before this time."},{"key":"sort_by","value":"first_seen_at","disabled":true,"description":"first_seen_at (default) | initiated_date | last_seen_at."},{"key":"sort_order","value":"descending","disabled":true,"description":"'ascending' or 'descending'."},{"key":"limit","value":"25","disabled":true},{"key":"cursor","value":"","disabled":true}]},"description":"Live transfer-portal entries for a sport/division, newest first.\n\nRequires a paid plan with API billing enabled; no coaching plan is\nneeded. Plus and Premium bill each request; Developer Pro and above\ninclude it. The key must delegate `portal.entry.read`, and\nthe current actor must be an active verified coach. `contacts`\nadditionally requires the exact `portal.contact.read` scope under the\nsame actor policy. Use `since` for incremental polling. An entry with no\nreadable `initiated_date` is left out of an `initiated_date` range."},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('data.0.player_id') !== undefined && read('data.0.player_id') !== null) {","        pm.collectionVariables.set('player_id', String(read('data.0.player_id')));","    }","    if (read('data.0.person_id') !== undefined && read('data.0.person_id') !== null) {","        pm.collectionVariables.set('person_id', String(read('data.0.person_id')));","    }","}"]}}]}]},{"name":"Query","description":"Agent-backed natural-language questions over the data. Usage-billed.","item":[{"name":"Natural-language query (usage-billed)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/query","host":["{{base_url}}"],"path":["v1","query"]},"description":"Ask a question in plain language; an agent researches the answer against\nthe requested sport/division scope. Returns 202 with a `run_id`\nimmediately — poll GET /v1/query/{run_id} (runs typically finish in under\na minute). Billed by token usage once the run completes.\n\nA question about the transfer portal is answered from the live feed when\nthe key delegates `portal.entry.read` and the current actor is an active\nverified coach; no coaching plan is needed.","body":{"mode":"raw","raw":"{\n  \"prompt\": \"Who led the NESCAC in assists this season?\",\n  \"sport\": \"soccer\",\n  \"division\": \"D3\",\n  \"gender\": \"men\"\n}","options":{"raw":{"language":"json"}}}},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('run_id') !== undefined && read('run_id') !== null) {","        pm.collectionVariables.set('run_id', String(read('run_id')));","    }","}"]}}]},{"name":"Query run status","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/query/:run_id","host":["{{base_url}}"],"path":["v1","query",":run_id"],"variable":[{"key":"run_id","value":"{{run_id}}"}]},"description":"Status of a query run you created. `answer` appears once the run is\nterminal; `usage` (tokens and billed amount) lands seconds later when\nbilling finalizes."},"response":[]}]},{"name":"Alerts","description":"Standing transfer-portal watches: matches push to registered webhook endpoints (alert.triggered) or poll on demand. Requires a paid plan (usage-billed monthly on Plus and Premium) and an active verified coach, as the portal feed does. No coaching plan is needed.","item":[{"name":"List alerts","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/alerts","host":["{{base_url}}"],"path":["v1","alerts"]},"description":"All alerts created through the API for this account, newest first.\nAlerts created in the app are not visible here."},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('data.0.id') !== undefined && read('data.0.id') !== null) {","        pm.collectionVariables.set('alert_id', String(read('data.0.id')));","    }","}"]}}]},{"name":"Create alert (verified coach, usage-billed monthly)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/alerts","host":["{{base_url}}"],"path":["v1","alerts"]},"description":"Watch the transfer portal for entries matching a filter set. Matches\npush to webhook endpoints registered in the console (event\n`alert.triggered`); GET /v1/alerts/{alert_id}/matches remains available\nfor polling.\n\nRequires a paid plan with API billing enabled; no coaching plan is\nneeded. Plus and Premium bill each active alert per calendar month,\ncharged on creation; Developer Pro and above include it. The key must\ndelegate `automation.portal_trigger.use` (and\n`automation.portal_filter.use` or `automation.player_filter.use` for the\nfilter sections it uses), and the current actor must be an active\nverified coach.","body":{"mode":"raw","raw":"{\n  \"name\": \"D1 women's soccer goalkeepers\",\n  \"sport\": \"soccer\",\n  \"division\": \"D1\",\n  \"gender\": \"women\",\n  \"filters\": {\n    \"player\": [\n      {\n        \"field\": \"position\",\n        \"op\": \"in\",\n        \"value\": [\n          \"Goalkeeper\"\n        ]\n      }\n    ]\n  },\n  \"webhook_url\": \"https://example.com/hooks/portal\",\n  \"enabled\": true\n}","options":{"raw":{"language":"json"}}}},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('id') !== undefined && read('id') !== null) {","        pm.collectionVariables.set('alert_id', String(read('id')));","    }","}"]}}]},{"name":"Delete alert","request":{"method":"DELETE","header":[],"url":{"raw":"{{base_url}}/v1/alerts/:alert_id","host":["{{base_url}}"],"path":["v1","alerts",":alert_id"],"variable":[{"key":"alert_id","value":"{{alert_id}}"}]},"description":"Delete an API-created alert. The current month's charge is not\nrefunded, and recreating within the same month does not double-charge."},"response":[]},{"name":"List an alert's recent matches","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/alerts/:alert_id/matches","host":["{{base_url}}"],"path":["v1","alerts",":alert_id","matches"],"query":[{"key":"limit","value":"25","disabled":true}],"variable":[{"key":"alert_id","value":"{{alert_id}}"}]},"description":"Recent portal entries that matched an alert, newest first. The polling\nalternative to `alert.triggered` webhook deliveries."},"response":[]}]},{"name":"Exports","description":"Async bulk exports: one dataset per job, gzipped CSV/JSONL, signed download URL. Usage-billed by size.","item":[{"name":"Create a bulk export (usage-billed)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/exports","host":["{{base_url}}"],"path":["v1","exports"]},"description":"Export one dataset (players, teams, games, or coaches) in one\nsport/division scope as a gzipped CSV or JSONL file. Returns 202 with an\n`export_id` immediately — poll GET /v1/exports/{export_id} for the signed\ndownload URL (most exports finish in well under a minute). Billed on\nsuccess by result size; failed exports are never billed.","body":{"mode":"raw","raw":"{\n  \"dataset\": \"players\",\n  \"format\": \"csv\",\n  \"sport\": \"soccer\",\n  \"division\": \"D3\",\n  \"gender\": \"men\",\n  \"season\": \"2025\",\n  \"conference\": \"NESCAC\"\n}","options":{"raw":{"language":"json"}}}},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('export_id') !== undefined && read('export_id') !== null) {","        pm.collectionVariables.set('export_id', String(read('export_id')));","    }","}"]}}]},{"name":"List export jobs","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/exports","host":["{{base_url}}"],"path":["v1","exports"],"query":[{"key":"limit","value":"25","disabled":true},{"key":"cursor","value":"","disabled":true}]},"description":"The caller's export jobs, newest first. Download URLs are minted by\nGET /v1/exports/{export_id}, not here."},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('data.0.export_id') !== undefined && read('data.0.export_id') !== null) {","        pm.collectionVariables.set('export_id', String(read('data.0.export_id')));","    }","}"]}}]},{"name":"Get an export job","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/exports/:export_id","host":["{{base_url}}"],"path":["v1","exports",":export_id"],"variable":[{"key":"export_id","value":"{{export_id}}"}]},"description":"Status of one export job. Once `status` is 'succeeded', `download_url`\nholds a fresh short-lived signed URL (mint a new one by polling again).\nThe stored file expires at `expires_at`."},"response":[]}]},{"name":"Managed athletes","description":"Enterprise only: invite athletes to authorize your platform, then read coach contacts on their behalf with on_behalf_of. Every delegated read is recorded in the athlete's access log. The coach directory itself is on Developer Pro and up (see the Coach contacts section).","item":[{"name":"Invite an athlete to authorize your account","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{base_url}}/v1/athletes","host":["{{base_url}}"],"path":["v1","athletes"]},"description":"Send one athlete an invitation to authorize your platform. The email\ngoes to an address we can vouch for (the athlete's on-file contact, their\nschool .edu address, or the account that already claimed the profile);\naccepting it also completes the athlete's verified claim. The grant starts\nas `invited` and becomes `active` when the athlete accepts. Re-inviting a\ndeclined, revoked, or expired athlete reuses the same grant id.","body":{"mode":"raw","raw":"{\n  \"player_id\": 13232,\n  \"sport_path\": \"mens-soccer\",\n  \"organization_name\": \"Northstar Recruiting\"\n}","options":{"raw":{"language":"json"}}}},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('id') !== undefined && read('id') !== null) {","        pm.collectionVariables.set('grant_id', String(read('id')));","    }","}"]}}]},{"name":"List your managed athletes","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/athletes","host":["{{base_url}}"],"path":["v1","athletes"],"query":[{"key":"status","value":"active","disabled":true,"description":"Filter: invited | active | declined | revoked | expired."},{"key":"limit","value":"25","disabled":true},{"key":"cursor","value":"","disabled":true}]},"description":"Every athlete who has been invited to, or has authorized, your account,\nnewest first. `active` grants are the ones `on_behalf_of` accepts."},"response":[],"event":[{"listen":"test","script":{"type":"text/javascript","exec":["// Keeps ids from this response for the requests that need them.","if (pm.response.code < 300) {","    let body = {};","    try { body = pm.response.json(); } catch (e) { body = {}; }","    const read = (path) => path.split('.').reduce(","        (node, key) => (node === null || node === undefined ? undefined : node[key]), body);","    if (read('data.0.id') !== undefined && read('data.0.id') !== null) {","        pm.collectionVariables.set('grant_id', String(read('data.0.id')));","    }","}"]}}]},{"name":"Get one managed athlete","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/athletes/:grant_id","host":["{{base_url}}"],"path":["v1","athletes",":grant_id"],"variable":[{"key":"grant_id","value":"{{grant_id}}"}]},"description":"One grant by id, including its current status and timestamps."},"response":[]},{"name":"Revoke an athlete authorization","request":{"method":"DELETE","header":[],"url":{"raw":"{{base_url}}/v1/athletes/:grant_id","host":["{{base_url}}"],"path":["v1","athletes",":grant_id"],"variable":[{"key":"grant_id","value":"{{grant_id}}"}]},"description":"End the authorization (or cancel a pending invitation). Delegated\nreads for the athlete fail from the next request; the grant stays listed\nas `revoked` for your records."},"response":[]},{"name":"Resend a pending invitation","request":{"method":"POST","header":[],"url":{"raw":"{{base_url}}/v1/athletes/:grant_id/resend","host":["{{base_url}}"],"path":["v1","athletes",":grant_id","resend"],"variable":[{"key":"grant_id","value":"{{grant_id}}"}]},"description":"Issue a fresh 14-day invitation link to the same address. Only\n`invited` grants can be resent; re-invite a declined, revoked, or expired\nathlete with POST /v1/athletes instead."},"response":[]},{"name":"Audit log of delegated reads for one athlete","request":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/athletes/:grant_id/access","host":["{{base_url}}"],"path":["v1","athletes",":grant_id","access"],"query":[{"key":"limit","value":"25","disabled":true},{"key":"cursor","value":"","disabled":true}],"variable":[{"key":"grant_id","value":"{{grant_id}}"}]},"description":"Every request that returned contact fields on this athlete's behalf,\nnewest first. The athlete sees the same log in their settings."},"response":[]}]}]}