PLAYCALLERAPI

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.

Base URL: https://api.playcallerapp.com
Most 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.

1
Start your free trial
Go to playcallerapp.com/developer and enter your email to start a 14-day free trial. No credit card required. Disposable email addresses are blocked.
2
Verify your email
Check your inbox for a verification email from [email protected]. Click the link to activate your key. The link expires in 24 hours.
3
Copy your API key from the dashboard
After verifying, you'll be redirected to your developer dashboard at /developer/dashboard where your key is displayed. Sandbox keys are prefixed pc_sbx_. Build keys use pc_bld_, Pro Insights keys use pc_pri_.
4
Store your key securely
Store your API key as an environment variable. Never commit it to source code. Use PC_API_KEY=pc_sbx_your_key in your .env file.
5
Make your first call
Fire a test request to confirm authentication. A 200 response means you're live.
bash
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.

TypeScript / Node.js
bash
npm install @playcaller/sdk
typescript
// 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" });
Python
bash
pip install playcaller-sdk
python
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")
MCP Server (AI agents)

The PlayCaller MCP server lets Cursor, Claude Desktop, and other AI tools call sports data endpoints directly as tools, no SDK required.

json
// 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.

Header format
http
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).

Successful authentication

A valid key returns HTTP 200 with your requested data:

json
{
  "status": "success",
  "data": { /* ... response payload ... */ }
}
Failed authentication: 401

A missing or invalid key returns HTTP 401:

json
{
  "status": "error",
  "code": "INVALID_API_KEY",
  "message": "API key is missing or invalid. Include it in the X-PlayCaller-Key header."
}
Security: Never expose your API key in client-side code or public repositories. Rotate compromised keys immediately from Settings → API Keys → Revoke.

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.

Parameters
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.
Example: cURL
bash
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"
Example: Python
python
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"])
200: Successful Response
json
{
  "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
  }
}
Response Fields
FieldTypeDescription
idintegerSignal record ID
player_namestringFull player name
teamstring3-letter team code
sportstringSport key: nfl, mlb, or nba
signal_typestringType of signal (e.g., injury_update, depth_chart, role_change)
severitystringhigh, medium, or low
titlestringShort signal headline
summarystringFull signal text
confidence_scoreinteger|nullCalibrated 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.
sourcestringSource name (e.g., beat reporter, injury report)
source_urlstring|nullOriginal source URL, if available
published_atstringISO 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.

Example: cURL
bash
curl "https://api.playcallerapp.com/intelligence/injuries?sport=nfl&severity=high&team=CIN&limit=5" \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
Query Parameters
ParameterTypeRequiredDescription
sportstringOptionalFilter by sport: nfl, mlb, nba. Omit for all sports.
severitystringOptionalFilter: high, medium, low
teamstringOptional3-letter team code (e.g., CIN, NYY, LAL)
playerstringOptionalPlayer name substring match
limitintegerOptionalMax results (default 50, max 200)
Response Fields
FieldTypeDescription
player_namestringFull player name
teamstring3-letter team abbreviation
sportstringSport key: nfl, mlb, or nba
signal_typestringinjury_update, return_from_injury, injury_return, or injury_risk
severitystringhigh, medium, or low
titlestringShort headline
summarystringFull signal text
published_atstringISO 8601 timestamp when signal was scraped

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.

GET /v1/mlb/players

List active MLB players. Filterable by position, team, status, or name search.

ParameterTypeRequiredDescription
positionstringOptionalFilter by position: SP, RP, C, 1B, 2B, 3B, SS, OF, DH
teamstringOptional3-letter team abbreviation (e.g., NYY, LAD)
statusstringOptionalactive, injured, inactive
searchstringOptionalPartial name search (case-insensitive)
limitintegerOptionalResults per page. Default: 50. Max: 200.
offsetintegerOptionalPagination offset. Default: 0.
bash
curl -H "X-PlayCaller-Key: pc_sbx_your_key" \
  "https://api.playcallerapp.com/v1/mlb/players?team=NYY&position=SP&limit=5"
json
{
  "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
  }
}
GET /v1/mlb/players/:id

Individual player detail by PlayCaller ID (format: pc_mlb_XXXXXX).

bash
curl -H "X-PlayCaller-Key: pc_sbx_your_key" \
  "https://api.playcallerapp.com/v1/mlb/players/pc_mlb_660670"
GET /v1/mlb/players/:id/stats

Game-by-game stat lines for a player. Includes batting and pitching stats plus fantasy points. Updated daily after games finalize.

ParameterTypeRequiredDescription
datestringOptionalFilter to a specific game date: YYYY-MM-DD
limitintegerOptionalNumber of game lines. Default: 30. Max: 200.
bash
curl -H "X-PlayCaller-Key: pc_sbx_your_key" \
  "https://api.playcallerapp.com/v1/mlb/players/pc_mlb_660670/stats?limit=5"
json
{
  "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.

GET /v1/mlb/teams

Returns all 30 MLB teams with abbreviation, full name, roster size, and position breakdown.

bash
curl -H "X-PlayCaller-Key: pc_sbx_your_key" \
  "https://api.playcallerapp.com/v1/mlb/teams"
json
{
  "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"]
    }
  ]
}
GET /v1/mlb/teams/:team/roster

Full roster for a specific team. Use 3-letter abbreviation (e.g., NYY, LAD, BOS). Optionally filter by ?position=SP.

bash
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.

GET /v1/mlb/games
ParameterTypeRequiredDescription
datestringOptionalFilter by game date: YYYY-MM-DD. Default: all available.
statestringOptionalFilter by game state: pre_game, scheduled, in_progress, final, completed, postponed
limitintegerOptionalMax results. Default: 30. Max: 100.
bash
curl -H "X-PlayCaller-Key: pc_sbx_your_key" \
  "https://api.playcallerapp.com/v1/mlb/games?date=2026-03-21"
