Developer Preview

Sports Predictions API
& MCP Server

Full probability distributions for every outcome.
REST API for your stack. MCP Server for AI agents.
Tennis · Football · NBA

Sign in to mint your key →

Want to use PredixSport inside Claude Desktop without code? See the 3-step MCP setup guide →

Two Ways to Access the Data

Same probabilistic models, two integration paths depending on your use case.

REST API

Standard JSON endpoints. Query predictions by sport, date, and match. Integrate into dashboards, analytics pipelines, or any application that speaks HTTP.

JSON REST Webhooks

MCP Server

A Model Context Protocol server that exposes prediction tools directly to AI agents. Connect it once in Claude (web or desktop) and use it from any device signed in to your Claude account — including mobile.

MCP AI Agents Tool Use

What MCP Integration Looks Like

When an AI agent has access to PredixSport's MCP server, it can retrieve live probabilistic predictions as part of a natural conversation. No manual API calls, no copy-pasting data.

Add it as a Custom Connector in Claude (web or desktop — step-by-step here), and it surfaces on every device signed in to your Claude account. The server exposes nine tools across four families — get_upcoming_predictions, search_predictions, get_match_detail, get_nba_player_props (predictions); get_current_ratings (ratings); get_model_performance (performance); get_model_calibration (calibration); list_sports, list_models (catalog). The agent decides when and how to call them.

Available Models

Each prediction includes an expected value and a full probability distribution across discrete outcome buckets.

NBA Winner · Spread · Total Points · Player Props (Points / Rebounds / Assists / 3PM)

Real response from GET /v1/predictions/nba/{match_id}. players array contains one entry per projected player with four count distributions each (PMFs over 0…50+ per stat). Truncated for readability.

{
  "match_id" "DET_202605130_CLE.csv"
  "sport" "nba"
  "prediction_date" "2026-05-13"
  "season" 2026
  "home_team" {
    "name" "Detroit Pistons"
    "win_probability" 0.70023
  }
  "away_team" {
    "name" "Cleveland Cavaliers"
    "win_probability" 0.29977
  }
  "predicted_point_diff" 6.17137      // home - away, from dedicated Poisson spread regressor
  "predicted_total_points" 214.789   // from dedicated Poisson total regressor (migration 007)
  "players" [
    {
      "name" "Cade Cunningham"
      "team" "Detroit Pistons"
      "is_home" true
      "expected_points" 25.58
      "expected_rebounds" 5.53
      "expected_assists" 8.17
      "expected_three_pointers_made" 1.87
      "points_distribution" { "20" 0.0424 "25" 0.0430 "30" 0.0333 "..." }
      "rebounds_distribution" { "..." }
      "assists_distribution" { "..." }
      "three_pointers_made_distribution" { "..." }
    }
    // ... one entry per projected player
  ]
}
Football 1X2 · Over/Under 2.5 · BTTS · Corners · Shots · Goal Spread

Real response from GET /v1/predictions/football/{match_id}. The three probability families (1X2 / O·U / BTTS) come from independent classifiers — small numerical mismatches across them are by design. Audit each via /v1/calibration/football/<model_id>. Distributions truncated for readability.

