Skip to main content

Overview

The Odds-API.io provides several endpoints for fetching odds data from multiple bookmakers. This guide covers best practices and common patterns for working with odds data.
For an up-to-date list of all supported bookmakers, visit odds-api.io/sportsbooks.

Basic Workflow

  1. Get available sports - Fetch the list of supported sports
  2. Get leagues - Retrieve leagues for your chosen sport
  3. Get events - Find upcoming or live events
  4. Get odds - Fetch odds from selected bookmakers

Fetching Odds for a Single Event

Use the /v3/odds endpoint to get odds for a specific event:
const apiKey = process.env.ODDS_API_KEY;
const eventId = 123456;
const bookmakers = ['Bet365', 'Unibet', 'SingBet'].join(',');

const response = await fetch(
  `https://api.odds-api.io/v3/odds?apiKey=${apiKey}&eventId=${eventId}&bookmakers=${bookmakers}`
);

const data = await response.json();
console.log(data);

Fetching Odds for Multiple Events

For better efficiency, use the /v3/odds/multi endpoint to fetch odds for up to 10 events in a single request:
const apiKey = process.env.ODDS_API_KEY;
const eventIds = [123456, 123457, 123458].join(',');
const bookmakers = ['Bet365', 'Unibet'].join(',');

const response = await fetch(
  `https://api.odds-api.io/v3/odds/multi?apiKey=${apiKey}&eventIds=${eventIds}&bookmakers=${bookmakers}`
);

const data = await response.json();
// Returns an array of event odds
console.log(data);
The multi-odds endpoint counts as only 1 API request regardless of how many events you fetch (up to 10).

Understanding the Odds Response

The odds response includes multiple markets for each bookmaker:
{
  "id": 123456,
  "home": "Manchester United",
  "away": "Liverpool",
  "date": "2025-10-15T15:00:00Z",
  "status": "pending",
  "bookmakers": {
    "Bet365": [
      {
        "name": "ML",
        "odds": [
          {
            "home": "2.10",
            "draw": "3.40",
            "away": "3.20"
          }
        ],
        "updatedAt": "2025-10-04T10:30:00Z"
      },
      {
        "name": "Asian Handicap",
        "odds": [
          {
            "hdp": -0.5,
            "home": "1.95",
            "away": "1.85"
          }
        ]
      },
      {
        "name": "Over/Under",
        "odds": [
          {
            "max": 2.5,
            "over": "1.90",
            "under": "1.90"
          }
        ]
      }
    ]
  }
}

Market Types

  • ML - Match result (Home, Draw, Away)
  • Spread - Handicap betting with fractional lines
  • Totals - Total goals/points over or under a line
  • Both Teams to Score - Yes/No markets
  • Correct Score - Exact score predictions
  • And many more…

Finding the Best Odds

Here’s an example of comparing odds across bookmakers to find the best value:
function findBestOdds(oddsData) {
  const market = 'ML';
  const bestOdds = {
    home: { bookmaker: null, odds: 0, link: null },
    draw: { bookmaker: null, odds: 0, link: null },
    away: { bookmaker: null, odds: 0, link: null }
  };

  for (const [bookmaker, markets] of Object.entries(oddsData.bookmakers)) {
    const marketML = markets.find(m => m.name === market);
    if (!marketML?.odds[0]) continue;

    const odds = marketML.odds[0];

    if (parseFloat(odds.home) > bestOdds.home.odds) {
      bestOdds.home = {
        bookmaker,
        odds: parseFloat(odds.home)
      };
    }

    if (odds.draw && parseFloat(odds.draw) > bestOdds.draw.odds) {
      bestOdds.draw = {
        bookmaker,
        odds: parseFloat(odds.draw)
      };
    }

    if (parseFloat(odds.away) > bestOdds.away.odds) {
      bestOdds.away = {
        bookmaker,
        odds: parseFloat(odds.away)
      };
    }
  }

  return bestOdds;
}

// Usage
const bestOdds = findBestOdds(oddsData);
console.log('Best home odds:', bestOdds.home.odds, 'at', bestOdds.home.bookmaker);

Getting Updated Odds

For real-time applications, use the /v3/odds/updated endpoint to fetch only odds that have changed:
const apiKey = process.env.ODDS_API_KEY;
const since = Math.floor(Date.now() / 1000) - 60; // Last 60 seconds
const bookmaker = 'Bet365';
const sport = 'Football';

const response = await fetch(
  `https://api.odds-api.io/v3/odds/updated?apiKey=${apiKey}&since=${since}&bookmaker=${bookmaker}&sport=${sport}`
);

const updatedOdds = await response.json();
The since parameter must be a UNIX timestamp no older than 1 minute.

Caching Strategies

To optimize performance and reduce API calls:
  1. Cache event lists for 5-10 minutes
  2. Cache pre-match odds for 30-60 seconds
  3. Cache live odds for 5-10 seconds
  4. Use updated odds endpoint for incremental updates
// Example caching with Node.js
const cache = new Map();
const CACHE_TTL = 60000; // 60 seconds

async function getCachedOdds(eventId) {
  const cacheKey = `odds:${eventId}`;
  const cached = cache.get(cacheKey);

  if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
    return cached.data;
  }

  const data = await fetchOdds(eventId);
  cache.set(cacheKey, { data, timestamp: Date.now() });

  return data;
}

Best Practices

Select only the most relevant bookmakers for your users. See the full list of supported bookmakers.
Batch requests using /v3/odds/multi to reduce API calls and stay within rate limits.
Cache odds data appropriately based on match status (pre-match vs live).
Not all bookmakers offer all markets. Always check if data exists before accessing it.

Next Steps

Value Bets

Learn how to identify profitable betting opportunities

WebSockets

Get real-time odds updates via WebSocket connections