json
{
  "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.

GET /v1/mlb/scoring/leaders

Top fantasy scorers for a given date (default: latest available date). Filterable by position, team, or date.

ParameterTypeRequiredDescription
datestringOptionalGame date: YYYY-MM-DD. Default: most recent.
positionstringOptionalFilter by position: SP, OF, SS, etc.
teamstringOptional3-letter team abbreviation.
limitintegerOptionalDefault: 25. Max: 100.
bash
curl -H "X-PlayCaller-Key: pc_pri_your_key" \
  "https://api.playcallerapp.com/v1/mlb/scoring/leaders?date=2026-03-20&limit=10"
json
{
  "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
    }
  ]
}
GET /v1/mlb/scoring/categories

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.

ParameterTypeRequiredDescription
datestringOptionalGame date: YYYY-MM-DD. Default: most recent date with data.
bash
curl -H "X-PlayCaller-Key: pc_pri_your_key" \
  "https://api.playcallerapp.com/v1/mlb/scoring/categories?date=2026-03-20"
200: Successful Response
json
{
  "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.

Pro Insights tier required. Calling this endpoint with a Sandbox or Build key returns HTTP 403 with 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.

Example: cURL
bash
curl https://api.playcallerapp.com/v1/mlb/standings \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/mlb/transactions

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.

ParameterTypeRequiredDescription
startDatestringOptionalStart date (YYYY-MM-DD, default 7 days ago)
endDatestringOptionalEnd date (YYYY-MM-DD, default today)
typestringOptionalFilter by type_code (e.g. IL, DFA, TRADE, RECALL)
bash
curl https://api.playcallerapp.com/v1/mlb/transactions \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/mlb/players/:id/splits

Pitch-type usage and results (whiff%, hard-hit%, wOBA, xwOBA) per pitch type per season, for pitchers and batters.

ParameterTypeRequiredDescription
idstringRequiredPlayCaller MLB player ID
seasonintegerOptionalFilter to one season year
player_typestringOptionalFilter to pitcher or batter rows
bash
curl https://api.playcallerapp.com/v1/mlb/players/pc_mlb_ohtani_01/splits \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/mlb/depth-chart/changes Growth+

Same shape and source as /v1/nba/depth-chart/changes, scoped to MLB.

ParameterTypeRequiredDescription
sincestringOptionalStart date (YYYY-MM-DD, default 14 days ago)
teamstringOptionalTeam abbreviation filter
playerstringOptionalPlayer name filter (partial match)
limitintegerOptionalMax results (default 50, max 100)
bash
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.

GET /v1/nba/players

Returns NBA players. Filterable by name search, position, team, with pagination support.

ParameterTypeRequiredDescription
searchstringOptionalPartial name match (case-insensitive)
positionstringOptionalFilter by position: PG, SG, SF, PF, C
teamstringOptionalTeam abbreviation (e.g., LAL, BOS)
limitintegerOptionalResults per page. Default: 50. Max: 200.
offsetintegerOptionalPagination offset. Default: 0.
bash
curl "https://api.playcallerapp.com/v1/nba/players?team=BOS&position=PG" \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nba/players/:id

Returns full profile for a single NBA player by playcaller_id. Includes position, team, and status from the player identity registry.

bash
curl https://api.playcallerapp.com/v1/nba/players/pc_nba_lebron_01 \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nba/players/:id/stats

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.

ParameterTypeRequiredDescription
seasonintegerOptionalSeason year (e.g., 2024). Omit for all available.
limitintegerOptionalResults to return. Default: 30.
bash
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"
Box Score Fields
FieldTypeDescription
game_datestringISO date of game
seasonintegerSeason year
points / rebounds / assistsnumber|nullCore box score stats
steals / blocks / turnoversnumber|nullDefensive and turnover stats
minutes_playednumber|nullMinutes played
usage_ratenumber|nullUsage rate percentage
is_starterboolean|nullWhether the player started
is_back_to_backbooleanWhether this game was a back-to-back
fantasy_pointsnumber|nullComputed DK-style fantasy points
GET /v1/nba/teams

Returns all NBA teams. Filter by conference. Each team includes player_count and a roster_url link.

bash
curl https://api.playcallerapp.com/v1/nba/teams?conference=east \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nba/teams/:team/roster

Returns active roster for an NBA team by abbreviation (e.g., BOS, LAL, GSW).

bash
curl https://api.playcallerapp.com/v1/nba/teams/BOS/roster \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nba/games

Returns NBA game scores and states. Filter by date. Cache-Control: 30s during live games, 120s otherwise.

bash
curl https://api.playcallerapp.com/v1/nba/games?date=today \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nba/standings

Returns current NBA standings by conference and division.

bash
curl https://api.playcallerapp.com/v1/nba/standings \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nba/players/:id/game-log

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.

ParameterTypeRequiredDescription
idstringRequiredPlayCaller NBA player ID (format: nba_XXXXX)
seasonstringOptionalSeason (default: 2024-25)
bash
curl https://api.playcallerapp.com/v1/nba/players/pc_nba_lebron_01/game-log \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nba/depth-chart/changes Growth+

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).

ParameterTypeRequiredDescription
sincestringOptionalStart date (YYYY-MM-DD, default 14 days ago)
teamstringOptionalTeam abbreviation filter
playerstringOptionalPlayer name filter (partial match)
limitintegerOptionalMax results (default 50, max 100)
bash
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.

GET /v1/nfl/players

Returns NFL players from the player identity registry. Supports search, position, and team filters with pagination.

ParameterTypeRequiredDescription
searchstringOptionalPartial name match (case-insensitive)
positionstringOptionalFilter by position: QB, RB, WR, TE, K, DEF
teamstringOptionalTeam abbreviation (e.g., KC, SF, DAL)
limitintegerOptionalResults per page. Default: 50. Max: 200.
offsetintegerOptionalPagination offset. Default: 0.
bash
curl "https://api.playcallerapp.com/v1/nfl/players?team=KC&position=QB" \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nfl/players/:id

Returns full profile for a single NFL player by playcaller_id. Enriched with team name, conference, and division from the 32-team static roster.