{
  "match_id" "Girona_Sociedad_2026-05-14"
  "sport" "football"
  "league" "la_liga"
  "prediction_date" "2026-05-14"
  "season" "2025_2026"
  "home_team" "Girona"
  "away_team" "Sociedad"
  "probabilities" {
    "home_win" 0.428           // from 1X2 softmax classifier
    "draw" 0.251
    "away_win" 0.321
    "predicted_result" "H"
    "under_2_5" 0.529          // from INDEPENDENT over/under classifier
    "over_2_5" 0.471
    "predicted_under_over" "under_2_5"
    "btts_yes" 0.552           // from INDEPENDENT BTTS classifier
    "btts_no" 0.448
    "predicted_btts" "goal"
  }
  "expected_corners" 9.41
  "expected_shots" 25.22
  "expected_spread" 0.17           // home_goals - away_goals, sign carries direction
  "distributions" {
    "corners" { "7" 0.106 "8" 0.125 "9" 0.131 "10" 0.123 "..." }
    "shots" { "..." }
    "spread" { "..." }
  }
  "cdfs" { // same shape, cumulative "..." }
}
Tennis Winner · Total Games · Spread · Aces · Double Faults · Tiebreak · Exact Score

Real response from GET /v1/predictions/tennis/{match_id}. Player order is as observed in data ingestion — never winner-first canonicalised. Spread (player_one_games - player_two_games) and exact_score classes are oriented to that order. expected_aces / expected_double_faults are match totals, not per-player. Distributions truncated for readability.

{
  "match_id" "casper_ruud_vs_karen_khachanov_2026_rome.csv"
  "sport" "tennis"
  "date" "2026-05-06"      // tournament START date, NOT match day
  "season" "2026"
  "tournament" {
    "name" "rome" "location" "Italy"
    "surface" "clay" "type" "masters_1000" "round" 8
  }
  "player_one" { "name" "Casper Ruud"     "win_probability" 0.546 }
  "player_two" { "name" "Karen Khachanov" "win_probability" 0.454 }
  "predicted_total_games" 27          // round(expected_total_games)
  "expected_total_games" 26.71
  "predicted_result" "player_one_wins"
  "tiebreak" {
    "probability_yes" 0.418 "probability_no" 0.582 "predicted" "no_tiebreak"
  }
  "exact_score" {      // 10 classes; bo3 uses first 4, bo5 uses last 6
    "predicted" "2-0"
    "distribution" { "2-0" 0.366 "2-1" 0.204 "1-2" 0.194 "0-2" 0.235 "3-0" 0.0 "..." }
  }
  "expected_aces" 11.15            // match total
  "expected_double_faults" 3.72     // match total
  "expected_spread" 0.34           // player_one_games - player_two_games
  "distributions" {
    "total_games" { "24" 0.070 "25" 0.075 "26" 0.077 "27" 0.076 "..." }
    "spread" { "..." } "aces" { "..." } "double_faults" { "..." }
  }
  "cdfs" { // same shape, cumulative "..." }
}

Get started in code

Copy-paste-runnable snippets in Python and Java. Both call /v1/predictions/nba/upcoming?days=1 and print the top-of-card predictions. Set PREDIXSPORT_API_KEY as an environment variable first — mint one above (signed in) or via the setup guide.

Python requires pip install requests
import os
import requests

API  "https://api.predixsport.com"
HEADERS  {"Authorization" f"Bearer {os.environ['PREDIXSPORT_API_KEY']}"}

# Today's NBA games — NBA predictions land on game day (days=1 is the
# right horizon; days=14 returns 0 matches in steady state).
resp  requestsget(
    f"{API}/v1/predictions/nba/upcoming"
    headersHEADERS
    params{"days" 1}
    timeout10
)

if respstatus_code  429
    reset  respheaders"X-RateLimit-Reset-Date"
    raise SystemExit(f"Monthly quota exhausted, resets {reset}")
respraise_for_status()

for m in respjson()"matches"
    home away  m"home_team" m"away_team"
    print(
        f"{home['name']} ({home['win_probability']:.0%}) "
        f"vs {away['name']} ({away['win_probability']:.0%})"
    )
Java 11+ zero deps — uses built-in java.net.http.HttpClient
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;

public class PredixsportQuickstart {
    public static void main(String args) throws Exception {
        String key  System.getenv("PREDIXSPORT_API_KEY");
        HttpClient client  HttpClient.newHttpClient();

        // Today's NBA games — NBA predictions land on game day.
        HttpRequest req  HttpRequest.newBuilder()
            .uri(URI.create("https://api.predixsport.com/v1/predictions/nba/upcoming?days=1"))
            .header("Authorization" "Bearer "  key)
            .header("Accept" "application/json")
            .timeout(Duration.ofSeconds(10))
            .GET()
            .build();

        HttpResponseString resp  client.send(req HttpResponse.BodyHandlers.ofString());

        if (resp.statusCode()  429) {
            String reset  resp.headers().firstValue("X-RateLimit-Reset-Date").orElse("");
            System.err.println("Monthly quota exhausted, resets "  reset);
            System.exit(1);
        }
        if (resp.statusCode()  200) {
            throw new RuntimeException("HTTP "  resp.statusCode()  ": "  resp.body());
        }

        // JSON body — parse with Jackson, Gson, org.json or your preferred library.
        System.out.println(resp.body());
    }
}

Other languages — the API is plain HTTPS + JSON, so any HTTP client works. Browse the OpenAPI reference for the full surface and copy the cURL examples from there.

Coverage

NBA All regular season & playoffs
Football Serie A, Premier League, La Liga, Bundesliga, Ligue 1
Tennis ATP tour (all surfaces)

Models are trained on 30,000+ ATP and 40,000+ NBA historical matches. Predictions refresh after each matchday using ELO and Glicko-2 rating systems.

Need something specific?

Custom endpoints, additional leagues, or volume pricing — reach out directly.