Tennis Data API

Professional tennis analytics API built on 1.6 million historical matches. Elo ratings, win probabilities, serve/return metrics, pressure indices, and trading signals for ATP and WTA tours.

Get API Key Try Interactive Docs
bash # Get today's trading signals curl -H "X-API-Key: fb_your_key" \ https://api.fault.bet/v1/signals/today # Response { "status": "ok", "data": [{ "tournament": "Roland Garros", "player1": "Carlos Alcaraz", "player2": "Jannik Sinner", "p1_win_probability": 0.5823, "p1_fair_odds": 1.72, "confidence": 0.847, "recommended_stake_pct": 2.5 }] }
1.6M+
Historical Matches
160+
Features Per Match
11
API Endpoints
ATP + WTA
Full Tour Coverage

API Endpoints

RESTful JSON API with consistent response format, proper error handling, and rate limiting. All endpoints require an API key via the X-API-Key header.

GET /v1/signals/today

Today's value trading signals with edge %, confidence score, and recommended staking. Includes Elo-based and surface-adjusted win probabilities.

GET /v1/matches/today

All matches scheduled for today with model win probabilities for both players.

GET /v1/match/{match_id}/probability

Detailed win probability breakdown for a specific match, including H2H, pressure metrics, fatigue, and weather conditions.

GET /v1/player/{name}

Complete player profile with Elo ratings (overall + surface), rolling serve/return stats, EWMA metrics, pressure indices, weather splits, and fatigue data.

GET /v1/player/{name}/matches

Recent match history for a player with full serve statistics. Filter by surface. Up to 50 matches.

GET /v1/rankings/elo

Top players ranked by Elo rating. Filter by tour (ATP/WTA) and surface (Hard/Clay/Grass). Includes momentum indicators.

GET /v1/tournament/{name}/matches

All matches for a specific tournament with results, scores, and player data.

GET /v1/player/{name}/history

Full historical feature time series for a player from 2022 onwards. Elo trajectories, form curves, and all computed metrics over time.

GET /v1/data/features/export

Bulk export of computed match features (160+ columns). JSON or CSV format. Paginated up to 10,000 rows per request.

GET /v1/data/matches/export

Bulk match data export with results, scores, and metadata. JSON or CSV.

GET /v1/data/stats/export

Bulk serve and return statistics export. Match-level data with all serve metrics. JSON or CSV.

Pricing

Two ways to access fault.bet data. API for real-time integration, CSV for analysis and model building.

Data CSV Downloads
40+ stats per player · Elo, serve, pressure, weather · Updated at download
Bulk packages: download any combination of ATP/WTA per download

Sample player data (Jannik Sinner)

elo_overall: 2155.96
welo_overall: 2359.77
welo_delta_8w: +79.94
hold_pct_20w: 99.2%
break_pct_20w: 33.9%
ace_rate_20w: 1.04/game
first_serve_pct: 66.0%
bp_saved_pct: 95.7%
return_pts_won: 47.0%
choke_index: 0.065
closing_rate: 93.6%
tiebreak_win_pct: 44.4%
hold_pct_windy: 93.8%
hold_pct_calm: 88.2%
ace_rate_cold: 0.44/game
hold_pct_indoor: 89.5%
hold_pct_outdoor: 87.5%
matches_played: 31
+ 22 more columns including surface-specific Elo, EWMA trends, deciding set record, weather splits...

Documentation

Everything you need to integrate the fault.bet Tennis Data API into your application.

Quick Start

1. Get your API key

Subscribe to a plan above. Your API key (starting with fb_) will be emailed to you immediately.

2. Make your first request

bash # Get today's match probabilities curl -H "X-API-Key: fb_your_key_here" \ https://api.fault.bet/v1/matches/today

3. Python example