bash
curl https://api.playcallerapp.com/v1/nfl/players/pc_nfl_mahomes_01 \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
200: Player Profile
json
{
  "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"
  }
}
GET /v1/nfl/players/:id/stats

Returns per-game statistical history for an NFL player. Data sourced from historical_performance; 2024 season weeks 1–18 are available.

ParameterTypeRequiredDescription
seasonintegerOptionalSeason year (e.g., 2024). Omit for all available.
weekintegerOptionalNFL week number (1–18 regular season).
limitintegerOptionalResults to return. Default: 20.
bash
curl "https://api.playcallerapp.com/v1/nfl/players/pc_nfl_mahomes_01/stats?season=2024" \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
Game Log Fields
FieldTypeDescription
seasonintegerNFL season year
weekintegerWeek number
passing_yards / passing_tdsnumber|nullPassing stats (QB path)
rushing_yards / rushing_tdsnumber|nullRushing stats
receiving_yards / receiving_tds / receptionsnumber|nullReceiving stats
snap_pctnumber|nullSnap share (0–100)
target_sharenumber|nullTarget share for skill players
air_yardsnumber|nullTotal air yards on targets
fantasy_pointsnumber|nullComputed fantasy points (PPR scoring)
GET /v1/nfl/teams

Returns all 32 NFL teams with conference, division, and active player count. Filter by conference or division.

ParameterTypeRequiredDescription
conferencestringOptionalAFC or NFC
divisionstringOptionale.g., AFC West, NFC North
bash
curl "https://api.playcallerapp.com/v1/nfl/teams?conference=AFC" \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nfl/teams/:team/roster

Returns active roster for a team by 2-3 letter abbreviation (e.g., KC, SF, DAL). Optional ?position= filter.

bash
curl "https://api.playcallerapp.com/v1/nfl/teams/KC/roster?position=WR" \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nfl/games

Returns NFL game schedule and scores from the nfl_games table (285 games, 2026 season schedule).

ParameterTypeRequiredDescription
seasonintegerOptionalSeason year (e.g., 2026)
weekintegerOptionalNFL week number
statusstringOptionalGame status filter (e.g., final, scheduled)
limitintegerOptionalResults to return. Default: 16.
bash
curl "https://api.playcallerapp.com/v1/nfl/games?season=2026&week=1" \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nfl/standings

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).

bash
curl "https://api.playcallerapp.com/v1/nfl/standings?season=2026" \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nfl/stacks Growth+

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.

ParameterTypeRequiredDescription
teamstringOptionalFilter to one team
positionstringOptionalComma-separated receiver positions (default WR,TE)
min_gamesintegerOptionalMinimum games together (default 5)
seasonintegerOptionalMinimum season year (default 2023)
limitintegerOptionalMax pairs (default 25, max 50)
bash
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.

GET /v1/cfb/games

Returns CFB game scores and states. Filter by date.

bash
curl https://api.playcallerapp.com/v1/cfb/games?date=2026-04-10 \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/cfb/standings

Returns current CFB conference standings.

bash
curl https://api.playcallerapp.com/v1/cfb/standings \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/cfb/rankings Growth+

Returns AP Top 25 and CFP rankings. Requires Growth tier or higher.

bash
curl https://api.playcallerapp.com/v1/cfb/rankings \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/cfb/players

FBS players across all 134 teams. Supports ?search=, ?team=, ?position= filters and pagination.

ParameterTypeRequiredDescription
searchstringOptionalPartial name search
teamstringOptionalTeam abbreviation filter
positionstringOptionalPosition filter (QB, RB, WR, TE, etc.)
limitintegerOptionalResults per page (default 50, max 200)
offsetintegerOptionalPagination offset
bash
curl https://api.playcallerapp.com/v1/cfb/players \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/cfb/players/:id

Individual College Football player by PlayCaller ID. Returns full profile including school/team, position, and status.

ParameterTypeRequiredDescription
idstringRequiredPlayCaller player ID (pc_cfb_XXXXXXX)
bash
curl https://api.playcallerapp.com/v1/cfb/players/pc_cfb_4362238 \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/cfb/players/:id/game-log

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.

ParameterTypeRequiredDescription
idstringRequiredPlayCaller CFB player ID (format: pc_cfb_XXXXX)
seasonintegerOptionalFilter to a single season (defaults to all seasons on file)
bash
curl https://api.playcallerapp.com/v1/cfb/players/pc_cfb_4362238/game-log \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/cfb/teams

All FBS college football teams with active player counts and roster links. Source: seeded from ESPN public roster data.

bash
curl https://api.playcallerapp.com/v1/cfb/teams \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/cfb/teams/:team/roster

Active FBS roster by team abbreviation. Includes position, jersey number, and eligibility year.

ParameterTypeRequiredDescription
teamstringRequiredTeam abbreviation (e.g. ALA)
positionstringOptionalFilter by position (QB, RB, WR, etc.)
bash
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.

GET /v1/nhl/games

Returns NHL game scores and states. Optional ?date=today, ?state=in_progress, ?limit=.

bash
curl https://api.playcallerapp.com/v1/nhl/games?date=today \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nhl/standings

Returns NHL standings grouped by division. Optional ?season= and ?division=.

bash
curl https://api.playcallerapp.com/v1/nhl/standings \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nhl/players

1,047 NHL players across all 32 teams. Supports ?search=, ?team=, ?position= filters and pagination.

ParameterTypeRequiredDescription
searchstringOptionalPartial name search (case-insensitive)
teamstringOptionalTeam abbreviation filter
positionstringOptionalPosition filter (C, LW, RW, D, G)
limitintegerOptionalResults per page (default 50, max 200)
offsetintegerOptionalPagination offset
bash
curl https://api.playcallerapp.com/v1/nhl/players \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nhl/players/:id

Individual NHL player by PlayCaller ID (pc_nhl_XXXXXX). Returns full profile including age, jersey number, and position.

ParameterTypeRequiredDescription
idstringRequiredPlayCaller player ID
bash
curl https://api.playcallerapp.com/v1/nhl/players/pc_nhl_8478402 \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nhl/players/:id/stats

