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.

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

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. Trial keys are prefixed pc_hob_. Paid Pro keys use pc_pro_.
4
Store your key securely
Store your API key as an environment variable. Never commit it to source code. Use PC_API_KEY=pc_hob_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://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.

Header format
http
X-PlayCaller-Key: pc_hob_your_api_key_here

Key prefixes: pc_hob_ for Hobbyist (and trial) keys, pc_pro_ for Pro keys.

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

Parameters
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.
Example — cURL
bash
curl -X GET \
  -H "X-PlayCaller-Key: pc_hob_your_key" \
  "https://playcallerapp.com/v1/intelligence/news?severity=high&team=SF&limit=5"
Example — Python
python
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"])
200 — Successful Response
json
{
  "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
  }
}
Response Fields
FieldTypeDescription
idintegerSignal record ID
player_namestringFull player name
teamstring3-letter team code
signal_typestringType of signal (e.g., injury_update, depth_chart)
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. Display capped at 75 pending tail calibration validation. null when signal pre-dates the model or is non-NFL.
sourcestringSource name (e.g., beat reporter, injury report)
source_urlstring|nullOriginal source URL, if available
published_atstringISO 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.

Example — cURL
bash
curl https://playcallerapp.com/v1/intelligence/injuries?severity=high&team=CIN&limit=5 \
  -H "X-PlayCaller-Key: pc_hob_your_key"
Query Parameters
ParameterTypeRequiredDescription
severitystringOptionalFilter: high, medium, low
teamstringOptional3-letter team code (e.g., CIN, NYY)
playerstringOptionalPlayer name substring match
limitintegerOptionalMax results (default 50, max 200)

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_hob_your_key" \
  "https://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": "hobbyist",
    "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_hob_your_key" \
  "https://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_hob_your_key" \
  "https://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_hob_your_key" \
  "https://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_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.

GET /v1/mlb/games
ParameterTypeRequiredDescription
datestringOptionalFilter by game date: YYYY-MM-DD. Default: all available.
statestringOptionalFilter by game state: live, final, preview
limitintegerOptionalMax results. Default: 30. Max: 100.
bash
curl -H "X-PlayCaller-Key: pc_hob_your_key" \
  "https://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

Fantasy scoring leaders and rotisserie category leaders powered by PlayCaller's baseball scoring engine. Requires Pro 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_pro_your_key" \
  "https://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_pro_your_key" \
  "https://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 tier required. Calling this endpoint with a Hobbyist 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://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.

GET /v1/nba/games

Returns NBA game scores and states. Filter by date.

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

Returns current NBA standings by conference and division.

bash
curl https://playcallerapp.com/v1/nba/standings \
  -H "X-PlayCaller-Key: pc_live_your_key"
GET /v1/nba/teams

Returns all NBA teams. Filter by conference with ?conference=east or ?conference=west.

bash
curl https://playcallerapp.com/v1/nba/teams?conference=east \
  -H "X-PlayCaller-Key: pc_live_your_key"
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://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.

GET /v1/cfb/games

Returns CFB game scores and states. Filter by date.

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

Returns current CFB conference standings.

bash
curl https://playcallerapp.com/v1/cfb/standings \
  -H "X-PlayCaller-Key: pc_live_your_key"
GET /v1/cfb/rankings Pro

Returns AP Top 25 and CFP rankings. Requires Pro tier.

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

GET /v1/soccer/games

Returns soccer match scores and states. Filter by date and league.

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

Returns current soccer league standings.

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

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

Example — cURL
bash
curl -X GET \
  -H "X-PlayCaller-Key: pc_hob_your_key" \
  "https://playcallerapp.com/v1/daas/usage"
200 — Successful Response
json
{
  "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"
    }
  ]
}
Response Fields
FieldTypeDescription
key_prefixstringFirst 12 chars of your key + "..." (never the full key)
tierstringhobbyist or pro
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

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
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 free trial has ended. Upgrade to Hobbyist or Pro 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.
500INTERNAL_ERRORServer error. Retry with exponential backoff.
402 — Trial Expired
json
{
  "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"
}
403 — Tier Insufficient
json
{
  "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.

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. Quartile lift 6.0pp, W+2 persistence 5.9pp.
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.

5 Tools
ToolDescription
get_injury_signalsActive beat reporter signals, filterable by sport and severity
get_player_identityResolve a player across ESPN, Sleeper, Yahoo, NFL.com. 13,606 identities normalized
get_anomaly_scoresPlayers deviating from 3-season usage baseline, score 0-100
get_player_projectionsAI 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_marketsActive Kalshi prop markets with AI confidence scores
Quick Connect

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

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

GET /v1/predictions/confidence
The Confidence Moat™ — ML-weighted probability scores for player outcomes before prediction markets reprice. Identifies situations where on-field intelligence shows a 3%+ edge over current market-implied probabilities. Pairs directly with the /v1/intelligence/news feed.
Pro+ — Q3 2026
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+ — Q3 2026