PlayCaller API
28 live endpoints delivering multi-sport fantasy intelligence. NFL injury signals, MLB player data, NBA/CFB/Soccer scores, fantasy scoring, historical trends, and the validated /v1/feed intelligence layer — all in clean JSON.
https://playcallerapp.comAll data endpoints use the
/v1/ prefix (e.g. /v1/intelligence/news, /v1/mlb/players).
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.
Trial keys are prefixed pc_hob_. Paid Pro keys use pc_pro_.
PC_API_KEY=pc_hob_your_key in your .env file.
curl -H "X-PlayCaller-Key: $PC_API_KEY" \ https://playcallerapp.com/v1/intelligence/news?limit=1
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_hob_your_api_key_here
Key prefixes: pc_hob_ for Hobbyist (and trial) keys, pc_pro_ for Pro keys.
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 /v1/intelligence/news
Real-time NFL player signals — injuries, depth chart changes, role shifts, and practice reports. Sourced from beat reporter feeds. Updated every 2 hours. Available on all tiers.
| Parameter | Type | Required | Description |
|---|---|---|---|
| severity | string | Optional | Filter by severity: high, medium, low. Omit to return all. |
| team | string | Optional | 3-letter team abbreviation (e.g., PHI, KC, SF). Filter to single team. |
| limit | integer | Optional | Records to return. Default: 25. Max: 100. |
curl -X GET \ -H "X-PlayCaller-Key: pc_hob_your_key" \ "https://playcallerapp.com/v1/intelligence/news?severity=high&team=SF&limit=5"
import requests api_key = "pc_hob_your_key" url = "https://playcallerapp.com/v1/intelligence/news" params = { "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["severity"], signal["summary"])
{ "success": true, "endpoint": "/v1/intelligence/news", "count": 2, "data": [ { "id": 1247, "player_name": "Christian McCaffrey", "team": "SF", "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": "hobbyist", "calls_remaining_this_month": 847 } }
| Field | Type | Description |
|---|---|---|
| id | integer | Signal record ID |
| player_name | string | Full player name |
| team | string | 3-letter team code |
| signal_type | string | Type of signal (e.g., injury_update, depth_chart) |
| 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. Display capped at 75 pending tail calibration validation. null when signal pre-dates the model or is non-NFL. |
| 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 /v1/intelligence/injuries
Dedicated injury intelligence feed with severity filtering. Returns active injuries from NFL, MLB, and NBA beat reporter signals. Updated every 2 hours. Available on all tiers.
curl https://playcallerapp.com/v1/intelligence/injuries?severity=high&team=CIN&limit=5 \ -H "X-PlayCaller-Key: pc_hob_your_key"
| Parameter | Type | Required | Description |
|---|---|---|---|
| severity | string | Optional | Filter: high, medium, low |
| team | string | Optional | 3-letter team code (e.g., CIN, NYY) |
| player | string | Optional | Player name substring match |
| limit | integer | Optional | Max results (default 50, max 200) |
GET /v1/analytics/trends Pro
Historical NFL performance data (2023–2025). Game-by-game stats including fantasy points, snap%, target share, and air yards. Grouped and sorted by player. Requires Pro 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_pro_your_key" \ "https://playcallerapp.com/v1/analytics/trends?position=RB&season=2024&limit=10"
import requests api_key = "pc_pro_your_key" url = "https://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_hob_your_key" \ "https://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": "hobbyist", "calls_remaining_this_month": 996 } }
Individual player detail by PlayCaller ID (format: pc_mlb_XXXXXX).
curl -H "X-PlayCaller-Key: pc_hob_your_key" \ "https://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_hob_your_key" \ "https://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_hob_your_key" \ "https://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_hob_your_key" \ "https://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: live, final, preview |
| limit | integer | Optional | Max results. Default: 30. Max: 100. |
curl -H "X-PlayCaller-Key: pc_hob_your_key" \ "https://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
Fantasy scoring leaders and rotisserie category leaders powered by PlayCaller's baseball scoring engine. Requires Pro 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_pro_your_key" \ "https://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_pro_your_key" \ "https://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://playcallerapp.com/v1/mlb/standings \ -H "X-PlayCaller-Key: pc_live_your_key"
NBA Endpoints
4 NBA endpoints covering game scores, league standings, teams, and players. Powered by ESPN data pipelines. Available on all tiers.
Returns NBA game scores and states. Filter by date.
curl https://playcallerapp.com/v1/nba/games?date=2026-04-10 \ -H "X-PlayCaller-Key: pc_live_your_key"
Returns current NBA standings by conference and division.
curl https://playcallerapp.com/v1/nba/standings \ -H "X-PlayCaller-Key: pc_live_your_key"
Returns all NBA teams. Filter by conference with ?conference=east or ?conference=west.
curl https://playcallerapp.com/v1/nba/teams?conference=east \ -H "X-PlayCaller-Key: pc_live_your_key"
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://playcallerapp.com/v1/nba/players?team=BOS&position=PG" \ -H "X-PlayCaller-Key: pc_live_your_key"
College Football Endpoints
College football game scores, standings, and rankings. Rankings require Pro tier.
Returns CFB game scores and states. Filter by date.
curl https://playcallerapp.com/v1/cfb/games?date=2026-04-10 \ -H "X-PlayCaller-Key: pc_live_your_key"
Returns current CFB conference standings.
curl https://playcallerapp.com/v1/cfb/standings \ -H "X-PlayCaller-Key: pc_live_your_key"
Returns AP Top 25 and CFP rankings. Requires Pro tier.
curl https://playcallerapp.com/v1/cfb/rankings \ -H "X-PlayCaller-Key: pc_pro_your_key"
Soccer Endpoints
Soccer game scores and league standings across major leagues. Available on all tiers.
Returns soccer match scores and states. Filter by date and league.
curl https://playcallerapp.com/v1/soccer/games?date=2026-04-10 \ -H "X-PlayCaller-Key: pc_live_your_key"
Returns current soccer league standings.
curl https://playcallerapp.com/v1/soccer/standings \ -H "X-PlayCaller-Key: pc_live_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://playcallerapp.com/v1/sports \ -H "X-PlayCaller-Key: pc_live_your_key"
GET /v1/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. Also accessible at /daas/usage (legacy alias).
curl -X GET \ -H "X-PlayCaller-Key: pc_hob_your_key" \ "https://playcallerapp.com/v1/daas/usage"
{ "success": true, "key_prefix": "pc_hob_abc1...", "tier": "hobbyist", "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/?upgrade=1", "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 | hobbyist or pro |
| 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 |
Rate Limits
Rate limits are enforced per API key, measured monthly. Limits reset on your billing cycle date.
| Plan | Daily Calls | Rate Limit |
|---|---|---|
| Trial (14 days, full Pro access) | 100 req/day | 10 req/min |
| Hobbyist ($49/mo) | 200 req/day (6,000/mo) | 30 req/min |
| Pro ($149/mo) | 1,000 req/day (30,000/mo) | 60 req/min |
| Enterprise ($1K–$5K/mo) | Custom | 120 req/min |
| Pro+ ($299/mo) Q3 2026 | Unlimited | 600 req/min |
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 free trial has ended. Upgrade to Hobbyist or Pro 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. |
| 500 | INTERNAL_ERROR | Server error. Retry with exponential backoff. |
{ "error_code": "TRIAL_EXPIRED", "message": "Your 14-day free trial has expired. Upgrade to Hobbyist or Pro 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 tier or higher. Your current tier: hobbyist.", "current_tier": "hobbyist", "required_tier": "pro", "upgrade_url": "https://playcallerapp.com/?upgrade=1" }
GET /v1/feed Pro
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. No rate cap on Pro tier. Requires Pro 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. Quartile lift 6.0pp, W+2 persistence 5.9pp. |
| 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, Yahoo, NFL.com. 13,606 identities normalized |
| get_anomaly_scores | Players deviating from 3-season usage baseline, score 0-100 |
| get_player_projections | AI fantasy point projections generated from signal data. Note: methodology under review. The backing model is currently being audited for validation. Use with appropriate caution. |
| get_prediction_markets | Active Kalshi prop markets with AI confidence scores |
Add to .cursor/mcp.json or Claude Desktop config:
{ "mcpServers": { "playcaller": { "url": "https://playcallerapp.com/mcp", "headers": { "X-PlayCaller-Key": "YOUR_KEY" } } } }
Full tool schemas at GET /mcp (unauthenticated discovery). Auth: X-PlayCaller-Key header on POST.
Roadmap — Q3 2026
Two new endpoints ship with the Pro+ tier in Q3 2026. Join the waitlist to lock in Pro pricing.
/v1/intelligence/news feed.