Per-game stat history for an NHL player — points, goals, assists, and fantasy points. Returns most recent season by default.

ParameterTypeRequiredDescription
idstringRequiredPlayCaller player ID (pc_nhl_XXXXXXX)
seasonintegerOptionalSeason year (e.g. 2025)
limitintegerOptionalMax games (default 30, max 200)
bash
curl https://api.playcallerapp.com/v1/nhl/players/pc_nhl_8478402/stats \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nhl/teams

Full list of NHL teams with division/conference, active player counts, and roster links. 1,047 players seeded.

ParameterTypeRequiredDescription
conferencestringOptionalFilter by conference (Eastern, Western)
divisionstringOptionalFilter by division (Atlantic, Metropolitan, Central, Pacific)
bash
curl https://api.playcallerapp.com/v1/nhl/teams \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nhl/teams/:team/roster

Active roster for an NHL team by team abbreviation (e.g. BOS, NYR, TOR). Supports position filter.

ParameterTypeRequiredDescription
teamstringRequiredTeam abbreviation (e.g. BOS)
positionstringOptionalFilter by position (C, LW, RW, D, G)
bash
curl https://api.playcallerapp.com/v1/nhl/teams/BOS/roster \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nhl/depth-chart/changes Growth+

Same shape and source as /v1/nba/depth-chart/changes, scoped to NHL.

ParameterTypeRequiredDescription
sincestringOptionalStart date (YYYY-MM-DD, default 14 days ago)
teamstringOptionalTeam abbreviation filter
playerstringOptionalPlayer name filter (partial match)
limitintegerOptionalMax results (default 50, max 100)
bash
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.

GET /v1/soccer/games

Returns match scores and states. Filter by ?league=epl|mls|la_liga|bundesliga|serie_a|champions_league, ?date=today.

bash
curl https://api.playcallerapp.com/v1/soccer/games?league=la_liga&date=today \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/soccer/standings

Returns current league table. Filter by ?league=epl|mls|la_liga|bundesliga|serie_a|champions_league.

bash
curl https://api.playcallerapp.com/v1/soccer/standings?league=bundesliga \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/soccer/players

2,500+ players across EPL, MLS, La Liga, Bundesliga, and Serie A. Supports ?search=, ?team=, ?league=, ?position= filters.

ParameterTypeRequiredDescription
searchstringOptionalPartial name search
teamstringOptionalTeam abbreviation (e.g. ARS)
leaguestringOptionalLeague key filter: eng.1, usa.1, esp.1, ger.1, ita.1
positionstringOptionalPosition filter: GK, D, M, F
limitintegerOptionalResults per page (default 50, max 200)
offsetintegerOptionalPagination offset
bash
curl https://api.playcallerapp.com/v1/soccer/players \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/soccer/players/:id

Individual soccer player by PlayCaller ID. Returns full profile including league, club, position, and status.

ParameterTypeRequiredDescription
idstringRequiredPlayCaller player ID (pc_soccer_XXXXXX)
bash
curl https://api.playcallerapp.com/v1/soccer/players/pc_soccer_101234 \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/soccer/players/:id/game-log

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.

ParameterTypeRequiredDescription
idstringRequiredPlayCaller soccer player ID (format: pc_soccer_XXXXX)
bash
curl https://api.playcallerapp.com/v1/soccer/players/pc_soccer_101234/game-log \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/soccer/teams

All teams across covered leagues with player counts. Filter by ?league= (eng.1, usa.1, esp.1, ger.1, ita.1).

ParameterTypeRequiredDescription
leaguestringOptionalFilter by league key (eng.1, usa.1, esp.1, ger.1, ita.1)
bash
curl https://api.playcallerapp.com/v1/soccer/teams \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/soccer/teams/:team/roster

Active roster for a soccer club. Includes position, nationality, and jersey number.

ParameterTypeRequiredDescription
teamstringRequiredTeam abbreviation (e.g. ARS)
positionstringOptionalFilter by position: GK, D, M, F
bash
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.

GET /v1/tennis/matches

Returns live and completed matches. Filter by ?tour=atp|wta, ?date=today, ?state=in_progress|final.

bash
curl https://api.playcallerapp.com/v1/tennis/matches?tour=atp&date=today \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/tennis/players/h2h

Computes a head-to-head match record between two players from stored ESPN match results. Player names are case-insensitive partial matches.

ParameterTypeRequiredDescription
player1stringRequiredFirst player name (partial match)
player2stringRequiredSecond player name (partial match)
tourstringOptionalTour filter (atp or wta)
limitintegerOptionalMax matches (default 20, max 50)
bash
curl https://api.playcallerapp.com/v1/tennis/players/h2h \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/tennis/players/:name/game-log

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.

ParameterTypeRequiredDescription
namestringRequiredPlayer name, hyphenated (case-insensitive partial match)
tourstringOptionalTour filter (atp or wta)
limitintegerOptionalMax matches (default 20, max 50)
bash
curl https://api.playcallerapp.com/v1/tennis/players/{name}/game-log \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/tennis/rankings Growth+

Real official ATP/WTA rankings synced from ESPN, refreshed every 12h. Not a fantasy expert-consensus ranking — this is the actual tour ranking.

ParameterTypeRequiredDescription
tourstringOptional'atp' or 'wta' (default atp)
limitintegerOptionalMax rows (default 50, max 150)
bash
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.

GET /v1/golf/tournaments

Lists active and recent tournaments. Optional ?tour=pga|lpga.

bash
curl https://api.playcallerapp.com/v1/golf/tournaments \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/golf/leaderboard

Returns current tournament leaderboard with positions, scores to par, and round-by-round scores. Optional ?tour=pga|lpga, ?limit= (max 156).

bash
curl https://api.playcallerapp.com/v1/golf/leaderboard?limit=25 \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/golf/players/:id/scoring-average Growth+

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.

ParameterTypeRequiredDescription
idstringRequiredPlayCaller golf player ID (format: pc_golf_espn_XXXXX)
tournamentsintegerOptionalNumber of most-recent tournaments to average over (default 5, max 20)
bash
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.

