Live Scores & Sports Data API
A live scores and sports data API with real-time scores, box scores, player and team stats, and schedules across 28+ sports, with odds in the same schema.
- 1Render the live scoreboard
Query getEvents (add live=true for in-progress games) and read teams.home and teams.away, the scores.home and scores.away tally, and the status flags to label each card Upcoming, Live, or Final.
- 2Build box scores and player cards
Resolve each playerID through the event's players map to a name and teamID, and pair it with player and team stats on the event to assemble box scores and player cards.
- 3Show schedules and final results
Filter startsAfter and startsBefore for upcoming games, then re-query with finalized=true for the final scores, paging through a full slate with cursor and nextCursor.
A live scores API returns the current and final score of a game, along with the status, teams, and stats around it, as the action happens, so an app or widget can show results without a human updating them. SportsGameOdds gives you that in one feed. Each /events object carries teams.home/teams.away, live scores.home/scores.away, status.started/status.ended/status.finalized, a per-market score for settling picks, and players.<playerID> for box-score detail across 28+ sports and 67+ leagues, and odds ship in the very same schema.
Why use SportsGameOdds for live scores
- Scores, status, and teams in one object. Every event returns
teams.homeandteams.awaywith theirnames, the livescores.home/scores.awaytally, and an event-levelstatusblock (status.started,status.ended,status.finalized). OnegetEventscall renders a full scoreboard row. - Box scores from
players.<playerID>and stats. Theplayersmap resolves eachplayerIDto itsnameandteamID, and player and team stats hang off the same event, so you build box scores and player cards without a second stats vendor. - Schedules and results from the same feed. Filter
startsAfter/startsBeforefor upcoming fixtures, then re-query withfinalized=truefor settled results. Pre-match schedule, live scoreboard, and final box score all come fromgetEvents. - Metadata endpoints fill in the rest.
getSports,getLeagues,getTeams,getPlayers, andgetStatsgive you sport, league, team, and player reference data (teamnames,colors, and identifiers) to power navigation, logos, and filters. - Odds and results share one schema. The same call that shows the score also carries
fairOdds,bookOdds, and per-book prices underbyBookmaker, so an editorial page or widget can add a line or settle a pick without integrating a separate odds API. - Normalized IDs across every sport. A consistent
eventID,teamID,playerID, andoddIDdescribe the same entity everywhere, so your scoreboard code stays identical whether you render NFL, NBA, or soccer.
How a live-scores app works with our data
Anyone can lay out a scoreboard. What's hard in a scores product is keeping clean, normalized results flowing across every sport in real time. Here's how the schema maps to each piece.
Render the live scoreboard
Query getEvents for a league (add live=true to scope to in-progress games) and read teams.home/teams.away for the matchup, scores.home/scores.away for the running score, and status for game state. status.started tells you a game is in progress, status.ended that play is over, and status.finalized that results are settled. That's enough to label a card Upcoming, Live, or Final without any second source.
Build box scores and player cards
For player-level detail, the event's players map resolves each playerID to a name, firstName/lastName, and teamID. Pair that with player and team stats on the event to assemble box scores, leaderboards, and player cards, then use getPlayers or getTeams to hydrate reference data like team names and colors for your layout.
Show schedules and final results
The same endpoint powers your schedule grid: filter startsAfter and startsBefore for upcoming events (games), then re-query the same eventIDs with finalized=true once they end to pull the final scores and each market's settled score. Pagination via cursor and nextCursor walks a full slate, so a season schedule and its results come from one feed.
Example request
Fetch recent finalized NFL games with their scores and results in one call:
curl "https://api.sportsgameodds.com/v2/events?leagueID=NFL&finalized=true" \
-H "x-api-key: YOUR_API_KEY"
A trimmed event shows the matchup, game status, and a market's score, everything a scoreboard needs:
{
"eventID": "4lronEc61vA9pcyqoRIa",
"leagueID": "NFL",
"teams": {
"home": { "names": { "long": "Houston Texans" } },
"away": { "names": { "long": "Buffalo Bills" } }
},
"status": {
"started": true,
"ended": true,
"finalized": true,
"displayLong": "Final"
},
"scores": { "home": 27, "away": 24 },
"odds": {
"points-home-game-ou-over": {
"oddID": "points-home-game-ou-over",
"started": true,
"ended": true,
"score": 27
}
},
"players": {
"JOSH_ALLEN_1_NFL": { "name": "Josh Allen", "teamID": "BUFFALO_BILLS_NFL" }
}
}
Here status.ended and status.finalized mark the game as Final, scores gives the 27-24 line score, the home-points market's score of 27 settles that market, and players resolves each playerID for the box score. That's live scores and final results without a second API. See the docs and the fetching teams guide for the full reference data behind names, colors, and IDs.
SportsGameOdds vs building it yourself
| What you need | SportsGameOdds | Stitch scores + stats + odds yourself |
|---|---|---|
| Live scores | scores.home/scores.away + status.started/ended/finalized | Scrape or license a scores feed per sport |
| Box scores & player stats | players.<playerID> plus player/team stats on the event | A separate stats API to match and reconcile |
| Schedules | startsAfter/startsBefore on getEvents | A third schedule source to integrate |
| Metadata | getSports/getLeagues/getTeams/getPlayers | Maintain your own teams, players, and logos |
| Odds in the same schema | Yes: fairOdds, bookOdds, byBookmaker alongside the score | A separate odds API and a join layer |
| Normalized IDs | One eventID/teamID/playerID across every sport | Reconcile IDs and team names per source |
| Maintenance | One feed, one schema, one key | Re-fix breakage as each source changes |
You can stitch this together yourself, and it gives you full control. The real cost shows up later: you wire up a separate scores feed, a stats feed, and a metadata source per sport, then keep them aligned as each one quietly changes. SportsGameOdds pre-assembles that layer so you spend your time on the product.
Frequently asked questions
Related use cases
- Sports Odds API for Betting Apps: odds, scores, and settlement in one feed.
- Odds API for Bet Tracking & Settlement: grade picks from the same
scorefield. - Live & In-Play Odds API: real-time odds alongside live scores.
- NFL odds & data: scores, stats, and markets for the NFL.
- Fetching teams guide: team names, colors, and IDs for your scoreboard.
- Pricing: per-event-object plans, including a free tier.
Build with live scores & sports data
Free plan available. Set up in 5 minutes. No credit card required.