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, or mlb (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"
    }
  ]
}

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.

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, or mlb
dateNoSlate 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/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, or mlb
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.

Coming soon

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