GET /v1/nascar/races

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).

ParameterTypeRequiredDescription
limitintegerOptionalMax races (default 20, max 40)
bash
curl https://api.playcallerapp.com/v1/nascar/races \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nascar/results

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.

ParameterTypeRequiredDescription
eventstringOptionalESPN event ID for the race (defaults to most recent)
bash
curl https://api.playcallerapp.com/v1/nascar/results \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nascar/standings

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.

ParameterTypeRequiredDescription
seasonintegerOptionalFilter to one season year (e.g. 2026); omit for all-time
bash
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.

GET /v1/f1/races

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.

ParameterTypeRequiredDescription
limitintegerOptionalMax races (default 20, max 40)
bash
curl https://api.playcallerapp.com/v1/f1/races \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/f1/results

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.

ParameterTypeRequiredDescription
eventstringOptionalESPN event ID for the race weekend (defaults to most recent)
sessionstringOptionalFilter to one session
bash
curl https://api.playcallerapp.com/v1/f1/results \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/f1/standings

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.

ParameterTypeRequiredDescription
seasonintegerOptionalFilter to one season year (e.g. 2026); omit for all-time
bash
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.

GET /v1/ufc/events

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.

ParameterTypeRequiredDescription
statestringOptionalFilter by bout state (scheduled, in_progress, final)
limitintegerOptionalMax bouts (default 100, max 200)
bash
curl https://api.playcallerapp.com/v1/ufc/events \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/ufc/fighters

Returns all fighters appearing on upcoming or recent UFC cards, with their next scheduled fight date and card name.

ParameterTypeRequiredDescription
limitintegerOptionalMax fighters (default 50, max 200)
bash
curl https://api.playcallerapp.com/v1/ufc/fighters \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/ufc/fighters/:name/record

Win/loss/method record for a specific fighter, aggregated from stored ESPN fight results. Fighter name is a case-insensitive partial match.

ParameterTypeRequiredDescription
namestringRequiredFighter name (partial match, e.g. jones or jon-jones)
bash
curl https://api.playcallerapp.com/v1/ufc/fighters/{name}/record \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/ufc/rankings Growth+

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.

ParameterTypeRequiredDescription
divisionstringOptionalPartial division name match (e.g. "Lightweight", "Pound for Pound"). Omit to list available divisions.
bash
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.

bash
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.

Example: cURL
bash
curl -X GET \
  -H "X-PlayCaller-Key: pc_sbx_your_key" \
  "https://api.playcallerapp.com/daas/usage"
200: Successful Response
json
{
  "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"
    }
  ]
}
Response Fields
FieldTypeDescription
key_prefixstringFirst 12 chars of your key + "..." (never the full key)
tierstringsandbox, build, pro_insights, or syndicate_alpha
is_trialbooleanWhether this is a free trial key
trial_days_remaininginteger|nullDays left in trial, or null for paid keys
calls_this_monthintegerAPI calls made in the current billing cycle
calls_limit_monthintegerMonthly call quota for your tier
calls_remainingintegerCalls remaining before hitting MONTHLY_QUOTA_EXCEEDED
rate_limit_per_minintegerPer-minute rate limit
reset_atstringISO 8601 timestamp when monthly quota resets
endpoint_breakdownarrayPer-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.

GET /v1/nfl/depth-chart/changes Growth+

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.

ParameterTypeRequiredDescription
sincestringOptionalStart date (YYYY-MM-DD, default 14 days ago)
teamstringOptionalTeam abbreviation filter (e.g. KC, DAL)
positionstringOptionalPosition filter (QB, RB, WR, TE)
change_typestringOptionalType of depth chart move
limitintegerOptionalMax results (default 50, max 100)
bash
curl https://api.playcallerapp.com/v1/nfl/depth-chart/changes \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nfl/players/rankings Growth+

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.

ParameterTypeRequiredDescription
positionstringOptionalFilter by position
formatstringOptionalScoring format (informational — ADP is sourced from PPR leagues)
limitintegerOptionalMax results (default 200, max 500)
offsetintegerOptionalPagination offset
bash
curl https://api.playcallerapp.com/v1/nfl/players/rankings \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/nfl/players/:id/camp-intel

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.

ParameterTypeRequiredDescription
idstringRequiredPlayCaller NFL player ID (e.g. nfl_001234)
bash
curl https://api.playcallerapp.com/v1/nfl/players/pc_nfl_4046533/camp-intel \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
POST /v1/nfl/rankings/custom Pro+

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.

bash
curl -X POST https://api.playcallerapp.com/v1/nfl/rankings/custom \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/:sport/waiver-priority Growth+

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.

ParameterTypeRequiredDescription
sportstringRequiredSport key
limitintegerOptionalMax candidates (default 20, max 50)
positionstringOptionalFilter by position (e.g. WR, RB)
exclude_injuredbooleanOptionalExclude Out/IR/PUP players (default true)
bash
curl https://api.playcallerapp.com/v1/nfl/waiver-priority \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/:sport/teams/:team/roster-pulse Growth+

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).

ParameterTypeRequiredDescription
sportstringRequiredSport key
teamstringRequiredTeam abbreviation (e.g. KC, LAL, NYY)
bash
curl https://api.playcallerapp.com/v1/nfl/teams/KC/roster-pulse \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/:sport/odds Growth+

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.

ParameterTypeRequiredDescription
sportstringRequiredSport key
bash
curl https://api.playcallerapp.com/v1/nfl/odds \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/:sport/odds/history/:gameId Pro+

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.

ParameterTypeRequiredDescription
sportstringRequiredSport key
gameIdstringRequiredGame event ID (from /v1/:sport/odds event_id field)
bash
curl https://api.playcallerapp.com/v1/nfl/odds/history/game_2026_wk5_kc_buf \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/:sport/teams/:team/schedule

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.

