Qzz APItraceodds.qzz.io ↗
Access TraceOdds AI betting analysis via API: upcoming fixtures with value scores, historical pick results, and Dixon-Coles match reports across major soccer leagues.
What is the Qzz API?
The TraceOdds API exposes 3 endpoints that deliver AI-powered sports betting analysis from traceodds.qzz.io, covering upcoming match fixtures, historical pick records, and detailed per-match reports. The get_fixtures endpoint returns fixture objects with value index, stability index, expected value, and recommended picks for roughly the next 7 days across all tracked leagues. The get_match_report endpoint goes deeper, providing Dixon-Coles model predictions, expected goals, and BTTS probability for a specific match.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/35190916-a0c4-442c-8cb9-163a5f699ca3/get_fixtures' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace traceodds-qzz-io-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
TraceOdds AI Betting Analysis API Client
This module provides a client for accessing AI-powered sports betting analysis
from TraceOdds, including upcoming match fixtures, historical betting picks, and
detailed match analysis reports.
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Optional, Dict, Any, List
class ParseClient:
"""Client for interacting with the TraceOdds AI Betting Analysis API."""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for authentication. If not provided, reads from
PARSE_API_KEY environment variable.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "35190916-a0c4-442c-8cb9-163a5f699ca3"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError(
"API key not provided. Set PARSE_API_KEY environment variable "
"or pass api_key parameter."
)
def _call(
self,
endpoint: str,
method: str = "POST",
**params
) -> Dict[str, Any]:
"""
Make an API call to the Parse bot.
Args:
endpoint: The endpoint name to call
method: HTTP method ('GET' or 'POST')
**params: Parameters to send with the request
Returns:
Response JSON as dictionary
Raises:
requests.RequestException: If the API call fails
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {
"X-API-Key": self.api_key,
"Content-Type": "application/json"
}
if method.upper() == "GET":
response = requests.get(url, headers=headers, params=params)
elif method.upper() == "POST":
payload = params if params else {}
response = requests.post(url, headers=headers, json=payload)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status()
return response.json()
def get_fixtures(self) -> Dict[str, Any]:
"""
Get upcoming match fixtures across all tracked leagues.
Returns upcoming fixtures for approximately the next 7 days with
AI-computed value index, stability index, recommended picks, odds,
hit rates, and expected value.
Returns:
Dictionary containing 'fixtures' array and 'total' count
"""
return self._call("get_fixtures", method="GET")
def get_picks(self) -> Dict[str, Any]:
"""
Get current bankroll stats and recent betting history.
Returns the current bankroll statistics and recent betting history
(last ~50 picks) with match details, bet specifics, confidence scores,
results, and profit/loss amounts.
Returns:
Dictionary containing 'stats', 'history', and 'history_count'
"""
return self._call("get_picks", method="GET")
def get_match_report(self, match_id: str, league_key: str) -> Dict[str, Any]:
"""
Get detailed AI analysis report for a specific match.
Provides comprehensive AI analysis including Dixon-Coles model
predictions, expected goals, BTTS probability, EV calculations,
main pick recommendation, and pre-match intelligence.
Args:
match_id: Pipe-separated lowercase team names (e.g., 'spain|cape_verde')
league_key: League identifier key (e.g., 'soccer_fifa_world_cup')
Returns:
Dictionary containing detailed match analysis
"""
return self._call(
"get_match_report",
method="GET",
match_id=match_id,
league_key=league_key
)
def format_currency(value: str) -> str:
"""Format currency string for display."""
return value if isinstance(value, str) else f"${value}"
def print_bankroll_summary(stats: Dict[str, str]) -> None:
"""Print formatted bankroll summary."""
print("\n" + "=" * 60)
print("💰 BANKROLL SUMMARY")
print("=" * 60)
print(f"Current Bankroll: {stats['bankroll']}")
print(f"Total P&L: {stats['total_pnl']}")
print(f"Win/Loss Record: {stats['win_loss']}")
print(f"Unit Size: {stats['unit_size']}")
def print_fixture(fixture: Dict[str, Any]) -> None:
"""Print formatted fixture information."""
print(f"\n🎯 {fixture['label']}")
print(f" League: {fixture['league']}")
print(f" Kickoff: {fixture['commence']}")
print(f" Pick: {fixture['pick']} @ {fixture['odds']}")
print(f" Value Index: {fixture['value_index']} | Stability: {fixture['stability_index']}")
print(f" Expected Value: {fixture['ev']:+.2%} | Hit Rate: {fixture['hit_rate']}%")
def print_match_report_summary(report: Dict[str, Any]) -> None:
"""Print formatted match report summary."""
print("\n" + "=" * 60)
print(f"📊 {report['match']} - {report['league']}")
print("=" * 60)
print(f"Kickoff: {report['kickoff_info']}")
print(f"\n📈 Model Analysis:")
print(f" Main Pick: {report['main_pick']}")
print(f" Win Rate: {report['model_win_rate']}%")
print(f" Expected Value: {report['ev_percent']:+.1f}%")
print(f"\n⚽ Match Predictions:")
print(f" Home Expected Goals: {report['home_expected_goals']:.2f}")
print(f" Away Expected Goals: {report['away_expected_goals']:.2f}")
print(f" BTTS Probability: {report['btts_percent']}%")
print(f" Over 2.5 Goals: {report['over_2_5_percent']}%")
print(f"\n📝 Summary:\n{report['summary']}")
def main():
"""
Practical workflow example: Analyze upcoming fixtures and generate reports.
This workflow:
1. Fetches upcoming fixtures
2. Reviews current bankroll and recent picks
3. Gets detailed analysis for top-value fixtures
4. Displays actionable betting recommendations
"""
# Initialize client
client = ParseClient()
print("🚀 TraceOdds AI Betting Analysis - Practical Example")
print("=" * 60)
# Step 1: Get current bankroll and recent picks
print("\n📊 Fetching current bankroll and recent picks...")
picks_data = client.get_picks()
print_bankroll_summary(picks_data["stats"])
# Display recent picks summary
print(f"\n📋 Recent Picks Summary ({picks_data['history_count']} total):")
for pick in picks_data["history"][:5]: # Show last 5 picks
status = "✅" if pick["result"] == "赢一半" else "❌"
print(
f" {status} {pick['date']}: {pick['match']} "
f"→ {pick['bet_detail']} (Confidence: {pick['confidence']}%) "
f"Result: {pick['result']} P&L: {pick['pnl']}"
)
# Step 2: Get upcoming fixtures
print("\n\n🔍 Fetching upcoming fixtures...")
fixtures_data = client.get_fixtures()
total_fixtures = fixtures_data["total"]
print(f"Found {total_fixtures} upcoming fixtures")
# Filter and sort fixtures by value index (high value = best opportunities)
high_value_fixtures = sorted(
fixtures_data["fixtures"],
key=lambda x: x["value_index"],
reverse=True
)[:5] # Top 5 by value
print(f"\n🌟 Top 5 Highest Value Fixtures:")
for fixture in high_value_fixtures:
print_fixture(fixture)
# Step 3: Get detailed reports for top 2 fixtures
print("\n\n📈 Generating detailed analysis for top 2 fixtures...")
for fixture in high_value_fixtures[:2]:
try:
# Extract match_id and league_key from fixture
match_id = fixture["id"]
league_key = fixture["league_key"]
print(f"\n⏳ Analyzing {fixture['label']}...")
report = client.get_match_report(match_id, league_key)
print_match_report_summary(report)
except requests.RequestException as e:
print(f" ⚠️ Could not fetch report: {e}")
except KeyError as e:
print(f" ⚠️ Missing data field: {e}")
# Step 4: Summary and recommendations
print("\n\n" + "=" * 60)
print("📌 BETTING RECOMMENDATIONS SUMMARY")
print("=" * 60)
print(f"\n✨ Next Action Items:")
print(f" 1. Current Bankroll: {picks_data['stats']['bankroll']}")
print(f" 2. Review top 5 fixtures above for high-value opportunities")
print(f" 3. Focus on picks with Value Index > 80 and Stability > 60")
print(f" 4. Average unit size: {picks_data['stats']['unit_size']}")
print(f"\n💡 Pro Tip: Combine high value index with high stability for")
print(f" more consistent returns. Monitor EV percentages closely.")
print("=" * 60)
if __name__ == "__main__":
main()Get upcoming match fixtures across all tracked leagues with AI-computed value index, stability index, recommended picks, odds, hit rates, and expected value. Returns fixtures for approximately the next 7 days.
No input parameters required.
{
"type": "object",
"fields": {
"total": "integer",
"fixtures": "array of fixture objects with match details and AI scores"
},
"sample": {
"total": 61,
"fixtures": [
{
"ev": 0.16,
"id": "spain|cape verde",
"lean": "主推 客队+2.5",
"odds": 1.92,
"pick": "Cape Verde +2.5",
"label": "Spain vs Cape Verde",
"league": "世界杯",
"commence": "2026-06-15T16:00:00Z",
"hit_rate": 60,
"league_key": "soccer_fifa_world_cup",
"value_index": 84,
"stability_index": 61
}
]
}
}About the Qzz API
Upcoming Fixtures
The get_fixtures endpoint requires no inputs and returns a total count alongside a fixtures array. Each fixture object includes AI-computed scores such as value index, stability index, hit rate, expected value, and a recommended pick with associated odds. Coverage spans all leagues currently tracked by TraceOdds for approximately the next 7 days. This endpoint is the primary entry point for discovering which upcoming matches the model rates as high-value.
Historical Pick Performance
get_picks returns two top-level objects: stats and history. The stats object contains current bankroll, total profit/loss (total_pnl), win/loss record, and unit size. The history array holds the last ~50 resolved picks, each including match details, the specific bet placed, a confidence score, the final result, and profit/loss per pick. The history_count field gives the total number of picks in the returned set. This endpoint is useful for evaluating the model's documented track record before relying on its recommendations.
Detailed Match Reports
get_match_report accepts two required parameters: match_id, a pipe-separated lowercase string of team names (e.g. spain|cape verde), and league_key, a league identifier string (e.g. soccer_fifa_world_cup). Valid values for both parameters can be derived from the get_fixtures response. The report returns odds, match, league (in Chinese), summary, main_pick, ev_percent, btts_percent, model_win_rate, kickoff_info, and an ai_insights array of titled analysis sections. The Dixon-Coles model underpins the win rate and expected goals figures.
The Qzz API is a managed, monitored endpoint for traceodds.qzz.io — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when traceodds.qzz.io changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official traceodds.qzz.io API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Rank upcoming soccer fixtures by expected value using the
ev_percentfield from match reports - Track a betting model's historical accuracy by parsing win/loss records and profit/loss from
get_picks - Filter
get_fixturesresults by stability index to identify lower-variance betting opportunities - Pull BTTS probability and expected goals from
get_match_reportto inform over/under markets - Monitor bankroll progression over time using the
statsobject returned byget_picks - Build a fixture dashboard that surfaces only matches where the model's hit rate exceeds a threshold
- Correlate Dixon-Coles model win rate predictions against actual outcomes using historical pick data
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does TraceOdds have an official developer API?+
What does `get_match_report` return beyond a simple pick recommendation?+
main_pick string, the report includes ev_percent (expected value as a percentage), model_win_rate (Dixon-Coles predicted win rate), btts_percent (both-teams-to-score probability), kickoff_info, an AI summary, and an ai_insights array of titled analysis sections. The league field is returned in Chinese.How do I find valid `match_id` and `league_key` values for `get_match_report`?+
get_fixtures first. The fixture objects it returns contain the team names and league identifiers needed to construct match_id (pipe-separated lowercase team names, e.g. spain|cape verde) and league_key (e.g. soccer_fifa_world_cup). There is no separate lookup endpoint.Does the API cover sports other than soccer, or provide live in-play data?+
How far back does the pick history go?+
get_picks returns the last approximately 50 resolved picks. There is no pagination parameter to retrieve older records beyond that window. You can fork this API on Parse and revise it to add a paginated history endpoint if deeper historical access is needed.