Predictions API
Programmatic access to Feeling Clutch pregame predictions for NBA, WNBA, NFL, and MLB.
Sign in to create API keys on the API keys page.
Authentication
Send your API key on every request using either header:
Authorization: Bearer fc_…X-API-Key: fc_…
Keys are tied to your portal account and subscription. Revoked or invalid keys return 401.
API keys
Create keys from the API keys page after signing in. Each key is shown once at creation — copy and store it securely.
| Action | Method | Path | Auth |
|---|---|---|---|
| List keys | GET | /api/user/api-keys | Session cookie |
| Create key | POST | /api/user/api-keys | Session cookie |
| Revoke key | DELETE | /api/user/api-keys/{id} | Session cookie |
Create request body: {"name": "My integration"}
Pregame predictions
Returns pregame model scores for each game on a slate.
Query parameters
| Parameter | Required | Description |
|---|---|---|
league | Yes | nba, wnba, nfl, or mlb (WNBA omitted when disabled on the server) |
date | No | Slate date YYYY-MM-DD (Eastern). Defaults to today. Cannot be in the future. |
Access by date
- Today — requires paid
liveaccess for that league - Past dates — requires
historicalaccess (included on the free plan)
Example request
curl -s "/api/v1/predictions/pregame?league=nba&date=2026-06-07" \ -H "Authorization: Bearer fc_YOUR_KEY_HERE"
Example response
{
"league": "nba",
"date": "2026-06-07",
"games": [
{
"gameId": "0022500001",
"homeTeam": { "abbreviation": "BOS", "name": "Boston Celtics" },
"awayTeam": { "abbreviation": "NYK", "name": "New York Knicks" },
"predictedHomeScore": 112.5,
"predictedAwayScore": 108.0,
"predictedTotal": 220.5,
"predictedSpread": "BOS -4.5"
}
]
}
Response fields
| Field | Description |
|---|---|
league | League requested |
date | Slate date (YYYY-MM-DD) |
games[].gameId | League-specific game identifier |
games[].homeTeam / awayTeam | abbreviation and optional name |
predictedHomeScore / predictedAwayScore | Model pregame projected scores |
predictedTotal | Sum of home and away predicted scores |
predictedSpread | Favored team and line (e.g. BOS -4.5). Spread is away − home; negative means home is favored. |
Games without a stored pregame prediction are omitted from the list.
Errors
| Status | Meaning |
|---|---|
400 | Invalid league or date |
401 | Missing, invalid, or revoked API key |
403 | Your plan does not include access for that league/date |
502 | Upstream sport app unavailable |
Error bodies are JSON: {"detail": "…"}
Game edge and expected value
Returns per-game model edge and expected value (EV) for moneyline, spread, and total markets. Venue is selected by path prefix — sportsbook and Kalshi use different field shapes.
GET /api/v1/analytics/edge remains as a deprecated alias of the sportsbook path.
Query parameters
| Parameter | Required | Description |
|---|---|---|
league | Yes | nba, wnba, or mlb |
date | No | Slate date YYYY-MM-DD (Eastern). Defaults to today. Cannot be in the future. |
Sportsbook example
{
"venue": "sportsbook",
"league": "nba",
"date": "2026-06-07",
"bettingModeEnabled": true,
"games": [
{
"gameId": "0022500001",
"homeTeam": { "abbreviation": "BOS", "name": "Boston Celtics" },
"awayTeam": { "abbreviation": "NYK", "name": "New York Knicks" },
"betting": {
"moneyline": {
"side": "home",
"modelProbability": 0.58,
"marketProbability": 0.52,
"edge": 0.06,
"edgePct": 6.0,
"evPerUnit": 0.1154,
"americanOdds": -110,
"action": "bet",
"priceSource": "sportsbook"
},
"spread": null,
"total": null,
"hasActionableBet": true,
"actionableCount": 1
}
}
]
}
Sportsbook: edge is model probability minus market probability. evPerUnit is expected return per $1 staked at the quoted American odds.
Kalshi example
{
"venue": "kalshi",
"league": "nba",
"date": "2026-06-07",
"bettingModeEnabled": true,
"games": [
{
"gameId": "0022500001",
"homeTeam": { "abbreviation": "BOS", "name": "Boston Celtics" },
"awayTeam": { "abbreviation": "NYK", "name": "New York Knicks" },
"betting": {
"moneyline": {
"side": "home",
"contractTicker": "KXNBAGAME-26JUN07NYKBOS-BOS",
"contractLeg": "yes",
"contractPrice": 0.52,
"modelProbability": 0.58,
"edge": 0.06,
"edgePct": 6.0,
"evPerContract": 0.06,
"action": "bet",
"priceSource": "kalshi"
},
"spread": null,
"total": null,
"hasActionableBet": true,
"actionableCount": 1
}
}
]
}
Kalshi: edge / evPerContract are for the returned contractTicker, contractLeg, and contractPrice (dollars, 0–1). Sportsbook-only fields are omitted.
Edge sweep
Season-to-date profitable edge bands by market from graded historical samples. Requires historical access for the league. Venue is selected by path prefix.
GET /api/v1/analytics/edge-sweep remains as a deprecated alias of the sportsbook path.
Query parameters
| Parameter | Required | Description |
|---|---|---|
league | Yes | nba, wnba, or mlb |
refresh | No | When true, rebuild the upstream winner-report cache before computing sweeps. |
Example response (sportsbook)
{
"venue": "sportsbook",
"league": "nba",
"generatedAt": "2026-07-01T12:00:00+00:00",
"settings": { "min_ml_edge": 0.04 },
"actionableBetCount": 42,
"summaryByMarket": { "moneyline": { "mean_edge": 0.05 } },
"edgeSweepByMarket": {
"moneyline": {
"graded_bet_count": 100,
"edge_min_pct": 5.12,
"edge_max_pct": 49.0,
"levels": [
{
"level": 0,
"band_width_pct": 5.0,
"title": "Overview (5% bands)",
"bands": [
{
"label": "5-10%",
"edge_lo_pct": 5.0,
"edge_hi_pct": 10.0,
"graded_bet_count": 7,
"roi": 0.1571,
"thin_sample": true
}
]
}
]
}
},
"roiByEdgeBucketByMarket": { "moneyline": [] }
}
Example response (Kalshi)
{
"venue": "kalshi",
"league": "nba",
"generatedAt": "2026-07-01T12:00:00+00:00",
"settings": { "min_ml_edge": 0.04 },
"actionableBetCount": 3,
"summaryByMarket": { "moneyline": { "mean_edge": 0.08 } },
"edgeSweepByMarket": {
"moneyline": {
"graded_contract_count": 3,
"edge_min_pct": 11.0,
"edge_max_pct": 14.3,
"levels": [
{
"level": 0,
"band_width_pct": 5.0,
"title": "Overview (5% bands)",
"bands": [
{
"label": "10-15%",
"edge_lo_pct": 10.0,
"edge_hi_pct": 15.0,
"graded_contract_count": 3,
"roi": -0.0148,
"thin_sample": true
}
]
}
]
}
},
"roiByEdgeBucketByMarket": { "moneyline": [] }
}
Nested sweep objects use upstream field names. Use graded_bet_count (sportsbook) or graded_contract_count (Kalshi) for sample size. Band bounds are edge_lo_pct / edge_hi_pct. Bands marked thin_sample have fewer than 20 graded samples.
Coming soon
Live in-game predictions (NBA) will be added as a separate endpoint.