ParameterTypeRequiredDescription
sportstringRequiredSport key
teamstringRequiredTeam abbreviation (e.g. KC for NFL, LAL for NBA)
statusstringOptionalFilter: upcoming | final | live | all (default: all)
seasonintegerOptionalSeason year (NFL only, e.g. 2026)
limitintegerOptionalMax games (default 20, max 50)
bash
curl https://api.playcallerapp.com/v1/nfl/teams/KC/schedule \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/:sport/teams/:team/injuries

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.

ParameterTypeRequiredDescription
sportstringRequiredSport key
teamstringRequiredTeam abbreviation (e.g. KC, LAD, LAL)
limitintegerOptionalMax signals (default 20, max 50)
bash
curl https://api.playcallerapp.com/v1/nfl/teams/KC/injuries \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/:sport/players/:id/news

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.

ParameterTypeRequiredDescription
sportstringRequiredSport key
idstringRequiredPlayCaller player ID
limitintegerOptionalMax signals to return (default 10, max 30)
bash
curl https://api.playcallerapp.com/v1/nfl/players/pc_nfl_4046533/news \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/players/compare

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.

ParameterTypeRequiredDescription
player1stringRequiredFirst player name (fuzzy matched). Example: "Tyreek Hill"
player2stringRequiredSecond player name (fuzzy matched). Example: "Stefon Diggs"
sportstringOptionalSport key to scope both lookups (recommended for accuracy). Options: nfl, mlb, nba
bash
curl https://api.playcallerapp.com/v1/players/compare \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/data/status

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.

bash
curl https://api.playcallerapp.com/v1/data/status \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/intelligence/signals Pro+

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.

ParameterTypeRequiredDescription
sportstringOptionalSport key filter
severitystringOptionalSignal severity filter
typestringOptionalSignal type filter (partial match)
sincestringOptionalStart date (YYYY-MM-DD, default 7 days ago)
limitintegerOptionalMax results (default 100, max 200)
bash
curl https://api.playcallerapp.com/v1/intelligence/signals \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
POST /v1/batch/players Growth+

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.

bash
curl -X POST https://api.playcallerapp.com/v1/batch/players \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
POST /v1/batch/signals Pro+

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.

bash
curl -X POST https://api.playcallerapp.com/v1/batch/signals \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/model/predictions/:playerId Pro+

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.

ParameterTypeRequiredDescription
playerIdstringRequiredPlayCaller player ID (e.g. nfl_001234)
limitintegerOptionalMax predictions to return (default 10, max 50)
seasonintegerOptionalNFL season year (e.g. 2025)
model_typestringOptionalFilter by model type (e.g. confidence)
bash
curl https://api.playcallerapp.com/v1/model/predictions/pc_nfl_4046533 \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/audit/events

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.

ParameterTypeRequiredDescription
limitintegerOptionalMax events to return (default 50, max 200)
beforestringOptionalISO 8601 cursor timestamp — return events before this time
actionstringOptionalFilter by action type (e.g. key_rotated, ip_allowlist_added)
bash
curl https://api.playcallerapp.com/v1/audit/events \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /daas/key-info

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.

ParameterTypeRequiredDescription
keystringRequiredThe PlayCaller API key to look up
bash
curl https://api.playcallerapp.com/daas/key-info \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
POST /mcp/start-trial

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.

bash
curl -X POST https://api.playcallerapp.com/mcp/start-trial \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/feed Pro+

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.

ParameterTypeRequiredDescription
playerstringRequiredPlayer full name (partial match)
sportstringOptionalSport (default nfl)
bash
curl https://api.playcallerapp.com/v1/feed \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/model/metadata Pro+

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.

ParameterTypeRequiredDescription
sportstringOptionalFilter to one sport
bash
curl https://api.playcallerapp.com/v1/model/metadata \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/players/trending Growth+

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.

ParameterTypeRequiredDescription
sportstringOptionalFilter by sport key
limitintegerOptionalMax players (default 20, max 50)
bash
curl https://api.playcallerapp.com/v1/players/trending \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/players/filter Growth+

Query players by stat thresholds (snap %, target share, fantasy points) against the most recent daily stat row per player. Whitelist-only query params.

ParameterTypeRequiredDescription
positionstringOptionalExact position match
teamstringOptionalExact team abbreviation match
sportstringOptionalExact sport_key match
min_snap_pctnumberOptional
max_snap_pctnumberOptional
min_target_sharenumberOptional
max_target_sharenumberOptional
min_fantasy_ptsnumberOptional
max_fantasy_ptsnumberOptional
limitintegerOptionalMax results (default 50, max 200)
bash
curl https://api.playcallerapp.com/v1/players/filter \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/:sport/ecr Growth+

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.

ParameterTypeRequiredDescription
sportstringRequiredSport key
positionstringOptionalFilter by position
limitintegerOptionalMax players (default 150, max 300)
bash
curl https://api.playcallerapp.com/v1/nfl/ecr \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/:sport/games/:gameId/plays Pro+

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).

