Discover/Qzz API
live

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.

This API takes change requests — .
Endpoints
3
Verified account required
Updated
8d ago

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.

This call costs1 credit / call— charged only on success
Try it

No input parameters required.

api.parse.bot/scraper/35190916-a0c4-442c-8cb9-163a5f699ca3/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/35190916-a0c4-442c-8cb9-163a5f699ca3/get_fixtures' \
  -H 'X-API-Key: $PARSE_API_KEY'
Python SDK · recommended

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()
All endpoints · 3 totalmissing one? ·

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.

Input

No input parameters required.

Response
{
  "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.

Reliability & maintenance

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?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Rank upcoming soccer fixtures by expected value using the ev_percent field from match reports
  • Track a betting model's historical accuracy by parsing win/loss records and profit/loss from get_picks
  • Filter get_fixtures results by stability index to identify lower-variance betting opportunities
  • Pull BTTS probability and expected goals from get_match_report to inform over/under markets
  • Monitor bankroll progression over time using the stats object returned by get_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
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo1005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 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.

Frequently asked questions
Does TraceOdds have an official developer API?+
TraceOdds (traceodds.qzz.io) does not publish an official developer API or documented public endpoints. This Parse API provides structured access to the data available on that site.
What does `get_match_report` return beyond a simple pick recommendation?+
Beyond the 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`?+
Call 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?+
Currently the API covers soccer fixtures and picks. All fixture and pick data reflects pre-match analysis; no live in-play odds or real-time score updates are returned. You can fork this API on Parse and revise it to add endpoints targeting other sports or live data if the source exposes them.
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.
Page content last updated . Spec covers 3 endpoints from traceodds.qzz.io.
Related APIs in SportsSee all →
transfermarkt.com API
Search Transfermarkt for football players and retrieve detailed player profiles, transfer histories, market value timelines, performance stats, and club squad/club information.
nhl.com API
Access data from nhl.com.
opendota.com API
Access detailed Dota 2 match statistics, player performance metrics, hero win rates, and professional tournament data to analyze gameplay trends and competitive performance. Search for specific players, explore custom data queries through SQL, and retrieve comprehensive match histories to improve your understanding of the game.
flashscore.com API
Search teams and competitions, pull daily fixtures and live scores, and retrieve match details including events, statistics, and league standings from FlashScore.
basketball-reference.com API
Access data from basketball-reference.com.
hltv.org API
Access Counter-Strike esports data from HLTV.org including match results, player and team statistics, team rankings, upcoming match schedules, tournament information, and fantasy league data.
op.gg API
Look up detailed League of Legends and TFT player statistics, match history, and champion performance data to analyze gameplay and track competitive standings. Search summoner profiles, review leaderboards, and monitor how specific champions perform across different skill levels.
livescore.com API
Track live scores and detailed statistics across football, hockey, basketball, tennis, and cricket with the ability to filter by date, sport, and league. Access match summaries, team overviews, standings, fixtures, and results to stay updated on your favorite competitions and teams.