PlayCaller API
120 live endpoints across 9 sports: NFL, MLB, NBA, NHL, CFB, Soccer (6 leagues), Tennis, Golf, and UFC. Player data, stats, scores, standings, injury signals, fantasy scoring, historical trends, and the validated /v1/feed intelligence layer, all in clean JSON.
https://api.playcallerapp.comMost data endpoints use the
/v1/ prefix (e.g. /v1/mlb/players, /v1/nfl/games).
Intelligence feeds are at /intelligence/ (no /v1/ prefix).
Account endpoints use /daas/ (e.g. /daas/usage).
All responses are JSON. All requests use HTTPS.
5-Step Quickstart
From zero to your first successful API call in under 5 minutes.
[email protected].
Click the link to activate your key. The link expires in 24 hours.
/developer/dashboard where your key is displayed.
Sandbox keys are prefixed pc_sbx_. Build keys use pc_bld_, Pro Insights keys use pc_pri_.
PC_API_KEY=pc_sbx_your_key in your .env file.
curl -H "X-PlayCaller-Key: $PC_API_KEY" \ https://api.playcallerapp.com/intelligence/news?limit=1
SDK Quickstart
Official SDKs for TypeScript and Python, with full IDE autocomplete, typed responses, and built-in retry handling. Auto-generated from the OpenAPI spec so they're always in sync.
npm install @playcaller/sdk
// Full IDE autocomplete + typed responses import { PlaycallerApiClient } from "@playcaller/sdk"; const client = new PlaycallerApiClient({ apiKey: "pc_sbx_..." }); // Get NFL injury signals const injuries = await client.intelligence.getIntelligenceInjuries({ sport: "nfl" }); // Get player alpha metrics (Pro Insights+) const alpha = await client.multi.getPlayerAlphaMetrics({ sport: "nfl", id: "pc_nfl_001234" });
pip install playcaller-sdk
from playcaller import PlaycallerApi client = PlaycallerApi(api_key="pc_sbx_...") # Get live MLB game scores games = client.mlb.list_mlb_games(date="today") # Semantic player similarity (Pro Insights+) similar = client.multi.get_similar_players("pc_nfl_001234", sport="nfl")
The PlayCaller MCP server lets Cursor, Claude Desktop, and other AI tools call sports data endpoints directly as tools, no SDK required.
// Add to your Claude Desktop / Cursor MCP config: { "playcaller": { "url": "https://api.playcallerapp.com/mcp", "headers": { "X-PlayCaller-Key": "pc_sbx_..." } } }
Authentication
All API requests must include your API key in the X-PlayCaller-Key header.
Query-string authentication is not supported.
X-PlayCaller-Key: pc_sbx_your_api_key_here
Key prefixes by tier: pc_sbx_ (Sandbox), pc_bld_ (Build), pc_pri_ (Pro Insights), pc_syn_ (Syndicate Alpha).
A valid key returns HTTP 200 with your requested data:
{ "status": "success", "data": { /* ... response payload ... */ } }
A missing or invalid key returns HTTP 401:
{ "status": "error", "code": "INVALID_API_KEY", "message": "API key is missing or invalid. Include it in the X-PlayCaller-Key header." }
GET /intelligence/news
Real-time player signals across NFL, MLB, NBA, and NHL: injuries, depth chart changes, role shifts, and practice reports.
Sourced from beat reporter feeds. Updated every 2 hours. Available on all tiers.
Note: this endpoint is at /intelligence/news, not /v1/intelligence/news, intentionally outside the versioned namespace.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Optional | Filter by sport: nfl, mlb, nba. Omit to return all sports. Passing ?position= returns a 400. |
| severity | string | Optional | Filter by severity: high, medium, low. Omit to return all. |
| team | string | Optional | 3-letter team abbreviation (e.g., PHI, KC, NYY). Filter to single team. |
| limit | integer | Optional | Records to return. Default: 25. Max: 100. |
curl -X GET \ -H "X-PlayCaller-Key: pc_sbx_your_key" \ "https://api.playcallerapp.com/intelligence/news?sport=nfl&severity=high&team=SF&limit=5"
import requests api_key = "pc_sbx_your_key" url = "https://api.playcallerapp.com/intelligence/news" params = { "sport": "nfl", "severity": "high", "limit": 5 } headers = {"X-PlayCaller-Key": api_key} response = requests.get(url, headers=headers, params=params) data = response.json() for signal in data["data"]: print(signal["player_name"], signal["sport"], signal["severity"], signal["summary"])
{ "success": true, "endpoint": "/intelligence/news", "count": 2, "data": [ { "id": 1247, "player_name": "Christian McCaffrey", "team": "SF", "sport": "nfl", "signal_type": "injury_update", "severity": "high", "title": "McCaffrey listed doubtful with calf injury", "summary": "CMC did not practice Wednesday or Thursday. Elijah Mitchell expected to start.", "source": "ESPN Injury Report", "source_url": "https://espn.com/...", "published_at": "2026-03-28T14:32:00Z" } ], "meta": { "tier": "sandbox", "calls_remaining_today": 195 } }
| Field | Type | Description |
|---|---|---|
| id | integer | Signal record ID |
| player_name | string | Full player name |
| team | string | 3-letter team code |
| sport | string | Sport key: nfl, mlb, or nba |
| signal_type | string | Type of signal (e.g., injury_update, depth_chart, role_change) |
| severity | string | high, medium, or low |
| title | string | Short signal headline |
| summary | string | Full signal text |
| confidence_score | integer|null | Calibrated probability score (0-75 display range) from a logistic regression model trained on 20,585 observations across 5 NFL seasons. AUC-ROC 0.697, 4.61x decile lift. null for non-NFL signals. |
| source | string | Source name (e.g., beat reporter, injury report) |
| source_url | string|null | Original source URL, if available |
| published_at | string | ISO 8601 timestamp when signal was scraped |
GET /intelligence/injuries
Dedicated injury feed: returns only injury-type signals (injury_update, return_from_injury, injury_return, injury_risk).
Filters out general news and role change signals. Updated every 2 hours. Available on all tiers.
Note: this endpoint is at /intelligence/injuries, not /v1/intelligence/injuries.
curl "https://api.playcallerapp.com/intelligence/injuries?sport=nfl&severity=high&team=CIN&limit=5" \ -H "X-PlayCaller-Key: pc_sbx_your_key"
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Optional | Filter by sport: nfl, mlb, nba. Omit for all sports. |
| severity | string | Optional | Filter: high, medium, low |
| team | string | Optional | 3-letter team code (e.g., CIN, NYY, LAL) |
| player | string | Optional | Player name substring match |
| limit | integer | Optional | Max results (default 50, max 200) |
| Field | Type | Description |
|---|---|---|
| player_name | string | Full player name |
| team | string | 3-letter team abbreviation |
| sport | string | Sport key: nfl, mlb, or nba |
| signal_type | string | injury_update, return_from_injury, injury_return, or injury_risk |
| severity | string | high, medium, or low |
| title | string | Short headline |
| summary | string | Full signal text |
| published_at | string | ISO 8601 timestamp when signal was scraped |
GET /v1/analytics/trends Pro Insights
Historical NFL performance data (2021–2025). Game-by-game stats including fantasy points, snap%, target share, and air yards. Grouped and sorted by player. Requires Pro Insights tier.
| Parameter | Type | Required | Description |
|---|---|---|---|
| player_name | string | Optional | Partial name match (case-insensitive). E.g., McCaffrey, Hill. |
| team | string | Optional | 3-letter team abbreviation (e.g., MIA, SF). |
| position | string | Optional | QB, RB, WR, TE. Filter by position. |
| season | integer | Optional | NFL season year: 2023, 2024, or 2025. |
| week | integer | Optional | NFL week number (1–18). Filter to a specific week. |
| limit | integer | Optional | Max records to return. Default: 50. Max: 500. |
curl -X GET \ -H "X-PlayCaller-Key: pc_pri_your_key" \ "https://api.playcallerapp.com/v1/analytics/trends?position=RB&season=2024&limit=10"
import requests api_key = "pc_pri_your_key" url = "https://api.playcallerapp.com/v1/analytics/trends" params = { "player_name": "McCaffrey", "season": 2024 } headers = {"X-PlayCaller-Key": api_key} response = requests.get(url, headers=headers, params=params) data = response.json() for trend in data["trends"]: print(trend["player_name"], "avg fp:", trend["avg_fantasy_points"])
{ "success": true, "endpoint": "/v1/analytics/trends", "seasons": [2024], "total_records": 12, "trends": [ { "player_name": "Christian McCaffrey", "team": "SF", "position": "RB", "games_in_sample": 4, "avg_fantasy_points": 28.4, "recent_game": { "season": 2024, "week": 4, "opponent": "NE", "fantasy_points": 31.2, "rushing_yards": 141, "rushing_tds": 1, "receiving_yards": 71, "receptions": 7, "snap_pct": 84, "target_share": 22, "air_yards": 45 }, "all_games": [/* ... array of same shape as recent_game ... */] } ], "meta": { "tier": "pro", "calls_remaining_this_month": 9847 } }
| Field | Type | Description |
|---|---|---|
| player_name | string | Full player name |
| team | string | 3-letter team code |
| position | string | Player position (QB, RB, WR, TE) |
| games_in_sample | integer | Number of game records in this player's result set |
| avg_fantasy_points | number | Average fantasy points across all games in sample |
| recent_game | object | Most recent game record (season, week, opponent, all stat fields) |
| all_games | array | All game records for this player in the result set. Each game includes: season, week, opponent, fantasy_points, passing_yards, passing_tds, rushing_yards, rushing_tds, receiving_yards, receiving_tds, receptions, snap_pct, target_share, air_yards |
MLB: Players
Access the full MLB player database: 966 players across all 30 teams, sourced from MLB Stats API and updated daily. Available on all tiers.
List active MLB players. Filterable by position, team, status, or name search.
| Parameter | Type | Required | Description |
|---|---|---|---|
| position | string | Optional | Filter by position: SP, RP, C, 1B, 2B, 3B, SS, OF, DH |
| team | string | Optional | 3-letter team abbreviation (e.g., NYY, LAD) |
| status | string | Optional | active, injured, inactive |
| search | string | Optional | Partial name search (case-insensitive) |
| limit | integer | Optional | Results per page. Default: 50. Max: 200. |
| offset | integer | Optional | Pagination offset. Default: 0. |
curl -H "X-PlayCaller-Key: pc_sbx_your_key" \ "https://api.playcallerapp.com/v1/mlb/players?team=NYY&position=SP&limit=5"
{ "success": true, "total": 18, "count": 5, "data": [ { "id": "pc_mlb_694973", "full_name": "Gerrit Cole", "position": "SP", "team": "NYY", "status": "active" } ], "meta": { "sport": "mlb", "tier": "sandbox", "calls_remaining_this_month": 996 } }
Individual player detail by PlayCaller ID (format: pc_mlb_XXXXXX).
curl -H "X-PlayCaller-Key: pc_sbx_your_key" \ "https://api.playcallerapp.com/v1/mlb/players/pc_mlb_660670"
Game-by-game stat lines for a player. Includes batting and pitching stats plus fantasy points. Updated daily after games finalize.
| Parameter | Type | Required | Description |
|---|---|---|---|
| date | string | Optional | Filter to a specific game date: YYYY-MM-DD |
| limit | integer | Optional | Number of game lines. Default: 30. Max: 200. |
curl -H "X-PlayCaller-Key: pc_sbx_your_key" \ "https://api.playcallerapp.com/v1/mlb/players/pc_mlb_660670/stats?limit=5"
{ "success": true, "player": { "full_name": "Juan Soto", "team": "NYY", "position": "OF" }, "data": [ { "stat_date": "2026-03-20", "batting": { "h": 2, "hr": 1, "rbi": 3, "sb": 0, "r": 2, "bb": 1, "ab": 4 }, "pitching": { "ip": 0, "k": 0, "sv": 0 }, "fantasy_points": 16.5, "is_final": true } ] }
MLB: Teams & Rosters
All 30 MLB teams with roster metadata. Available on all tiers.
Returns all 30 MLB teams with abbreviation, full name, roster size, and position breakdown.
curl -H "X-PlayCaller-Key: pc_sbx_your_key" \ "https://api.playcallerapp.com/v1/mlb/teams"
{ "success": true, "count": 30, "data": [ { "abbreviation": "NYY", "full_name": "New York Yankees", "roster_size": 32, "active_players": 29, "positions": ["1B","2B","3B","C","OF","RP","SP","SS"] } ] }
Full roster for a specific team. Use 3-letter abbreviation (e.g., NYY, LAD, BOS).
Optionally filter by ?position=SP.
curl -H "X-PlayCaller-Key: pc_sbx_your_key" \ "https://api.playcallerapp.com/v1/mlb/teams/LAD/roster?position=SP"
MLB: Games
Live and scheduled MLB game states polled from MLB Stats API every few minutes during game windows. Includes live scores, inning state, and lineup status. Available on all tiers.
| Parameter | Type | Required | Description |
|---|---|---|---|
| date | string | Optional | Filter by game date: YYYY-MM-DD. Default: all available. |
| state | string | Optional | Filter by game state: pre_game, scheduled, in_progress, final, completed, postponed |
| limit | integer | Optional | Max results. Default: 30. Max: 100. |
curl -H "X-PlayCaller-Key: pc_sbx_your_key" \ "https://api.playcallerapp.com/v1/mlb/games?date=2026-03-21"
{ "success": true, "data": [ { "game_pk": 748234, "game_date": "2026-03-21", "state": "final", "home_team": { "name": "Seattle Mariners", "score": 6 }, "away_team": { "name": "Chicago Cubs", "score": 3 }, "inning": 9, "is_final": true, "last_polled": "2026-03-21T04:54:52Z" } ] }
MLB: Scoring Pro Insights
Fantasy scoring leaders and rotisserie category leaders powered by PlayCaller's baseball scoring engine. Requires Pro Insights tier.
Top fantasy scorers for a given date (default: latest available date). Filterable by position, team, or date.
| Parameter | Type | Required | Description |
|---|---|---|---|
| date | string | Optional | Game date: YYYY-MM-DD. Default: most recent. |
| position | string | Optional | Filter by position: SP, OF, SS, etc. |
| team | string | Optional | 3-letter team abbreviation. |
| limit | integer | Optional | Default: 25. Max: 100. |
curl -H "X-PlayCaller-Key: pc_pri_your_key" \ "https://api.playcallerapp.com/v1/mlb/scoring/leaders?date=2026-03-20&limit=10"
{ "success": true, "data": [ { "rank": 1, "player_name": "Cole Young", "team": "Seattle Mariners", "position": "SS", "fantasy_points": 16.5, "batting": { "h": 3, "hr": 1, "rbi": 2, "sb": 1 }, "is_final": true } ] }
Rotisserie category leaders: top performers in HR, RBI, SB, Runs, Walks, IP, Strikeouts, and Saves. Returns top 10 per category for the latest (or specified) game date.
| Parameter | Type | Required | Description |
|---|---|---|---|
| date | string | Optional | Game date: YYYY-MM-DD. Default: most recent date with data. |
curl -H "X-PlayCaller-Key: pc_pri_your_key" \ "https://api.playcallerapp.com/v1/mlb/scoring/categories?date=2026-03-20"
{ "success": true, "stat_date": "2026-03-20", "home_runs": [ { "rank": 1, "id": "pc_mlb_660670", "player_name": "Juan Soto", "team": "NYY", "position": "OF", "value": 2, "stat_date": "2026-03-20" } ], "rbi": [ /* top 10 by RBI */ ], "stolen_bases": [ /* top 10 by SB */ ], "runs": [ /* top 10 by R */ ], "walks": [ /* top 10 by BB */ ], "innings_pitched": [ /* top 10 by IP */ ], "strikeouts": [ /* top 10 by K */ ], "saves": [ /* top 10 by SV */ ] }
Each category contains an array of up to 10 players. Each entry has: rank, id, player_name, team, position, value (the category stat), and stat_date.
TIER_INSUFFICIENT.
MLB: Standings
Current MLB standings by division. Returns wins, losses, win percentage, and games back for all 30 teams. Available on all tiers.
curl https://api.playcallerapp.com/v1/mlb/standings \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Recent MLB roster transactions including IL placements/activations, DFA designations, trade acquisitions, and minor-league call-ups. Sourced from MLB Stats API (statsapi.mlb.com). Cached 1 hour.
| Parameter | Type | Required | Description |
|---|---|---|---|
| startDate | string | Optional | Start date (YYYY-MM-DD, default 7 days ago) |
| endDate | string | Optional | End date (YYYY-MM-DD, default today) |
| type | string | Optional | Filter by type_code (e.g. IL, DFA, TRADE, RECALL) |
curl https://api.playcallerapp.com/v1/mlb/transactions \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Pitch-type usage and results (whiff%, hard-hit%, wOBA, xwOBA) per pitch type per season, for pitchers and batters.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | PlayCaller MLB player ID |
| season | integer | Optional | Filter to one season year |
| player_type | string | Optional | Filter to pitcher or batter rows |
curl https://api.playcallerapp.com/v1/mlb/players/pc_mlb_ohtani_01/splits \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Same shape and source as /v1/nba/depth-chart/changes, scoped to MLB.
| Parameter | Type | Required | Description |
|---|---|---|---|
| since | string | Optional | Start date (YYYY-MM-DD, default 14 days ago) |
| team | string | Optional | Team abbreviation filter |
| player | string | Optional | Player name filter (partial match) |
| limit | integer | Optional | Max results (default 50, max 100) |
curl https://api.playcallerapp.com/v1/mlb/depth-chart/changes \ -H "X-PlayCaller-Key: pc_sbx_your_key"
NBA Endpoints
7 NBA endpoints covering game scores, standings, teams, rosters, players, and per-game box score history. Powered by ESPN data pipelines. 127,909 historical game rows across 5 seasons (2021–2025). Available on all tiers.
Returns NBA players. Filterable by name search, position, team, with pagination support.
| Parameter | Type | Required | Description |
|---|---|---|---|
| search | string | Optional | Partial name match (case-insensitive) |
| position | string | Optional | Filter by position: PG, SG, SF, PF, C |
| team | string | Optional | Team abbreviation (e.g., LAL, BOS) |
| limit | integer | Optional | Results per page. Default: 50. Max: 200. |
| offset | integer | Optional | Pagination offset. Default: 0. |
curl "https://api.playcallerapp.com/v1/nba/players?team=BOS&position=PG" \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns full profile for a single NBA player by playcaller_id. Includes position, team, and status from the player identity registry.
curl https://api.playcallerapp.com/v1/nba/players/pc_nba_lebron_01 \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns per-game box score history for an NBA player. Covers 5 seasons (2021–2025) with 127,909 rows total. Supports season and limit filters.
| Parameter | Type | Required | Description |
|---|---|---|---|
| season | integer | Optional | Season year (e.g., 2024). Omit for all available. |
| limit | integer | Optional | Results to return. Default: 30. |
curl "https://api.playcallerapp.com/v1/nba/players/pc_nba_lebron_01/stats?season=2024&limit=10" \ -H "X-PlayCaller-Key: pc_sbx_your_key"
| Field | Type | Description |
|---|---|---|
| game_date | string | ISO date of game |
| season | integer | Season year |
| points / rebounds / assists | number|null | Core box score stats |
| steals / blocks / turnovers | number|null | Defensive and turnover stats |
| minutes_played | number|null | Minutes played |
| usage_rate | number|null | Usage rate percentage |
| is_starter | boolean|null | Whether the player started |
| is_back_to_back | boolean | Whether this game was a back-to-back |
| fantasy_points | number|null | Computed DK-style fantasy points |
Returns all NBA teams. Filter by conference. Each team includes player_count and a roster_url link.
curl https://api.playcallerapp.com/v1/nba/teams?conference=east \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns active roster for an NBA team by abbreviation (e.g., BOS, LAL, GSW).
curl https://api.playcallerapp.com/v1/nba/teams/BOS/roster \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns NBA game scores and states. Filter by date. Cache-Control: 30s during live games, 120s otherwise.
curl https://api.playcallerapp.com/v1/nba/games?date=today \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns current NBA standings by conference and division.
curl https://api.playcallerapp.com/v1/nba/standings \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Per-game box score stats for an NBA player from `player_game_logs`, populated by the NBA Stats connector (stats.nba.com). Returns up to 82 games for a given season.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | PlayCaller NBA player ID (format: nba_XXXXX) |
| season | string | Optional | Season (default: 2024-25) |
curl https://api.playcallerapp.com/v1/nba/players/pc_nba_lebron_01/game-log \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Lineup and rotation changes sourced from beat reporter signals (depth_chart_change, lineup_change, rotation_change, role_change, starting_lineup, practice_report, lineup_update, roster_move signal types).
| Parameter | Type | Required | Description |
|---|---|---|---|
| since | string | Optional | Start date (YYYY-MM-DD, default 14 days ago) |
| team | string | Optional | Team abbreviation filter |
| player | string | Optional | Player name filter (partial match) |
| limit | integer | Optional | Max results (default 50, max 100) |
curl https://api.playcallerapp.com/v1/nba/depth-chart/changes \ -H "X-PlayCaller-Key: pc_sbx_your_key"
NFL Endpoints
6 NFL endpoints covering players, teams, game schedules, and per-game statistical history. Game log data covers the 2024 season (weeks 1–18). Available on all tiers.
Returns NFL players from the player identity registry. Supports search, position, and team filters with pagination.
| Parameter | Type | Required | Description |
|---|---|---|---|
| search | string | Optional | Partial name match (case-insensitive) |
| position | string | Optional | Filter by position: QB, RB, WR, TE, K, DEF |
| team | string | Optional | Team abbreviation (e.g., KC, SF, DAL) |
| limit | integer | Optional | Results per page. Default: 50. Max: 200. |
| offset | integer | Optional | Pagination offset. Default: 0. |
curl "https://api.playcallerapp.com/v1/nfl/players?team=KC&position=QB" \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns full profile for a single NFL player by playcaller_id. Enriched with team name, conference, and division from the 32-team static roster.
curl https://api.playcallerapp.com/v1/nfl/players/pc_nfl_mahomes_01 \ -H "X-PlayCaller-Key: pc_sbx_your_key"
{ "success": true, "player": { "playcaller_id": "pc_nfl_mahomes_01", "full_name": "Patrick Mahomes", "position": "QB", "team": "KC", "team_name": "Kansas City Chiefs", "conference": "AFC", "division": "AFC West", "status": "active" } }
Returns per-game statistical history for an NFL player. Data sourced from historical_performance; 2024 season weeks 1–18 are available.
| Parameter | Type | Required | Description |
|---|---|---|---|
| season | integer | Optional | Season year (e.g., 2024). Omit for all available. |
| week | integer | Optional | NFL week number (1–18 regular season). |
| limit | integer | Optional | Results to return. Default: 20. |
curl "https://api.playcallerapp.com/v1/nfl/players/pc_nfl_mahomes_01/stats?season=2024" \ -H "X-PlayCaller-Key: pc_sbx_your_key"
| Field | Type | Description |
|---|---|---|
| season | integer | NFL season year |
| week | integer | Week number |
| passing_yards / passing_tds | number|null | Passing stats (QB path) |
| rushing_yards / rushing_tds | number|null | Rushing stats |
| receiving_yards / receiving_tds / receptions | number|null | Receiving stats |
| snap_pct | number|null | Snap share (0–100) |
| target_share | number|null | Target share for skill players |
| air_yards | number|null | Total air yards on targets |
| fantasy_points | number|null | Computed fantasy points (PPR scoring) |
Returns all 32 NFL teams with conference, division, and active player count. Filter by conference or division.
| Parameter | Type | Required | Description |
|---|---|---|---|
| conference | string | Optional | AFC or NFC |
| division | string | Optional | e.g., AFC West, NFC North |
curl "https://api.playcallerapp.com/v1/nfl/teams?conference=AFC" \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns active roster for a team by 2-3 letter abbreviation (e.g., KC, SF, DAL). Optional ?position= filter.
curl "https://api.playcallerapp.com/v1/nfl/teams/KC/roster?position=WR" \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns NFL game schedule and scores from the nfl_games table (285 games, 2026 season schedule).
| Parameter | Type | Required | Description |
|---|---|---|---|
| season | integer | Optional | Season year (e.g., 2026) |
| week | integer | Optional | NFL week number |
| status | string | Optional | Game status filter (e.g., final, scheduled) |
| limit | integer | Optional | Results to return. Default: 16. |
curl "https://api.playcallerapp.com/v1/nfl/games?season=2026&week=1" \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns W/L/T records for all 32 NFL teams, computed from game results. Grouped by conference and division. Optional ?season= filter (defaults to current year).
curl "https://api.playcallerapp.com/v1/nfl/standings?season=2026" \ -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/players/search
Search across NFL, MLB, NBA, and NHL player identities in a single call. Useful when the sport is unknown or you want autocomplete across all sports. Returns up to 100 results ordered alphabetically.
| Parameter | Type | Required | Description |
|---|---|---|---|
| q | string | Required | Partial name match (case-insensitive). Minimum 2 characters. |
| sport | string | Optional | Narrow to one sport: nfl, mlb, or nba. Omit for all. |
| position | string | Optional | Position filter (e.g., QB, OF, PG). |
| limit | integer | Optional | Results to return. Default: 20. Max: 100. |
curl "https://api.playcallerapp.com/v1/players/search?q=mahomes" \ -H "X-PlayCaller-Key: pc_sbx_your_key"
{ "success": true, "endpoint": "/v1/players/search", "count": 1, "query": "mahomes", "data": [ { "playcaller_id": "pc_nfl_mahomes_01", "full_name": "Patrick Mahomes", "position": "QB", "team": "KC", "sport": "nfl", "status": "active" } ] }
Historical QB+pass-catcher fantasy-point correlation pairs computed from `historical_performance` — real correlation coefficients and combined-points averages from actual co-played games, not a heuristic pairing.
| Parameter | Type | Required | Description |
|---|---|---|---|
| team | string | Optional | Filter to one team |
| position | string | Optional | Comma-separated receiver positions (default WR,TE) |
| min_games | integer | Optional | Minimum games together (default 5) |
| season | integer | Optional | Minimum season year (default 2023) |
| limit | integer | Optional | Max pairs (default 25, max 50) |
curl https://api.playcallerapp.com/v1/nfl/stacks \ -H "X-PlayCaller-Key: pc_sbx_your_key"
College Football Endpoints
College football game scores, standings, and rankings. Rankings require Growth tier or higher.
Returns CFB game scores and states. Filter by date.
curl https://api.playcallerapp.com/v1/cfb/games?date=2026-04-10 \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns current CFB conference standings.
curl https://api.playcallerapp.com/v1/cfb/standings \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns AP Top 25 and CFP rankings. Requires Growth tier or higher.
curl https://api.playcallerapp.com/v1/cfb/rankings \ -H "X-PlayCaller-Key: pc_sbx_your_key"
FBS players across all 134 teams. Supports ?search=, ?team=, ?position= filters and pagination.
| Parameter | Type | Required | Description |
|---|---|---|---|
| search | string | Optional | Partial name search |
| team | string | Optional | Team abbreviation filter |
| position | string | Optional | Position filter (QB, RB, WR, TE, etc.) |
| limit | integer | Optional | Results per page (default 50, max 200) |
| offset | integer | Optional | Pagination offset |
curl https://api.playcallerapp.com/v1/cfb/players \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Individual College Football player by PlayCaller ID. Returns full profile including school/team, position, and status.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | PlayCaller player ID (pc_cfb_XXXXXXX) |
curl https://api.playcallerapp.com/v1/cfb/players/pc_cfb_4362238 \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Per-game box score stats for a CFB player from `cfb_player_stats`, populated by the ESPN box-score connector for completed games (services/cfb-espn-boxscore.js). Passing/rushing/receiving/defensive categories are merged into one row per game — a dual-threat QB, for example, carries both passing and rushing stats on the same row.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | PlayCaller CFB player ID (format: pc_cfb_XXXXX) |
| season | integer | Optional | Filter to a single season (defaults to all seasons on file) |
curl https://api.playcallerapp.com/v1/cfb/players/pc_cfb_4362238/game-log \ -H "X-PlayCaller-Key: pc_sbx_your_key"
All FBS college football teams with active player counts and roster links. Source: seeded from ESPN public roster data.
curl https://api.playcallerapp.com/v1/cfb/teams \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Active FBS roster by team abbreviation. Includes position, jersey number, and eligibility year.
| Parameter | Type | Required | Description |
|---|---|---|---|
| team | string | Required | Team abbreviation (e.g. ALA) |
| position | string | Optional | Filter by position (QB, RB, WR, etc.) |
curl https://api.playcallerapp.com/v1/cfb/teams/ALA/roster \ -H "X-PlayCaller-Key: pc_sbx_your_key"
NHL Endpoints
NHL game scores, live updates, and division standings. Available on all tiers.
Returns NHL game scores and states. Optional ?date=today, ?state=in_progress, ?limit=.
curl https://api.playcallerapp.com/v1/nhl/games?date=today \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns NHL standings grouped by division. Optional ?season= and ?division=.
curl https://api.playcallerapp.com/v1/nhl/standings \ -H "X-PlayCaller-Key: pc_sbx_your_key"
1,047 NHL players across all 32 teams. Supports ?search=, ?team=, ?position= filters and pagination.
| Parameter | Type | Required | Description |
|---|---|---|---|
| search | string | Optional | Partial name search (case-insensitive) |
| team | string | Optional | Team abbreviation filter |
| position | string | Optional | Position filter (C, LW, RW, D, G) |
| limit | integer | Optional | Results per page (default 50, max 200) |
| offset | integer | Optional | Pagination offset |
curl https://api.playcallerapp.com/v1/nhl/players \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Individual NHL player by PlayCaller ID (pc_nhl_XXXXXX). Returns full profile including age, jersey number, and position.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | PlayCaller player ID |
curl https://api.playcallerapp.com/v1/nhl/players/pc_nhl_8478402 \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Per-game stat history for an NHL player — points, goals, assists, and fantasy points. Returns most recent season by default.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | PlayCaller player ID (pc_nhl_XXXXXXX) |
| season | integer | Optional | Season year (e.g. 2025) |
| limit | integer | Optional | Max games (default 30, max 200) |
curl https://api.playcallerapp.com/v1/nhl/players/pc_nhl_8478402/stats \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Full list of NHL teams with division/conference, active player counts, and roster links. 1,047 players seeded.
| Parameter | Type | Required | Description |
|---|---|---|---|
| conference | string | Optional | Filter by conference (Eastern, Western) |
| division | string | Optional | Filter by division (Atlantic, Metropolitan, Central, Pacific) |
curl https://api.playcallerapp.com/v1/nhl/teams \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Active roster for an NHL team by team abbreviation (e.g. BOS, NYR, TOR). Supports position filter.
| Parameter | Type | Required | Description |
|---|---|---|---|
| team | string | Required | Team abbreviation (e.g. BOS) |
| position | string | Optional | Filter by position (C, LW, RW, D, G) |
curl https://api.playcallerapp.com/v1/nhl/teams/BOS/roster \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Same shape and source as /v1/nba/depth-chart/changes, scoped to NHL.
| Parameter | Type | Required | Description |
|---|---|---|---|
| since | string | Optional | Start date (YYYY-MM-DD, default 14 days ago) |
| team | string | Optional | Team abbreviation filter |
| player | string | Optional | Player name filter (partial match) |
| limit | integer | Optional | Max results (default 50, max 100) |
curl https://api.playcallerapp.com/v1/nhl/depth-chart/changes \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Soccer Endpoints
Soccer game scores and league standings across 6 major leagues: EPL, MLS, La Liga, Bundesliga, Serie A, and UEFA Champions League. Available on all tiers.
Returns match scores and states. Filter by ?league=epl|mls|la_liga|bundesliga|serie_a|champions_league, ?date=today.
curl https://api.playcallerapp.com/v1/soccer/games?league=la_liga&date=today \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns current league table. Filter by ?league=epl|mls|la_liga|bundesliga|serie_a|champions_league.
curl https://api.playcallerapp.com/v1/soccer/standings?league=bundesliga \ -H "X-PlayCaller-Key: pc_sbx_your_key"
2,500+ players across EPL, MLS, La Liga, Bundesliga, and Serie A. Supports ?search=, ?team=, ?league=, ?position= filters.
| Parameter | Type | Required | Description |
|---|---|---|---|
| search | string | Optional | Partial name search |
| team | string | Optional | Team abbreviation (e.g. ARS) |
| league | string | Optional | League key filter: eng.1, usa.1, esp.1, ger.1, ita.1 |
| position | string | Optional | Position filter: GK, D, M, F |
| limit | integer | Optional | Results per page (default 50, max 200) |
| offset | integer | Optional | Pagination offset |
curl https://api.playcallerapp.com/v1/soccer/players \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Individual soccer player by PlayCaller ID. Returns full profile including league, club, position, and status.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | PlayCaller player ID (pc_soccer_XXXXXX) |
curl https://api.playcallerapp.com/v1/soccer/players/pc_soccer_101234 \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Per-match stats for a soccer player (EPL + MLS) from `soccer_player_match_stats`, populated by the same connector that powers Fantasy Soccer gameweek scoring (services/soccer-stats-connector.js). Coverage depends on completed matches synced since that pipeline went live 2026-08-08.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | PlayCaller soccer player ID (format: pc_soccer_XXXXX) |
curl https://api.playcallerapp.com/v1/soccer/players/pc_soccer_101234/game-log \ -H "X-PlayCaller-Key: pc_sbx_your_key"
All teams across covered leagues with player counts. Filter by ?league= (eng.1, usa.1, esp.1, ger.1, ita.1).
| Parameter | Type | Required | Description |
|---|---|---|---|
| league | string | Optional | Filter by league key (eng.1, usa.1, esp.1, ger.1, ita.1) |
curl https://api.playcallerapp.com/v1/soccer/teams \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Active roster for a soccer club. Includes position, nationality, and jersey number.
| Parameter | Type | Required | Description |
|---|---|---|---|
| team | string | Required | Team abbreviation (e.g. ARS) |
| position | string | Optional | Filter by position: GK, D, M, F |
curl https://api.playcallerapp.com/v1/soccer/teams/ARS/roster \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Tennis Endpoints
ATP and WTA match scores and results. Year-round coverage across all Grand Slams and tour events. Available on all tiers.
Returns live and completed matches. Filter by ?tour=atp|wta, ?date=today, ?state=in_progress|final.
curl https://api.playcallerapp.com/v1/tennis/matches?tour=atp&date=today \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Computes a head-to-head match record between two players from stored ESPN match results. Player names are case-insensitive partial matches.
| Parameter | Type | Required | Description |
|---|---|---|---|
| player1 | string | Required | First player name (partial match) |
| player2 | string | Required | Second player name (partial match) |
| tour | string | Optional | Tour filter (atp or wta) |
| limit | integer | Optional | Max matches (default 20, max 50) |
curl https://api.playcallerapp.com/v1/tennis/players/h2h \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns a single player's match history and win/loss record from stored ESPN match results. For a comparison between two named players, use `/v1/tennis/players/h2h` instead — this endpoint is per-player only.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Required | Player name, hyphenated (case-insensitive partial match) |
| tour | string | Optional | Tour filter (atp or wta) |
| limit | integer | Optional | Max matches (default 20, max 50) |
curl https://api.playcallerapp.com/v1/tennis/players/{name}/game-log \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Real official ATP/WTA rankings synced from ESPN, refreshed every 12h. Not a fantasy expert-consensus ranking — this is the actual tour ranking.
| Parameter | Type | Required | Description |
|---|---|---|---|
| tour | string | Optional | 'atp' or 'wta' (default atp) |
| limit | integer | Optional | Max rows (default 50, max 150) |
curl https://api.playcallerapp.com/v1/tennis/rankings \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Golf Endpoints
PGA Tour and LPGA Tour leaderboards with live scoring updated every 4 hours during active tournaments. Available on all tiers.
Lists active and recent tournaments. Optional ?tour=pga|lpga.
curl https://api.playcallerapp.com/v1/golf/tournaments \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns current tournament leaderboard with positions, scores to par, and round-by-round scores. Optional ?tour=pga|lpga, ?limit= (max 156).
curl https://api.playcallerapp.com/v1/golf/leaderboard?limit=25 \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Average strokes-to-par and average round score across a player's most recent tournaments, computed directly from stored ESPN round-by-round data (`golf_leaderboard`). Deliberately NOT framed as a fantasy points projection — golf has no fantasy scoring plugin in this API — and not a validated ML model; a real, honest recent-form statistic only.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | PlayCaller golf player ID (format: pc_golf_espn_XXXXX) |
| tournaments | integer | Optional | Number of most-recent tournaments to average over (default 5, max 20) |
curl https://api.playcallerapp.com/v1/golf/players/pc_example_id/scoring-average \ -H "X-PlayCaller-Key: pc_sbx_your_key"
NASCAR Endpoints
NASCAR Cup Series race results and computed driver standings (2026 points table). Available on all tiers.
Returns races PlayCaller has synced results for, most recent first. Unlike F1, each NASCAR event is a single race (no separate practice/qualifying sessions in the source data).
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | integer | Optional | Max races (default 20, max 40) |
curl https://api.playcallerapp.com/v1/nascar/races \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns per-driver finishing position for one race. Defaults to the most recent race if `?event=` is omitted. Sourced from ESPN's public racing API — no lap times, gaps, or team/manufacturer data are available (confirmed unavailable at the source), only finishing order.
| Parameter | Type | Required | Description |
|---|---|---|---|
| event | string | Optional | ESPN event ID for the race (defaults to most recent) |
curl https://api.playcallerapp.com/v1/nascar/results \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Driver standings computed from stored race results using the 2026 NASCAR Cup Series finishing-position points table (55 for the win, 35-1 decreasing for 2nd-40th). Excludes stage points, the fastest-lap bonus, and best-effort-excludes non-points exhibition races (Clash, Duels, All-Star) — none of that is available from the source. Not pulled from a live ESPN standings feed — that endpoint returns no structured data.
| Parameter | Type | Required | Description |
|---|---|---|---|
| season | integer | Optional | Filter to one season year (e.g. 2026); omit for all-time |
curl https://api.playcallerapp.com/v1/nascar/standings \ -H "X-PlayCaller-Key: pc_sbx_your_key"
F1 Endpoints
Race weekend results (per-session finishing position) and computed driver standings. Available on all tiers.
Returns race weekends PlayCaller has synced results for, most recent first. Each event contains multiple sessions (FP1/FP2/FP3/Qual/Race) — use `/v1/f1/results?event=` to fetch session detail.
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | integer | Optional | Max races (default 20, max 40) |
curl https://api.playcallerapp.com/v1/f1/races \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns per-driver finishing position for one race weekend, across all sessions (FP1/FP2/FP3/Qual/Race) or filtered to one via `?session=`. Defaults to the most recent race weekend if `?event=` is omitted. Sourced from ESPN's public racing API — no lap times, gaps, or team/constructor data are available (confirmed unavailable at the source), only finishing order per session.
| Parameter | Type | Required | Description |
|---|---|---|---|
| event | string | Optional | ESPN event ID for the race weekend (defaults to most recent) |
| session | string | Optional | Filter to one session |
curl https://api.playcallerapp.com/v1/f1/results \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Driver standings computed from stored Race-session results using F1's official points table (25-18-15-12-10-8-6-4-2-1 for the top 10). Not pulled from a live ESPN standings feed — that endpoint returns no structured data.
| Parameter | Type | Required | Description |
|---|---|---|---|
| season | integer | Optional | Filter to one season year (e.g. 2026); omit for all-time |
curl https://api.playcallerapp.com/v1/f1/standings \ -H "X-PlayCaller-Key: pc_sbx_your_key"
UFC Endpoints
Fighter and event data for upcoming and recent UFC cards. Available on all tiers unless noted.
Returns upcoming and recent UFC fight cards. Each row is one bout — group by `card_name` / `card_date` on the client side to reconstruct the full card.
| Parameter | Type | Required | Description |
|---|---|---|---|
| state | string | Optional | Filter by bout state (scheduled, in_progress, final) |
| limit | integer | Optional | Max bouts (default 100, max 200) |
curl https://api.playcallerapp.com/v1/ufc/events \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns all fighters appearing on upcoming or recent UFC cards, with their next scheduled fight date and card name.
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | integer | Optional | Max fighters (default 50, max 200) |
curl https://api.playcallerapp.com/v1/ufc/fighters \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Win/loss/method record for a specific fighter, aggregated from stored ESPN fight results. Fighter name is a case-insensitive partial match.
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Required | Fighter name (partial match, e.g. jones or jon-jones) |
curl https://api.playcallerapp.com/v1/ufc/fighters/{name}/record \ -H "X-PlayCaller-Key: pc_sbx_your_key"
ESPN's own consensus rankings across all 12 weight classes plus men's/women's pound-for-pound, refreshed every 12h. Omit `division` to list available divisions; pass a partial name match (e.g. `Lightweight`) to get ranked fighters.
| Parameter | Type | Required | Description |
|---|---|---|---|
| division | string | Optional | Partial division name match (e.g. "Lightweight", "Pound for Pound"). Omit to list available divisions. |
curl https://api.playcallerapp.com/v1/ufc/rankings \ -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/sports
Returns the list of all sports and endpoints currently available in the API. Useful for dynamically discovering available data sources and their status.
curl https://api.playcallerapp.com/v1/sports \ -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /daas/usage
Returns quota usage, rate limit, and tier information for the authenticated API key. Use this to build quota-aware dashboards or to monitor remaining calls before you hit limits. Available on all tiers.
curl -X GET \ -H "X-PlayCaller-Key: pc_sbx_your_key" \ "https://api.playcallerapp.com/daas/usage"
{ "success": true, "key_prefix": "pc_sbx_abc1...", "tier": "sandbox", "is_trial": true, "trial_starts_at": "2026-03-28T00:00:00Z", "trial_ends_at": "2026-04-11T00:00:00Z", "trial_days_remaining": 12, "calls_this_month": 153, "calls_limit_month": 1000, "calls_remaining": 847, "rate_limit_per_min": 30, "reset_at": "2026-04-01T00:00:00Z", "upgrade_url": "https://playcallerapp.com/developer#pricing", "endpoint_breakdown": [ { "endpoint": "/v1/intelligence/news", "calls": "98", "avg_ms": 42, "last_call": "2026-03-28T11:52:33Z" }, { "endpoint": "/v1/mlb/players", "calls": "55", "avg_ms": 61, "last_call": "2026-03-28T10:14:07Z" } ] }
| Field | Type | Description |
|---|---|---|
| key_prefix | string | First 12 chars of your key + "..." (never the full key) |
| tier | string | sandbox, build, pro_insights, or syndicate_alpha |
| is_trial | boolean | Whether this is a free trial key |
| trial_days_remaining | integer|null | Days left in trial, or null for paid keys |
| calls_this_month | integer | API calls made in the current billing cycle |
| calls_limit_month | integer | Monthly call quota for your tier |
| calls_remaining | integer | Calls remaining before hitting MONTHLY_QUOTA_EXCEEDED |
| rate_limit_per_min | integer | Per-minute rate limit |
| reset_at | string | ISO 8601 timestamp when monthly quota resets |
| endpoint_breakdown | array | Per-endpoint call counts + avg response time for the last 30 days |
Growth+ Endpoints
Advanced intelligence endpoints — odds, projections, roster context, batch lookups, and platform utilities. Growth tier and above unless noted.
Training camp and in-season depth chart moves detected from Sleeper daily snapshots. Includes AI-generated blurbs explaining fantasy impact. Active Jul 20–Feb; returns empty array off-season.
| Parameter | Type | Required | Description |
|---|---|---|---|
| since | string | Optional | Start date (YYYY-MM-DD, default 14 days ago) |
| team | string | Optional | Team abbreviation filter (e.g. KC, DAL) |
| position | string | Optional | Position filter (QB, RB, WR, TE) |
| change_type | string | Optional | Type of depth chart move |
| limit | integer | Optional | Max results (default 50, max 100) |
curl https://api.playcallerapp.com/v1/nfl/depth-chart/changes \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Players ranked by consensus Average Draft Position (ADP), blended from Sleeper and FantasyCalc. Includes position rank, tier, and our validated confidence score where available. Refreshed weekly.
| Parameter | Type | Required | Description |
|---|---|---|---|
| position | string | Optional | Filter by position |
| format | string | Optional | Scoring format (informational — ADP is sourced from PPR leagues) |
| limit | integer | Optional | Max results (default 200, max 500) |
| offset | integer | Optional | Pagination offset |
curl https://api.playcallerapp.com/v1/nfl/players/rankings \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Aggregated training camp snapshot: current depth chart position changes (last 30 days), practice status, anomaly signals, and recent game stats. Replaces 5 separate endpoint calls with a single request.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | PlayCaller NFL player ID (e.g. nfl_001234) |
curl https://api.playcallerapp.com/v1/nfl/players/pc_nfl_4046533/camp-intel \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Rank NFL players by expected fantasy points in your league's exact scoring system. Pass scoring weights in the request body; receive players sorted by `custom_pts_per_game` — computed from prior-season per-game averages.
curl -X POST https://api.playcallerapp.com/v1/nfl/rankings/custom \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns a ranked list of waiver-eligible players ordered by anomaly signal strength. Combines usage spikes, snap-share shifts, and target-rate anomalies into a single priority score — no client-side merging required. Optionally excludes injured players.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key |
| limit | integer | Optional | Max candidates (default 20, max 50) |
| position | string | Optional | Filter by position (e.g. WR, RB) |
| exclude_injured | boolean | Optional | Exclude Out/IR/PUP players (default true) |
curl https://api.playcallerapp.com/v1/nfl/waiver-priority \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Single-call team lineup intelligence: returns the current roster, recent injury updates, depth chart changes (NFL only), and active anomaly signals for any player on the team. Aggregates 4 data sources in one request. Counts as 4 requests toward your rate limit (`X-PC-Request-Weight: 4` response header).
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key |
| team | string | Required | Team abbreviation (e.g. KC, LAL, NYY) |
curl https://api.playcallerapp.com/v1/nfl/teams/KC/roster-pulse \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Current spread, total, and moneyline odds for upcoming games, plus PlayCaller-computed implied point totals derived from moneylines. Sourced from TheOddsAPI (DraftKings + FanDuel), refreshed every 4 hours.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key |
curl https://api.playcallerapp.com/v1/nfl/odds \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns all captured odds snapshots for a specific game, ordered chronologically. Useful for detecting line movement, sharp action, and steam moves. History depth depends on how early the game was tracked.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key |
| gameId | string | Required | Game event ID (from /v1/:sport/odds event_id field) |
curl https://api.playcallerapp.com/v1/nfl/odds/history/game_2026_wk5_kc_buf \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns a team's game schedule — past results and upcoming games. NFL uses `nfl_games`; NBA, NHL, CFB, and Soccer use the ESPN live game feed. Filter by status to get only upcoming or only completed games.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key |
| team | string | Required | Team abbreviation (e.g. KC for NFL, LAL for NBA) |
| status | string | Optional | Filter: upcoming | final | live | all (default: all) |
| season | integer | Optional | Season year (NFL only, e.g. 2026) |
| limit | integer | Optional | Max games (default 20, max 50) |
curl https://api.playcallerapp.com/v1/nfl/teams/KC/schedule \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns all active beat reporter injury signals for a given team — every player with a reported injury, sorted by severity. Useful for opponent analysis, weekly lineup decisions, and DFS game-day research.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key |
| team | string | Required | Team abbreviation (e.g. KC, LAD, LAL) |
| limit | integer | Optional | Max signals (default 20, max 50) |
curl https://api.playcallerapp.com/v1/nfl/teams/KC/injuries \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns active beat reporter signals and injury reports for a specific player. Works across NFL, MLB, NBA, NHL, and all covered sports. Signals are refreshed every 2 hours.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key |
| id | string | Required | PlayCaller player ID |
| limit | integer | Optional | Max signals to return (default 10, max 30) |
curl https://api.playcallerapp.com/v1/nfl/players/pc_nfl_4046533/news \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns a side-by-side comparison of two players — identity, active injury signals, anomaly/heat score, and last 5 games of stats. Use for start/sit decisions, trade analysis, or DFS lineup construction.
| Parameter | Type | Required | Description |
|---|---|---|---|
| player1 | string | Required | First player name (fuzzy matched). Example: "Tyreek Hill" |
| player2 | string | Required | Second player name (fuzzy matched). Example: "Stefon Diggs" |
| sport | string | Optional | Sport key to scope both lookups (recommended for accuracy). Options: nfl, mlb, nba |
curl https://api.playcallerapp.com/v1/players/compare \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns per-sport data freshness timestamps, player counts, active signal counts, and last anomaly scoring time. Use this to verify data recency before building time-sensitive features or to display "last updated" metadata to your users.
curl https://api.playcallerapp.com/v1/data/status \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Full beat reporter signal feed with sport, severity, and type filters. More flexible than `/intelligence/news` — supports date ranges up to 200 signals, all sports, and granular filtering. Signals are refreshed continuously from ESPN, Reddit, and AI-extracted injury intel.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Optional | Sport key filter |
| severity | string | Optional | Signal severity filter |
| type | string | Optional | Signal type filter (partial match) |
| since | string | Optional | Start date (YYYY-MM-DD, default 7 days ago) |
| limit | integer | Optional | Max results (default 100, max 200) |
curl https://api.playcallerapp.com/v1/intelligence/signals \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Fetch profile, stats, and optional injury/anomaly data for up to 50 players in a single API call. Reduces round-trips for clients that need to hydrate a lineup, compare a watchlist, or build a dashboard.
curl -X POST https://api.playcallerapp.com/v1/batch/players \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Fetch ML signals for up to 25 players in a single request. Returns confidence score, confidence tier, alpha metrics, and ADP for each player. Each player in the batch counts as one call against your daily limit.
curl -X POST https://api.playcallerapp.com/v1/batch/signals \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns per-week NFL confidence model predictions for a player, including resolved outcomes (actual fantasy points vs. positional median) and rolling hit rate. Useful for validating our model's accuracy on specific players and building ML training pipelines.
| Parameter | Type | Required | Description |
|---|---|---|---|
| playerId | string | Required | PlayCaller player ID (e.g. nfl_001234) |
| limit | integer | Optional | Max predictions to return (default 10, max 50) |
| season | integer | Optional | NFL season year (e.g. 2025) |
| model_type | string | Optional | Filter by model type (e.g. confidence) |
curl https://api.playcallerapp.com/v1/model/predictions/pc_nfl_4046533 \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns a paginated, time-ordered audit trail of key management events (key rotation, IP allowlist changes) and administrative actions associated with your API key. Rolling 90-day retention.
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | integer | Optional | Max events to return (default 50, max 200) |
| before | string | Optional | ISO 8601 cursor timestamp — return events before this time |
| action | string | Optional | Filter by action type (e.g. key_rotated, ip_allowlist_added) |
curl https://api.playcallerapp.com/v1/audit/events \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns tier, trial status, and creation date for the API key passed as `?key=` query parameter. Useful for building key verification flows in your own applications without exposing the full usage payload.
| Parameter | Type | Required | Description |
|---|---|---|---|
| key | string | Required | The PlayCaller API key to look up |
curl https://api.playcallerapp.com/daas/key-info \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Provisions a 14-day Sandbox API key and returns it immediately in the response body — no email verification gate, no credit card required. Use this to start calling PlayCaller MCP tools from Claude Desktop, Cursor, Windsurf, or any MCP-compatible AI agent within seconds.
curl -X POST https://api.playcallerapp.com/mcp/start-trial \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns a single player's full validated intelligence dossier: confidence score/tier, heat signal, anomaly flag, and the underlying model attribution -- assembled by the same `assembleDossier()` used by the consumer-facing Feed product. Every field is backed by a measurement (AUC-validated model or a real detected signal), never a hollow heuristic, per Doctrine #1.
| Parameter | Type | Required | Description |
|---|---|---|---|
| player | string | Required | Player full name (partial match) |
| sport | string | Optional | Sport (default nfl) |
curl https://api.playcallerapp.com/v1/feed \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Lists every ACTIVE model in `model_registry` (AUC-ROC, decile lift, training seasons, feature signals) -- the transparency layer behind every confidence score this API returns. Per Doctrine #1, no score ships without a corresponding row here.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Optional | Filter to one sport |
curl https://api.playcallerapp.com/v1/model/metadata \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Ranks players by count of active beat reporter signals in the last 7 days — a real-world attention/news-volume signal, not a model score.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Optional | Filter by sport key |
| limit | integer | Optional | Max players (default 20, max 50) |
curl https://api.playcallerapp.com/v1/players/trending \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Query players by stat thresholds (snap %, target share, fantasy points) against the most recent daily stat row per player. Whitelist-only query params.
| Parameter | Type | Required | Description |
|---|---|---|---|
| position | string | Optional | Exact position match |
| team | string | Optional | Exact team abbreviation match |
| sport | string | Optional | Exact sport_key match |
| min_snap_pct | number | Optional | |
| max_snap_pct | number | Optional | |
| min_target_share | number | Optional | |
| max_target_share | number | Optional | |
| min_fantasy_pts | number | Optional | |
| max_fantasy_pts | number | Optional | |
| limit | integer | Optional | Max results (default 50, max 200) |
curl https://api.playcallerapp.com/v1/players/filter \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Consensus rankings blending consensus ADP (NFL) or the sport's AUC-validated confidence model (NBA/MLB) with a tier grouping and a plain-language consensus label.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key |
| position | string | Optional | Filter by position |
| limit | integer | Optional | Max players (default 150, max 300) |
curl https://api.playcallerapp.com/v1/nfl/ecr \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Full play-by-play feed for a game, sourced live from ESPN's game summary endpoint (not stored/replayed -- reflects the current ESPN state at request time).
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key |
| gameId | string | Required | ESPN game/event ID |
curl https://api.playcallerapp.com/v1/nfl/games/game_2026_wk5_kc_buf/plays \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Streams every player in a sport as newline-delimited JSON (`application/x-ndjson`), one row per line, no pagination needed. Sent as a file download (`Content-Disposition: attachment`).
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key |
| include | string | Optional | Set to "metadata" to include each player's full metadata JSON blob |
curl https://api.playcallerapp.com/v1/bulk/export \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Per-player practice participation status (DNP/limited/full) from ESPN's public injury feed, refreshed twice daily.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key |
| team | string | Required | Team abbreviation |
curl https://api.playcallerapp.com/v1/nfl/teams/KC/practice \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Simple, honest ROS projection: last-8-games fantasy-points average, extrapolated across the requested number of remaining weeks. `basis` is null (and projected fields are null) when there isn't enough recent game data — no fallback guess.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key |
| id | string | Required | PlayCaller player ID |
| weeks | integer | Optional | Remaining weeks to project across (default 10, max 18) |
| scoring | string | Optional | Scoring format label (informational only — does not change the underlying average) |
curl https://api.playcallerapp.com/v1/nfl/players/pc_nfl_4046533/projection \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Batter platoon splits (OPS/OBP/SLG/AVG vs. left- and right-handed pitching). Only MLB has data today — other sports return a 400 with the current `splits_available` list.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key (currently mlb only) |
| id | string | Required | PlayCaller player ID |
| season | integer | Optional | Filter to one season year |
curl https://api.playcallerapp.com/v1/nfl/players/pc_nfl_4046533/splits \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Coming soon: real DraftKings/FanDuel slate and salary data needs a licensed feed, which is not in place yet, so this endpoint returns no slates today. Lists DraftKings/FanDuel/Yahoo DFS slates for a sport within a recent date window.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key |
| platform | string | Optional | Filter to one platform |
| days | integer | Optional | Lookback window in days (default 7, max 30) |
curl https://api.playcallerapp.com/v1/nfl/dfs/slates \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Coming soon: real DraftKings/FanDuel slate and salary data needs a licensed feed, which is not in place yet, so this endpoint returns no salaries today. Player salaries, projected points, and ownership % for a specific DFS slate.
| Parameter | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport key |
| slateId | string | Required | The slate's DB id (integer) or its platform slate_id (string) |
| position | string | Optional | Filter by position |
curl https://api.playcallerapp.com/v1/nfl/dfs/slates/{slateId}/salaries \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Coming soon: needs the DFS slate and salary data, which is not loaded yet. Generates an optimized DFS lineup for a slate using a greedy knapsack algorithm, boosted by alpha metrics (opportunity_ceiling) as a value-score adjustment.
curl -X POST https://api.playcallerapp.com/v1/lineup/optimize \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Oldest/newest season and row counts per sport in the historical stats tables. Use this to know how far back a given sport's data actually goes before querying it.
curl https://api.playcallerapp.com/v1/meta/coverage \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Returns current per-minute and daily request usage/remaining for the authenticated API key. RapidAPI-proxied keys get a synthetic per-minute-only response (daily quota is managed by the RapidAPI dashboard, not this system).
curl https://api.playcallerapp.com/daas/rate-limit-status \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Re-sends a previously-delivered webhook payload to the registered URL, with a fresh HMAC signature and an `X-PlayCaller-Replay: true` header, and logs the attempt as a new delivery row.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Required | Webhook ID |
| deliveryId | string | Required | Delivery ID to replay |
curl -X POST https://api.playcallerapp.com/daas/webhooks/pc_nfl_4046533/deliveries/{deliveryId}/replay \ -H "X-PlayCaller-Key: pc_sbx_your_key"
Rate Limits & Response Headers
Rate limits are enforced per API key, measured daily and per-minute. Daily limits reset at midnight UTC.
Every authenticated response includes standard rate-limit headers so you can track your position without polling /daas/usage:
| Header | Example | Description |
|---|---|---|
| X-PlayCaller-Tier | sandbox | Your current tier name |
| X-RateLimit-Limit | 200 | Your daily request ceiling (unlimited for Syndicate Alpha) |
| X-RateLimit-Remaining | 194 | Requests remaining today |
| X-RateLimit-Reset | 1751846400 | Unix epoch timestamp when the daily counter resets (midnight UTC) |
| X-RateLimit-Policy | 200/day;w=86400, 2/min;w=60 | Full policy: daily cap and per-minute cap |
| X-PlayCaller-Sandbox-Expires | 2026-07-21T00:00:00.000Z | ISO timestamp when sandbox expires. Sandbox keys only. |
| X-PlayCaller-Sandbox-Days-Remaining | 9 | Integer days remaining in sandbox. Sandbox keys only. |
# Check your rate-limit position from any response headers curl -sI -H "X-PlayCaller-Key: pc_sbx_your_key" \ https://api.playcallerapp.com/v1/sports \ | grep -i x-ratelimit X-RateLimit-Limit: 200 X-RateLimit-Remaining: 194 X-RateLimit-Reset: 1751846400 X-RateLimit-Policy: 200/day;w=86400, 2/min;w=60
| Plan | Daily Calls | Rate Limit |
|---|---|---|
| Developer Sandbox ($0, 14 days, no card) | 200 req/day | 2 req/min |
| Build ($99/mo) | 2,000 req/day (60,000/mo) | 2 req/min |
| Pro Insights ($499/mo) | 20,000 req/day (600,000/mo) | 5 req/min |
| Syndicate Alpha ($1,499/mo) | No daily ceiling | Custom |
Pro+ is a forthcoming add-on tier: priority access to new validated confidence models as they ship. See the waitlist page for details. Pricing and rate limits aren't finalized yet.
Exceeding your per-minute limit returns HTTP 429. The Retry-After header tells you exactly when to retry:
{ "error_code": "RATE_LIMIT_EXCEEDED", "message": "Rate limit of 30 req/min exceeded. Retry in 42s or upgrade your plan.", "calls_this_minute": 31, "limit_per_minute": 30, "retry_after_seconds": 42, "upgrade_url": "https://playcallerapp.com/?upgrade=1" }
Once your monthly call quota is used up, all requests return HTTP 429 until your billing cycle resets:
{ "error_code": "MONTHLY_QUOTA_EXCEEDED", "message": "Monthly call quota of 1000 exceeded. Resets on 2026-04-01.", "calls_used": 1000, "calls_limit": 1000, "resets_on": "2026-04-01T00:00:00Z", "upgrade_url": "https://playcallerapp.com/?upgrade=1" }
Error Codes
All errors return a standardized JSON object with error_code, message, and documentation_url.
| HTTP Status | Code | Meaning |
|---|---|---|
| 400 | INVALID_PARAMETER | A query parameter value is malformed or out of range. |
| 401 | MISSING_API_KEY | X-PlayCaller-Key header is absent. |
| 401 | INVALID_API_KEY | Key not found, revoked, or not yet verified. |
| 402 | TRIAL_EXPIRED | 14-day Developer Sandbox has ended. Upgrade to a paid plan to continue. |
| 403 | TIER_INSUFFICIENT | Endpoint requires a higher plan tier. Response includes required_tier and upgrade_url. |
| 429 | RATE_LIMIT_EXCEEDED | Per-minute request limit exceeded. Retry after retry_after_seconds. |
| 429 | MONTHLY_QUOTA_EXCEEDED | Monthly call quota exhausted. Resets on billing cycle date. |
| 429 | DAILY_LIMIT_EXCEEDED | Daily request cap hit (distinct from monthly quota). Resets at midnight UTC. Response includes retry_after_seconds. |
| 403 | SANDBOX_EXPIRED | 14-day sandbox window has closed. Upgrade to a paid plan or re-register for a new sandbox at /daas/sandbox/start. |
| 403 | IP_BLOCKED | Request IP is not in the allowlist configured for this key (Syndicate Alpha). Contact your account manager to update the allowlist. |
| 500 | INTERNAL_ERROR | Server error. Retry with exponential backoff. |
{ "error_code": "TRIAL_EXPIRED", "message": "Your 14-day Developer Sandbox has expired. Upgrade to a paid plan to continue.", "trial_ended_at": "2026-04-11T00:00:00Z", "upgrade_url": "https://playcallerapp.com/?upgrade=1" }
{ "error_code": "TIER_INSUFFICIENT", "message": "This endpoint requires pro_insights tier or higher. Your current tier: build.", "current_tier": "build", "required_tier": "pro_insights", "upgrade_url": "https://playcallerapp.com/?upgrade=1" }
GET /v1/feed Pro Insights
Pre-composed player intelligence dossier. Returns a complete intelligence object for a player in a single API call: calibrated confidence score, validated heat signal, full signal breakdown, and a plain-English synthesis sentence. Rate-capped on Pro Insights; uncapped on Syndicate Alpha. Requires Pro Insights tier.
| Parameter | Type | Required | Description |
|---|---|---|---|
| player | string | Required | Player name or playcaller_id |
| team | string | Optional | 3-letter team code to disambiguate common names |
| Field | Type | Description |
|---|---|---|
| player_name | string | Canonical player name |
| team | string | Current team abbreviation |
| position | string | Position code |
| confidence_score | integer|null | Calibrated probability score (0-75 display range) from a logistic regression model trained on 20,585 observations across 5 NFL seasons. AUC-ROC 0.697, 4.61x decile lift. Display capped at 75 pending tail calibration validation. |
| heat_signal | string|null | Validated directional heat: Cold, Warming, Hot, or Surging. AUC-ROC 0.623, quartile lift 25.6pp, 3-fold walk-forward validated. |
| synthesis | string|null | Plain-English summary generated from signal data, validated against source before delivery |
| signals | array | Individual signals that drove the score, with source and weight |
| _audit | object | Model provenance block: model_version, observations_used, generated_at, signals_validated. Present on all /v1/feed responses. |
MCP Server
PlayCaller implements Anthropic's Model Context Protocol over HTTP. Connect Cursor, Claude Desktop, Perplexity, or any MCP-compatible AI to live sports intelligence with a single endpoint.
| Tool | Description |
|---|---|
| get_injury_signals | Active beat reporter signals, filterable by sport and severity |
| get_player_identity | Resolve a player across ESPN, Sleeper, and Yahoo. 31,000+ player identities normalized |
| get_anomaly_scores | Players deviating from 3-season usage baseline, score 0-100 |
| get_player_projections | Trailing 10-game fantasy point average with injury signal overlay. Not a predictive model, a plain average. |
| get_prediction_markets | Active Kalshi prop markets. confidence_score field pending Kalshi data consent. |
| get_player_stats | Per-game stat history for NFL/MLB/NBA/NHL players by name. NFL 2024 wks 1–18, NBA 5 seasons (127k rows). |
| get_team_roster | Active roster for any NFL, MLB, NBA, or NHL team by abbreviation. Optional position filter. |
Add to .cursor/mcp.json or Claude Desktop config:
{ "mcpServers": { "playcaller": { "url": "https://api.playcallerapp.com/mcp", "headers": { "X-PlayCaller-Key": "YOUR_KEY" } } } }
Full tool schemas at GET /mcp (unauthenticated discovery). Auth: X-PlayCaller-Key header on POST.
GET /v1/trending
Returns the top hashtag trends across sports, scraped every 2 hours. Useful for surfacing breakout player moments and news spikes. Available on all tiers. Max 50 results.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | string | Optional | Filter by sport: nfl, mlb, nba |
| limit | integer | Optional | Max results (default 20, max 50) |
curl "https://api.playcallerapp.com/v1/trending?sport=mlb&limit=10" \ -H "X-PlayCaller-Key: pc_sbx_your_key"
tag, sport, category, relevance_score, scraped_at, expires_atGET /v1/articles/waiver
Returns AI-generated waiver wire analysis articles backed by validated signal data. Requires Pro Insights tier.
The sport parameter is required.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport: nfl, mlb, nba |
| week | integer | Optional | Week number (NFL). Defaults to current week. |
curl "https://api.playcallerapp.com/v1/articles/waiver?sport=nfl" \ -H "X-PlayCaller-Key: pc_pri_your_key"
title, content (full article), sport, week, published_at, signals_usedGET /v1/nba/confidence
Returns detailed NBA player confidence scores from the validated NBA Confidence V3 model (AUC 0.847 on the latest walk-forward fold). Includes raw score, percentile rank, component breakdown, and a model audit block. Requires Pro Insights tier.
| Param | Type | Required | Description |
|---|---|---|---|
| player | string | Optional | Filter by player name (partial match) |
| team | string | Optional | Filter by team abbreviation |
| limit | integer | Optional | Max results (default 20) |
curl "https://api.playcallerapp.com/v1/nba/confidence?limit=5" \ -H "X-PlayCaller-Key: pc_pri_your_key"
player_name, team, confidence_score, percentile, component_breakdown, model_auditGET /v1/meta/coverage
Returns the current historical data depth per sport: oldest/newest season and row counts, computed live from the database. Free on all tiers, including Sandbox. Use this instead of a hardcoded year range in your integration: backfills land per-sport independently, so the actual coverage window changes over time.
curl https://api.playcallerapp.com/v1/meta/coverage \ -H "X-PlayCaller-Key: pc_sbx_your_key"
coverage (per-sport oldest_season, newest_season, historical_rows), note
Note: this endpoint reports coverage from the historical_performance table only. Endpoints backed by a
different table (e.g. MLB's branch of games/history, which uses a separate daily box-score log) aren't
reflected here, so check that endpoint's own docs for how to verify its range.
GET /v1/:sport/games/history
Returns historical per-game performance data for players. Supports nfl, nba, and mlb.
NFL returns snap_pct, target_share, air_yards. NBA returns usage_rate, is_starter, is_back_to_back.
MLB returns full batting and pitching lines. Requires Pro Insights tier.
Data depth: NFL and NBA cover the 2021–2025 seasons (sourced from historical_performance;
see live per-sport counts at GET /v1/meta/coverage, free on all tiers). MLB game history is
sourced from a separate live daily box-score log rather than historical_performance, so its year range
isn't reflected by /v1/meta/coverage. Pass a season value to test availability for a given year.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Path segment: nfl, nba, or mlb |
| Param | Type | Required | Description |
|---|---|---|---|
| player | string | Optional | Filter by player name (partial match) |
| team | string | Optional | Filter by team abbreviation |
| season | integer | Optional | Season year (e.g. 2025) |
| limit | integer | Optional | Max results (default 50) |
curl "https://api.playcallerapp.com/v1/nfl/games/history?team=KC&season=2025" \ -H "X-PlayCaller-Key: pc_pri_your_key"
player_name, team, game_date, and sport-specific stat columnsGET /v1/:sport/players/:id/alpha
Returns pre-computed alpha metrics for a player: consistency score, momentum delta, and opportunity ceiling. Computed weekly from the last 8 games of historical performance data. Requires Pro Insights tier.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | nfl, mlb, or nba |
| id | string | Required | PlayCaller player ID (e.g. pc_nfl_4046533) |
| Field | Type | Description |
|---|---|---|
| consistency_score | number | 0–100. Higher = more consistent floor. Based on stddev of snap_pct/minutes over last 8 games. |
| momentum_delta | number | Signed float. Avg fantasy points last 3 games minus avg games 4–6 back. Positive = trending up. |
| opportunity_ceiling | number | 90th-percentile target share or usage rate from last 8 games: what the player can do in an optimal game. |
| sample_size | integer | Games used to compute metrics. |
| week_computed | string | ISO week the batch was last run. |
curl "https://api.playcallerapp.com/v1/nfl/players/pc_nfl_4046533/alpha" \ -H "X-PlayCaller-Key: pc_pri_your_key"
player_id, sport, consistency_score, momentum_delta, opportunity_ceiling, sample_size, week_computedGET /v1/players/similar/:id
Returns players with the most similar production profile using pgvector cosine similarity. Each player is represented as an 8-dimensional stat vector (avg fantasy points, usage, opportunity, rushing yards, receiving yards, consistency, momentum, ceiling), no LLM, purely computed from historical performance. Requires Pro Insights tier.
| Param | Type | Required | Description |
|---|---|---|---|
| id | string | Required | PlayCaller player ID to find matches for |
| Param | Type | Required | Description |
|---|---|---|---|
| sport | string | Required | Sport: nfl, mlb, or nba |
| limit | integer | Optional | Number of similar players to return (default 10, max 25) |
curl "https://api.playcallerapp.com/v1/players/similar/pc_nfl_4046533?sport=nfl&limit=5" \ -H "X-PlayCaller-Key: pc_pri_your_key"
{ playcaller_id, name, position, team, similarity_score } ordered by cosine similarityGET /v1/events/stream
Opens a persistent Server-Sent Events connection that pushes real-time sports events as they happen. Heartbeat every 30 seconds keeps the connection alive. Requires Pro Insights tier.
| Event | Trigger | Payload |
|---|---|---|
| player.injured | Every 4h injury refresh | { player, team, severity, signal_type, sport } |
| game.score_updated | Live game pipeline | { game_id, home_team, away_team, home_score, away_score, status } |
| anomaly.detected | Weekly anomaly refresh | { player, team, anomaly_score, recommendation } |
curl -N "https://api.playcallerapp.com/v1/events/stream" \ -H "X-PlayCaller-Key: pc_pri_your_key"
const source = new EventSource( "https://api.playcallerapp.com/v1/events/stream", { headers: { "X-PlayCaller-Key": "pc_pri_your_key" } } ); source.addEventListener("player.injured", e => console.log(JSON.parse(e.data))); source.addEventListener("game.score_updated", e => console.log(JSON.parse(e.data)));
Webhooks (Syndicate Alpha)
Register HTTPS endpoints to receive push delivery of sports events as they happen. Every delivery is signed with HMAC-SHA256 so you can verify it came from PlayCaller. Auto-retry on failure (0s → 30s → 5min). Requires Syndicate Alpha tier.
| Method | Path | Description |
|---|---|---|
| POST | /daas/webhooks | Register a new webhook. Body: { url, events[] } |
| GET | /daas/webhooks | List active webhooks for this API key |
| DELETE | /daas/webhooks/:id | Deactivate a webhook |
| GET | /daas/webhooks/:id/deliveries | Delivery log with status codes and retry history |
Every POST includes X-PlayCaller-Signature: sha256=<hex> and X-PlayCaller-Delivery-Id headers. Verify before processing:
const crypto = require('crypto'); function verifySignature(secret, rawBody, sigHeader) { const expected = 'sha256=' + crypto .createHmac('sha256', secret) .update(rawBody) .digest('hex'); return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sigHeader)); }
curl -X POST "https://api.playcallerapp.com/daas/webhooks" \ -H "X-PlayCaller-Key: pc_syn_your_key" \ -H "Content-Type: application/json" \ -d '{"url":"https://your-server.com/hooks","events":["player.injured","game.score_updated"]}'
{ id, url, events, secret }. Store secret, it is only returned once.Pass any subset of these event types in the events[] array when registering:
| Event | When it fires |
|---|---|
| player.injured | A player's injury status changes (new injury, designation update, or return to active) |
| game.score_updated | Live score change during an active game |
| game.status_changed | Game status changes (scheduled → in_progress → final / postponed) |
| anomaly.detected | A player crosses the anomaly detection threshold (heat model or pitcher form signal) |
All events share the same outer envelope. Only data differs by event type:
{
"event": "player.injured",
"delivery_id": "del_a1b2c3d4",
"timestamp": "2026-07-17T14:23:01Z",
"data": {
"player_id": "nfl_patrick-mahomes",
"name": "Patrick Mahomes",
"sport": "nfl",
"injury_status": "Questionable",
"injury_type": "Knee",
"previous_status": "Probable"
}
}
Roadmap
New capabilities ship with the Pro+ tier as they clear validation. Join the waitlist to lock in early pricing.