FAQ - Common Questions and Troubleshooting
Common questions about using the SportsGameOdds API. Don't see your question? Contact us or join our Discord.
Overview
What is an odds API?
An odds API is a programmatic interface that delivers real-time and historical sports betting odds — moneylines, spreads, totals, and player props — from sportsbooks directly into your app. Unlike a sports stats API, an odds API focuses on bookmaker prices and lines. SportsGameOdds provides all of this through one REST and WebSocket API, with live scores and settlement data included.
What is SportsGameOdds?
SportsGameOdds is a REST API that delivers real-time betting odds, scores, stats, and settlement data from %numBookmakersPlus% sportsbooks across %numLeaguesPlus% leagues and %numSportsPlus% sports. Instead of scraping bookmakers yourself, you get clean, structured data through simple API calls — updated every 30–60 seconds with moneylines, spreads, totals, player props, alternate lines, and more.
What sports, leagues, and bookmakers do you cover?
We cover %numLeaguesPlus% leagues across %numSportsPlus% sports — including NFL, NBA, MLB, NHL, UFC, EPL, La Liga, Champions League, and many more — with odds from %numBookmakersPlus% bookmakers like DraftKings, FanDuel, BetMGM, Pinnacle, Bet365, and PrizePicks. We're continuously adding coverage.
Does the API include sharp bookmakers like Pinnacle?
Yes. SportsGameOdds aggregates odds from %numBookmakersPlus% bookmakers, including sharp books like Pinnacle alongside major sportsbooks such as DraftKings, FanDuel, BetMGM, Bet365, and Caesars. We also include DFS pick'em lines from PrizePicks and Underdog, plus prediction-market prices from Kalshi and Polymarket — all normalized into one consistent schema.
What types of betting data do you provide?
We provide pre-match and live odds across all major bet types: moneylines, spreads, over/unders, 3-way moneylines, player props, team props, alternate lines, and more — for full game, halves, quarters, and other periods. We also provide live scores, box scores, team and player stats, market settlement/outcomes, consensus odds with vig removed, and deeplinks to bookmaker bet slips.
How accurate and fast is your odds data?
Odds accuracy is 99.9%+ via direct bookmaker feeds, scores and stats are 99.5%+ verified against official sources, and event metadata is 99.9%+. Odds update every 30–60 seconds on average, with near-instant streaming updates available on the AllStar plan.
How does your pricing compare to other odds APIs?
We charge per event, not per market or bookmaker. A single NBA game with 100 markets across 20 bookmakers costs 1 object — compared to potentially 2,000 units with per-market pricing from competitors. This makes SportsGameOdds 60–80% cheaper for most use cases, with fully predictable billing. We also offer an perpetually free tier.
Is there a free tier I can start with?
Yes! Our free Amateur plan includes 10 requests per minute, 2,500 objects per month, and full access to all sports, leagues, and bookmakers. It's perfect for prototyping and evaluating the API.
How quickly can I integrate the API?
Most developers are up and running within a few hours. We provide official SDKs for JavaScript, Python, Ruby, Go, and Java, plus a quickstart guide with code examples. Sign up, get your API key instantly, and make your first request in minutes.
Getting Started
How do I get an API key?
Sign up, select a plan (free tier available), and your API key will be delivered to your email immediately.
How do I authenticate my requests?
Include your API key in one of two ways: as a header (recommended) using x-api-key: YOUR_API_KEY, or as a query parameter using ?apiKey=YOUR_API_KEY. The header method is recommended because it keeps your API key out of URL logs.
What's the fastest way to make my first API call?
Check out our quickstart guide for step-by-step instructions with code examples in JavaScript, Python, Ruby, PHP, Java, and more. You'll be up and running in minutes.
Do you have SDKs?
Yes! Official SDKs are available for TypeScript/JavaScript (npm install sports-odds-api), Python (pip install sports-odds-api), Ruby (gem install sports-odds-api), Go, and Java. SDKs include auto-pagination, type safety, retry logic, and error handling.
Do you have a Postman collection?
Yes, you can download the Postman Collection JSON file from our Postman Collection page.
Can I use the API in my frontend/browser?
Not recommended, as this exposes your API key publicly. Instead, create a backend proxy that makes API calls on behalf of your frontend, or set up a server-side process that syncs data to your database and have the frontend query that instead.
Data & Coverage
Do you provide live/in-play odds?
Yes! We provide live odds for games currently in progress. Use the live=true parameter to filter for only live games, e.g., /events?leagueID=NBA&live=true.
Do you support player props?
Yes! We provide extensive player prop coverage across all major sports — points, assists, rebounds, passing yards, strikeouts, and many more. Props include settlement data with actual player performance values so you can determine outcomes programmatically.
Do you provide alternate lines?
Yes, we support alternate lines on both main markets and prop bets including player props. Add the includeAltLines=true parameter when making a request to the /events endpoint. In general, you're more likely to receive alt lines on larger and more popular markets and sportsbooks. Note that alt lines significantly increase response size, so only include them when needed.
Does your API include scores, stats, and game results?
Yes. We provide live scores, box scores (scores by period), team stats, and player stats for virtually all supported leagues. We also provide settlement/outcome data for odds markets — every odds item includes a score field reflecting the actual result, so you can determine bet outcomes programmatically.
Do you have deeplinks to bookmakers?
Yes we do. However, we don't guarantee that every market for every bookmaker will include a deeplink. Each event includes event-level deeplinks in links.bookmakers, and individual odds include bookmaker-specific deeplinks. We're continuously adding more deeplink coverage across bookmakers.
Do you offer historical odds data?
Yes, but availability can vary. Depending on your plan, you may have access to up to 2 years of historical data. We're expanding historical data access in phases: first event metadata and final team scores, then team and player stats with main market opening/closing odds, then prop markets and bookmaker-specific odds. Use the startsAfter and startsBefore parameters to query historical events by date.
How do I see what markets are available for a given league?
Use the /markets endpoint to get the most up-to-date list of supported markets by league and bookmaker. The endpoint defaults to isSupported=true, returning fully supported markets.
Do you offer a Prediction Markets API?
Yes, as part of our odds API, we offer some prediction markets in one unified API. For example, Kalshim Polymarket and novig.
Pricing
What are "objects" and "requests"?
A single request is counted as 1 each time you make a call to our API regardless of how much data was returned. An object represents the top-level items returned in a request. So for example if you make a call to the /events endpoint and it returns 10 events, that counts as 10 objects. Unlike other APIs which charge you for each odds market + bookmaker returned, SportsGameOdds lets you get as many odds and bookmakers as you want and only charges you once per game.
How many "objects" or "requests" do I need?
This depends heavily on your use case. Here are broad rules of thumb: A few hundred to a few thousand objects for local development. Tens of thousands to hundreds of thousands for small personal projects. Hundreds of thousands for production apps serving real customers. Millions for production apps that sync data frequently across many leagues. Check the /account/usage endpoint to track your current usage.
Why is SportsGameOdds cheaper than competitors?
Our pricing model charges per event, not per market or bookmaker. A single NBA game with 100 markets across 20 bookmakers costs 1 object with SportsGameOdds vs. potentially 2,000 units with per-market-per-bookmaker pricing. This means 60-80% lower costs, predictable billing, and no need to optimize which data you fetch.
What are the rate limits for each plan?
Rate limits vary by plan tier. The free Amateur plan includes 10 requests/min and 2,500 objects/month. Paid plans (Rookie, Pro, AllStar) offer progressively higher limits up to unlimited. Check your current usage with the /account/usage endpoint.
What happens if I exceed my rate limit?
You'll receive a 429 Too Many Requests error. Rate limits reset at the start of each interval. To handle this: wait and retry, check which limit you hit using /account/usage, optimize requests using filters to reduce object count, or upgrade your plan if consistently hitting limits. The response includes a Retry-After header indicating when to retry.
How do I check my current usage?
Call the /account/usage endpoint. It returns your current request counts and object counts across all rate limit intervals (per-minute, per-hour, per-month). This endpoint doesn't count against your rate limits.
How do I upgrade, downgrade, cancel, or update my billing?
Visit our account page, enter the email you signed up with, and you'll receive a link to access your subscription portal. From there you can manage your subscription and billing information. We're also happy to make changes for you — fill out our subscription form.
Technical
What is an oddID?
The oddID uniquely identifies a specific betting option using the format: {statID}-{statEntityID}-{periodID}-{betTypeID}-{sideID}. For example, points-home-game-ml-home is the moneyline on the home team (full game), points-all-game-ou-over is the total points over (full game), and assists-LEBRON_JAMES_NBA-game-ou-over is LeBron assists over (player prop).
What's the difference between fairOdds and bookOdds?
fairOdds are consensus odds with juice/vig removed, representing true probability. bookOdds are consensus odds across bookmakers with juice included. Use fairOdds to calculate true implied probability and compare individual bookmaker odds (in the byBookmaker object) to find value bets.
What are the different bet types (betTypeID)?
The main bet types are ml (moneyline), sp (spread), ou (over/under), ml3way (3-way moneyline for soccer), yn (yes/no), and eo (even/odd). Each bet type has associated sideIDs — for example, ml has home and away sides, ou has over and under sides.
What does statEntityID mean?
statEntityID identifies who a stat applies to: home (home team), away (away team), all (combined/total), or a specific playerID for player props (e.g., LEBRON_JAMES_NBA).
What are the different periodIDs?
periodID defines the time segment of a game: game (full game), reg (regulation only), 1h/2h (halves), 1q-4q (quarters), 1p-3p (hockey periods), 1i-9i (innings), 1s-5s (tennis sets), and ot (overtime). Available periods vary by sport.
Why does "points" mean different things in different sports?
The statID of "points" represents the primary scoring stat used to determine the winner — actual points in basketball/football, runs in baseball, goals in hockey/soccer, and sets in tennis. This allows consistent querying across sports (e.g., points-home-game-ml-home works for any sport). Sport-specific stats like goals or runs are also available.
How do I use pagination (cursor)?
Use cursor-based pagination for large result sets. The first request returns a nextCursor value. Pass that cursor to the next request: /v2/events?leagueID=NBA&limit=50&cursor={nextCursor}. Continue until nextCursor is null. Increase the limit parameter (default 10) to get more results per request. Cursors are opaque strings — don't parse or construct them.
How do I optimize API response times?
Use specific filters for smaller responses — more parameters means faster requests. Specify oddID when you only need specific markets. Avoid includeAltLines=true unless needed as it dramatically increases response size. Use appropriate date ranges with startsAfter/startsBefore. Cache responses since pre-game odds don't change frequently.
How often should I poll for odds updates?
Recommended polling intervals: 15-30 minutes for games 7+ days out, 5-15 minutes for games 24-48 hours out, 2-5 minutes on game day, 30-60 seconds for live in-game odds. For critical moments, use the streaming API (AllStar plan). Cache data longer for distant games — many markets aren't offered until 24-48 hours before gametime.
How does the real-time streaming API work?
The Streaming API (AllStar plan) uses WebSockets via the Pusher protocol for instant updates. Three feeds are available: events:live (all live games), events:upcoming (upcoming by league), and events:byid (specific event updates). Get connection details from /v2/stream/events, connect via WebSocket, receive eventID notifications when data changes, then fetch updated data via /v2/events.
Why are my filters ignored when I pass eventID?
When you provide eventID or eventIDs, the API uses only those IDs to fetch results. All other query filters — sportID, leagueID, live, started, finalized, startsAfter, startsBefore, etc. — are ignored. This is by design for optimal query performance. Response-shaping parameters like oddID, bookmakerID, playerID, includeAltLines, and includeOpposingOdds still apply normally to the returned data.
Do I need sportID if I already have leagueID?
No. Since every league belongs to exactly one sport, providing leagueID makes sportID redundant. If you pass both, sportID is ignored. Using leagueID alone results in more targeted, faster queries.
Troubleshooting
Why am I getting a 401 error?
A 401 Unauthorized error means authentication failed. Common causes: missing the x-api-key header, whitespace in your API key (use trim()), wrong header name (must be exactly x-api-key in lowercase), or an old/revoked key. Make sure you're including the header correctly on every request.
Why am I getting a 403 error?
A 403 Forbidden error means your key lacks permission. Causes include: cancelled subscription, failed payment, trying to access a feature not in your plan (e.g., streaming requires AllStar), or using the wrong API version. Check the error message field for specifics.
Why am I getting a 429 error?
A 429 Too Many Requests error means you've exceeded rate limits. Wait for limits to reset (each minute/hour/month), check which limit you hit using /account/usage, optimize requests using filters to reduce objects returned, or upgrade your plan.
How should I handle errors in my code?
Implement retry logic with exponential backoff. For 429 errors, wait and retry after the Retry-After period. For other 4xx errors, don't retry — fix the request. For 5xx errors, retry with increasing delays.
Support
What if I need a league or bookmaker you don't currently support?
We can add additional leagues, regional bookmakers, and exchange data through custom plans. Most additions can be completed within 1-2 weeks.
Do you offer custom or enterprise plans?
Yes. If our standard plans don't fit your needs — whether you need higher rate limits, dedicated infrastructure, custom data feeds, additional leagues or bookmakers, or SLA guarantees — we'd love to talk.
Can I get a bulk or annual discount?
Yes, we offer discounts for annual commitments and high-volume use cases.
Do you offer real-time streaming or webhook-style updates?
Yes. Our AllStar plan includes a real-time streaming API using WebSockets that notifies you instantly when odds change, events start or finish, or scores update. Contact api@sportsgameodds.com to learn more or upgrade.
How do I report a data issue or request a feature?
Use the contact form or email api@sportsgameodds.com. For data issues, include the eventID if possible. We typically respond within one business day and resolve data issues within 1–2 weeks.
What level of support do you provide?
All plans include email support and access to our documentation. Paid plans receive priority response times. Enterprise customers get dedicated support with faster SLAs.