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.

ActionMethodPathAuth
List keysGET/api/user/api-keysSession cookie
Create keyPOST/api/user/api-keysSession cookie
Revoke keyDELETE/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.

GET /api/v1/predictions/pregame

Query parameters

ParameterRequiredDescription
leagueYesnba, wnba, nfl, mlb, or futbol (WNBA omitted when disabled on the server)
dateNoSlate date YYYY-MM-DD (Eastern). Defaults to today. Cannot be in the future.

Access by date

  • Today — requires paid live access for that league
  • Past dates — requires historical access (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",
      "createdAt": "2026-06-07T14:30:00Z"
    }
  ]
}

Response fields

FieldDescription
leagueLeague requested
dateSlate date (YYYY-MM-DD)
games[].gameIdLeague-specific game identifier
games[].homeTeam / awayTeamabbreviation and optional name
predictedHomeScore / predictedAwayScoreModel pregame projected scores
predictedTotalSum of home and away predicted scores
predictedSpreadFavored team and line (e.g. BOS -4.5). Spread is away − home; negative means home is favored.
createdAtWhen this prediction was last generated or recorded. ISO-8601 when the sport backend provides it; may be a display string for some leagues (e.g. NFL). null if unavailable.

Games without a stored pregame prediction are omitted from the list.

Errors

StatusMeaning
400Invalid league or date
401Missing, invalid, or revoked API key
403Your plan does not include access for that league/date
502Upstream 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/sportsbook/edge
GET /api/v1/analytics/kalshi/edge

GET /api/v1/analytics/edge remains as a deprecated alias of the sportsbook path.

Query parameters

ParameterRequiredDescription
leagueYesnba, wnba, mlb, nfl, or futbol
dateNoSlate date YYYY-MM-DD (Eastern). Defaults to today. Cannot be in the future. For NFL, selects the week containing that date.

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.

When upstream sport apps attach historical odds-band ROI to a priced market (currently MLB, NFL, and futbol), that compact object is returned as oddsBand (impliedLoPct / oddsLo / roi / gradedBetCount or gradedContractCount). It is omitted when no matching band exists.

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/sportsbook/edge-sweep
GET /api/v1/analytics/kalshi/edge-sweep

GET /api/v1/analytics/edge-sweep remains as a deprecated alias of the sportsbook path.

Query parameters

ParameterRequiredDescription
leagueYesnba, wnba, mlb, nfl, or futbol
refreshNoWhen 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.

When upstream includes it, oddsSweepByMarket is also present on this response (same nested shape as the odds-sweep endpoints below). NBA may return {} until that app emits odds sweeps.

Odds sweep

Season-to-date ROI bands by implied market probability, labeled as American odds. Same access rules as edge sweep (historical for the league). Venue is selected by path prefix. MLB, NFL, and futbol currently populate this; other leagues return an empty map until their sport apps emit odds_sweep_by_market.

GET /api/v1/analytics/sportsbook/odds-sweep
GET /api/v1/analytics/kalshi/odds-sweep

Query parameters

ParameterRequiredDescription
leagueYesnba, wnba, mlb, nfl, or futbol
refreshNoWhen true, rebuild the upstream winner-report cache before computing sweeps.

Example response (sportsbook)

{
  "venue": "sportsbook",
  "league": "nfl",
  "generatedAt": "2026-08-14T12:00:00+00:00",
  "settings": { "min_ml_edge": 0.04 },
  "oddsSweepByMarket": {
    "moneyline": {
      "graded_bet_count": 80,
      "implied_min_pct": 50.12,
      "implied_max_pct": 64.9,
      "odds_min": -185.0,
      "odds_max": 100.0,
      "levels": [
        {
          "level": 0,
          "band_width_pct": 5.0,
          "title": "Overview (5% implied-probability bands)",
          "bands": [
            {
              "label": "-122 to +100",
              "implied_lo_pct": 50.0,
              "implied_hi_pct": 55.0,
              "odds_lo": -122.22,
              "odds_hi": 100.0,
              "graded_bet_count": 25,
              "roi": 0.12,
              "thin_sample": false
            }
          ]
        }
      ]
    }
  }
}

Nested sweep objects use upstream field names. Band axis is implied probability (implied_lo_pct / implied_hi_pct); odds_lo / odds_hi are the matching American odds labels. Kalshi uses graded_contract_count instead of graded_bet_count.

Coming soon

Live in-game predictions (NBA) will be added as a separate endpoint.