ParameterTypeRequiredDescription
sportstringRequiredSport key
gameIdstringRequiredESPN game/event ID
bash
curl https://api.playcallerapp.com/v1/nfl/games/game_2026_wk5_kc_buf/plays \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/bulk/export

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`).

ParameterTypeRequiredDescription
sportstringRequiredSport key
includestringOptionalSet to "metadata" to include each player's full metadata JSON blob
bash
curl https://api.playcallerapp.com/v1/bulk/export \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/:sport/teams/:team/practice

Per-player practice participation status (DNP/limited/full) from ESPN's public injury feed, refreshed twice daily.

ParameterTypeRequiredDescription
sportstringRequiredSport key
teamstringRequiredTeam abbreviation
bash
curl https://api.playcallerapp.com/v1/nfl/teams/KC/practice \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/:sport/players/:id/projection Growth+

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.

ParameterTypeRequiredDescription
sportstringRequiredSport key
idstringRequiredPlayCaller player ID
weeksintegerOptionalRemaining weeks to project across (default 10, max 18)
scoringstringOptionalScoring format label (informational only — does not change the underlying average)
bash
curl https://api.playcallerapp.com/v1/nfl/players/pc_nfl_4046533/projection \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/:sport/players/:id/splits

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.

ParameterTypeRequiredDescription
sportstringRequiredSport key (currently mlb only)
idstringRequiredPlayCaller player ID
seasonintegerOptionalFilter to one season year
bash
curl https://api.playcallerapp.com/v1/nfl/players/pc_nfl_4046533/splits \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/:sport/dfs/slates Growth+

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.

ParameterTypeRequiredDescription
sportstringRequiredSport key
platformstringOptionalFilter to one platform
daysintegerOptionalLookback window in days (default 7, max 30)
bash
curl https://api.playcallerapp.com/v1/nfl/dfs/slates \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/:sport/dfs/slates/:slateId/salaries Growth+

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.

ParameterTypeRequiredDescription
sportstringRequiredSport key
slateIdstringRequiredThe slate's DB id (integer) or its platform slate_id (string)
positionstringOptionalFilter by position
bash
curl https://api.playcallerapp.com/v1/nfl/dfs/slates/{slateId}/salaries \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
POST /v1/lineup/optimize Growth+

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.

bash
curl -X POST https://api.playcallerapp.com/v1/lineup/optimize \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /v1/meta/coverage

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.

bash
curl https://api.playcallerapp.com/v1/meta/coverage \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
GET /daas/rate-limit-status

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).

bash
curl https://api.playcallerapp.com/daas/rate-limit-status \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
POST /daas/webhooks/:id/deliveries/:deliveryId/replay

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.

ParameterTypeRequiredDescription
idstringRequiredWebhook ID
deliveryIdstringRequiredDelivery ID to replay
bash
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.

Rate-Limit Response Headers

Every authenticated response includes standard rate-limit headers so you can track your position without polling /daas/usage:

HeaderExampleDescription
X-PlayCaller-TiersandboxYour current tier name
X-RateLimit-Limit200Your daily request ceiling (unlimited for Syndicate Alpha)
X-RateLimit-Remaining194Requests remaining today
X-RateLimit-Reset1751846400Unix epoch timestamp when the daily counter resets (midnight UTC)
X-RateLimit-Policy200/day;w=86400, 2/min;w=60Full policy: daily cap and per-minute cap
X-PlayCaller-Sandbox-Expires2026-07-21T00:00:00.000ZISO timestamp when sandbox expires. Sandbox keys only.
X-PlayCaller-Sandbox-Days-Remaining9Integer days remaining in sandbox. Sandbox keys only.
bash
# 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.

429: Per-Minute Rate Limit

Exceeding your per-minute limit returns HTTP 429. The Retry-After header tells you exactly when to retry:

json
{
  "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"
}
429: Monthly Quota Exhausted

Once your monthly call quota is used up, all requests return HTTP 429 until your billing cycle resets:

json
{
  "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"
}
Upgrade path: Hit your limit? Upgrade your plan at playcallerapp.com. Changes take effect immediately, no waiting for cycle reset.

Error Codes

All errors return a standardized JSON object with error_code, message, and documentation_url.

HTTP StatusCodeMeaning
400INVALID_PARAMETERA query parameter value is malformed or out of range.
401MISSING_API_KEYX-PlayCaller-Key header is absent.
401INVALID_API_KEYKey not found, revoked, or not yet verified.
402TRIAL_EXPIRED14-day Developer Sandbox has ended. Upgrade to a paid plan to continue.
403TIER_INSUFFICIENTEndpoint requires a higher plan tier. Response includes required_tier and upgrade_url.
429RATE_LIMIT_EXCEEDEDPer-minute request limit exceeded. Retry after retry_after_seconds.
429MONTHLY_QUOTA_EXCEEDEDMonthly call quota exhausted. Resets on billing cycle date.
429DAILY_LIMIT_EXCEEDEDDaily request cap hit (distinct from monthly quota). Resets at midnight UTC. Response includes retry_after_seconds.
403SANDBOX_EXPIRED14-day sandbox window has closed. Upgrade to a paid plan or re-register for a new sandbox at /daas/sandbox/start.
403IP_BLOCKEDRequest IP is not in the allowlist configured for this key (Syndicate Alpha). Contact your account manager to update the allowlist.
500INTERNAL_ERRORServer error. Retry with exponential backoff.
402: Trial Expired
json
{
  "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"
}
403: Tier Insufficient
json
{
  "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.

Query Parameters
ParameterTypeRequiredDescription
playerstringRequiredPlayer name or playcaller_id
teamstringOptional3-letter team code to disambiguate common names
Response Fields
FieldTypeDescription
player_namestringCanonical player name
teamstringCurrent team abbreviation
positionstringPosition code
confidence_scoreinteger|nullCalibrated 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_signalstring|nullValidated directional heat: Cold, Warming, Hot, or Surging. AUC-ROC 0.623, quartile lift 25.6pp, 3-fold walk-forward validated.
synthesisstring|nullPlain-English summary generated from signal data, validated against source before delivery
signalsarrayIndividual signals that drove the score, with source and weight
_auditobjectModel 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.

7 Tools
ToolDescription
get_injury_signalsActive beat reporter signals, filterable by sport and severity
get_player_identityResolve a player across ESPN, Sleeper, and Yahoo. 31,000+ player identities normalized
get_anomaly_scoresPlayers deviating from 3-season usage baseline, score 0-100
get_player_projectionsTrailing 10-game fantasy point average with injury signal overlay. Not a predictive model, a plain average.
get_prediction_marketsActive Kalshi prop markets. confidence_score field pending Kalshi data consent.
get_player_statsPer-game stat history for NFL/MLB/NBA/NHL players by name. NFL 2024 wks 1–18, NBA 5 seasons (127k rows).
get_team_rosterActive roster for any NFL, MLB, NBA, or NHL team by abbreviation. Optional position filter.
Quick Connect

Add to .cursor/mcp.json or Claude Desktop config:

json
{ "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/articles/waiver

Returns AI-generated waiver wire analysis articles backed by validated signal data. Requires Pro Insights tier. The sport parameter is required.

Query Parameters
ParamTypeRequiredDescription
sportstringRequiredSport: nfl, mlb, nba
weekintegerOptionalWeek number (NFL). Defaults to current week.
Example
bash
curl "https://api.playcallerapp.com/v1/articles/waiver?sport=nfl" \
  -H "X-PlayCaller-Key: pc_pri_your_key"
200: Response includes: title, content (full article), sport, week, published_at, signals_used
403: TIER_INSUFFICIENT: Pro Insights required

GET /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.

Query Parameters
ParamTypeRequiredDescription
playerstringOptionalFilter by player name (partial match)
teamstringOptionalFilter by team abbreviation
limitintegerOptionalMax results (default 20)
Example
bash
curl "https://api.playcallerapp.com/v1/nba/confidence?limit=5" \
  -H "X-PlayCaller-Key: pc_pri_your_key"
200: Response includes: player_name, team, confidence_score, percentile, component_breakdown, model_audit
403: TIER_INSUFFICIENT: Pro Insights required

GET /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.

Example
bash
curl https://api.playcallerapp.com/v1/meta/coverage \
  -H "X-PlayCaller-Key: pc_sbx_your_key"
200: Response includes: 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.

Path Parameters
ParamTypeRequiredDescription
sportstringRequiredPath segment: nfl, nba, or mlb
Query Parameters
ParamTypeRequiredDescription
playerstringOptionalFilter by player name (partial match)
teamstringOptionalFilter by team abbreviation
seasonintegerOptionalSeason year (e.g. 2025)
limitintegerOptionalMax results (default 50)
Example
bash
curl "https://api.playcallerapp.com/v1/nfl/games/history?team=KC&season=2025" \
  -H "X-PlayCaller-Key: pc_pri_your_key"
200: Response varies by sport; all include player_name, team, game_date, and sport-specific stat columns
403: TIER_INSUFFICIENT: Pro Insights required
404: Unsupported sport

GET /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.

Path Parameters
ParamTypeRequiredDescription
sportstringRequirednfl, mlb, or nba
idstringRequiredPlayCaller player ID (e.g. pc_nfl_4046533)
Response Fields
FieldTypeDescription
consistency_scorenumber0–100. Higher = more consistent floor. Based on stddev of snap_pct/minutes over last 8 games.
momentum_deltanumberSigned float. Avg fantasy points last 3 games minus avg games 4–6 back. Positive = trending up.
opportunity_ceilingnumber90th-percentile target share or usage rate from last 8 games: what the player can do in an optimal game.
sample_sizeintegerGames used to compute metrics.
week_computedstringISO week the batch was last run.
Example
bash
curl "https://api.playcallerapp.com/v1/nfl/players/pc_nfl_4046533/alpha" \
  -H "X-PlayCaller-Key: pc_pri_your_key"
200: Returns player_id, sport, consistency_score, momentum_delta, opportunity_ceiling, sample_size, week_computed
403: TIER_INSUFFICIENT: Pro Insights required
404: No alpha data yet for this player (batch runs weekly)

GET /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.

Path Parameters
ParamTypeRequiredDescription
idstringRequiredPlayCaller player ID to find matches for
Query Parameters
ParamTypeRequiredDescription
sportstringRequiredSport: nfl, mlb, or nba
limitintegerOptionalNumber of similar players to return (default 10, max 25)
Example
bash
curl "https://api.playcallerapp.com/v1/players/similar/pc_nfl_4046533?sport=nfl&limit=5" \
  -H "X-PlayCaller-Key: pc_pri_your_key"
200: Returns array of { playcaller_id, name, position, team, similarity_score } ordered by cosine similarity
403: TIER_INSUFFICIENT: Pro Insights required
404: No embedding computed for this player yet

GET /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 Types
EventTriggerPayload
player.injuredEvery 4h injury refresh{ player, team, severity, signal_type, sport }
game.score_updatedLive game pipeline{ game_id, home_team, away_team, home_score, away_score, status }
anomaly.detectedWeekly anomaly refresh{ player, team, anomaly_score, recommendation }
Example
bash
curl -N "https://api.playcallerapp.com/v1/events/stream" \
  -H "X-PlayCaller-Key: pc_pri_your_key"
JavaScript Example
javascript
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)));
200: text/event-stream; heartbeat every 30s; connection persists until closed
403: TIER_INSUFFICIENT: Pro Insights required

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.

Endpoints
MethodPathDescription
POST/daas/webhooksRegister a new webhook. Body: { url, events[] }
GET/daas/webhooksList active webhooks for this API key
DELETE/daas/webhooks/:idDeactivate a webhook
GET/daas/webhooks/:id/deliveriesDelivery log with status codes and retry history
Signature Verification

Every POST includes X-PlayCaller-Signature: sha256=<hex> and X-PlayCaller-Delivery-Id headers. Verify before processing:

javascript
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));
}
Register Example
bash
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"]}'
201: Returns { id, url, events, secret }. Store secret, it is only returned once.
403: TIER_INSUFFICIENT: Syndicate Alpha required
Webhook auto-deactivates after 3 consecutive failures. You will receive an email notification and can re-register at any time.
Event Catalog

Pass any subset of these event types in the events[] array when registering:

EventWhen it fires
player.injuredA player's injury status changes (new injury, designation update, or return to active)
game.score_updatedLive score change during an active game
game.status_changedGame status changes (scheduled → in_progress → final / postponed)
anomaly.detectedA player crosses the anomaly detection threshold (heat model or pitcher form signal)
Payload Envelope

All events share the same outer envelope. Only data differs by event type:

json
{
  "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.

GET /v1/feed
The Confidence Moat™: priority access to new validated confidence models as they land in the Feed, built the same way as the live NFL and NBA confidence scores today (real AUC, not a heuristic).
Pro+: Coming Soon
GET /v1/identity/map
Cross-platform player identity resolution: maps a player across Sleeper, ESPN, Yahoo, DraftKings, FanDuel, and Kalshi using a unified PlayCaller player ID. Stop maintaining your own lookup tables.
Pro+: Coming Soon