python # pip install requests import requests API_KEY = "fb_your_key_here" BASE = "https://api.fault.bet/v1" headers = {"X-API-Key": API_KEY} # Today's signals signals = requests.get(f"{BASE}/signals/today", headers=headers).json() for s in signals["data"]: print(f"{s['player1']} vs {s['player2']}: {s['p1_win_probability']:.1%}") # Player profile player = requests.get(f"{BASE}/player/Carlos Alcaraz", headers=headers).json() print(player["data"]["ratings"]) # Bulk data export (Tier 3) features = requests.get( f"{BASE}/data/features/export", headers=headers, params={"tour": "atp", "format": "csv", "limit": 5000} ) with open("features.csv", "w") as f: f.write(features.text)

4. JavaScript example

javascript const API_KEY = "fb_your_key_here"; const BASE = "https://api.fault.bet/v1"; // Fetch today's matches const res = await fetch(`${BASE}/matches/today`, { headers: { "X-API-Key": API_KEY } }); const { data } = await res.json(); data.forEach(m => { console.log( `${m.player1.name} vs ${m.player2.name}: ` + `${(m.p1_win_probability * 100).toFixed(1)}%` ); });

Authentication

All API requests require an API key sent via the X-API-Key header. Keys start with fb_ and are tied to your subscription tier.

X-API-Key: fb_abc123def456...

Response Format

All responses follow a consistent JSON structure:

json { "status": "ok", // "ok" or "error" "data": { ... }, // response payload "meta": { // optional metadata "count": 42, "date": "2026-04-21" } }

Rate Limits

Tier Daily Limit Rate Header
Signals (Tier 1)1,000 calls/dayX-RateLimit-Remaining
Analytics (Tier 2)5,000 calls/dayX-RateLimit-Remaining
Full Data (Tier 3)10,000 calls/dayX-RateLimit-Remaining

Rate limits reset at midnight UTC. The X-RateLimit-Remaining response header shows your remaining calls for the day.

Error Codes

Code Meaning
401Missing or invalid API key
403Subscription inactive or tier insufficient
404Resource not found (player, match, tournament)
429Daily rate limit exceeded
500Internal server error

Data Coverage

  • Historical match data from 2022 onwards (features export)
  • Full ATP and WTA tour coverage
  • 160+ computed features per match including Elo, EWMA, rolling stats, pressure metrics, weather splits, fatigue, H2H, and more
  • Daily updates with new match results and recalculated features
  • Win probabilities based on surface-adjusted Elo ratings

Interactive Documentation

Full interactive API documentation with "Try it out" functionality is available at:

  • Swagger UI — Interactive API explorer
  • ReDoc — Clean reference documentation
  • OpenAPI Spec — Machine-readable specification (JSON)

What Makes This Data Different

Not just match results. Engineered features built for predictive modelling and trading.

Elo + Weighted Elo

Surface-specific Elo and recency-weighted Elo (WElo) ratings. 8-week momentum delta tracks form shifts in real time.

Pressure Metrics

Choke index, lead-lost rate, closing rate, tiebreak win %, and deciding set win % quantify mental performance under pressure.

Weather-Adjusted Splits

Hold % in wind vs calm, ace rate in cold vs warm, indoor/outdoor performance splits based on real match-day conditions.

Rolling Windows

10-week, 20-week, 52-week rolling serve/return stats plus EWMA smoothing for stable trend detection without lag.

H2H Intelligence

Head-to-head win %, surface-specific H2H, recent form H2H, mental edge scoring, and last-3 match momentum.

Fatigue Modelling

Days rest, sets played over 7d/14d, travel distance, timezone crossings, consecutive tournaments, and fatigue cascade scoring.

Terms of Use

By using the fault.bet Tennis Data API, you agree to the following terms:

  • API keys are personal and non-transferable. Do not share your key.
  • Data is provided for informational and analytical purposes only. It does not constitute gambling advice.
  • You may use API data in your own applications, models, and analyses.
  • You may not redistribute raw API data as a competing data product.
  • We reserve the right to revoke access for abuse or violation of these terms.
  • Uptime target is 99.5%. Scheduled maintenance windows will be communicated in advance.

For questions, contact [email protected].