API key Sign in, or get an instant trial key — no signup required.

Soccer

Soccer API for Scores, Odds & AI Agents

One event graph for club soccer — kickoff schedules, half-aware live scores, 3-way moneyline across 16 books, soccer-native stats, and intelligence where each league’s pipeline is live.

Available data

Filter with sport=soccer and a league slug when you care about one competition. Discover seasons with GET /v1/seasons?sport=soccer.

LayerEndpointSoccer notes
Schedule / boardGET /v1/eventssport=soccer + optional league
Live scoreGET …/score · SSE1H / 2H / ET* / PKs; clock e.g. 67'
OddsGET …/odds · history3-way h2h (+ Draw), spreads, totals
Team totalsGET …/team-propsEach team's full-game goals Over/Under + this-event score
Period oddsGET …/period-oddsFirst-half spreads/totals (native 1H)
Stats (Data)GET …/statsSoccer-native strength, form, H2H, rest, rates, lineups
IntelligenceGET …/intelligenceLive for MLS + big-five; UCL returns available: false
SplitsGET …/splitsNot available for soccer

Leagues

One page, many slugs. Use league= to narrow; omit it to list across soccer.

CompetitionSlugSchedules / scores / oddsIntelligence
MLSmlsYes (in season)Probability + Price surface
Premier LeagueeplYes (in season)Probability + Price surface
La Ligala_ligaYes (in season)Probability + Price surface
Serie Aserie_aYes (in season)Probability + Price surface
BundesligabundesligaYes (in season)Probability + Price surface
Ligue 1ligue_1Yes (in season)Probability + Price surface
UEFA Champions LeagueuclYes (in season)— / available: false

/stats is soccer-native across these competitions when aggregates resolve.

Schedules

GET /v1/events?sport=soccer — add league=mls (or epl, …). Narrow by status, date or from/to (max 90 days/request), paginate with after_id / limit.

Compound with include_odds=true / include_scores=true for matchday boards in one round trip.

Scores

Soccer period labels: "1H", "2H", "ET1", "ET2", "PKs". Clock examples: "45'+2", "67'".

  • GET /v1/events?sport=soccer&status=inprogress&include_scores=true
  • GET /v1/events/{id}/score — lightweight poll
  • GET /v1/events/{id}/stream — SSE or signed webhooks

Demo: live scoreboard use case.

Odds

Soccer moneyline is 3-way: home, away, and Draw under h2h. Spreads use Asian-style goal lines (e.g. -0.5 / +0.5). Totals are Over/Under. Default Pinnacle or bookmaker=all = 1 credit.

Player props: goals, assists, shots on target, and fouls committed — catalog. Soccer /odds stays 3-way moneyline / Asian handicap / totals. History: GET /v1/events/{id}/odds/history. Full books: Sports Odds API.

Stats (Data layer)

GET /v1/events/{id}/stats returns soccer-native team aggregates (strength, form, H2H, rest, rates, lineups). No confidence or narrative. Check available. Fields: API reference — stats.

Intelligence

  • MLS + big-five (EPL, La Liga, Serie A, Bundesliga, Ligue 1) — customer probability surface + Price overlay (probability / fair_price + fair / edges_by_book / best vs Pinnacle) and main-line ev (Beta). Outcomes in a market sum to 1. Framework plumbing omitted. best.edge is a line-shopping price gap vs Pinnacle. has_recommend stays false until Edge publishes.
  • UCL — schedules, scores, odds, and /stats today; intelligence returns available: false.

Tokens: ML_HOME, ML_AWAY, ML_DRAW, SPREAD_HOME, SPREAD_AWAY, OVER, UNDER.

Sportsbooks

Odds keys: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, westgate, wynn, south_point, stations, hardrock, betonline, betr, betrivers, lowvig. Bovada is not on soccer. Per-event availability varies — especially on EU club fixtures. MLS Price soft set is narrower than the full odds list; always read the payload.

Examples

MLS slate with odds:

curl
curl "https://lumify.ai/v1/events?sport=soccer&league=mls&status=scheduled&include_odds=true&limit=5" \
  -H "Authorization: Bearer YOUR_API_KEY"
Python
from lumify import Lumify

client = Lumify(api_key="YOUR_API_KEY")
page = client.events.list(
    sport="soccer",
    league="mls",
    status="scheduled",
    include_odds=True,
    limit=5,
)
for event in page["events"]:
    print(event["id"], event["name"])
TypeScript
import { Lumify } from "@lumifyai/sdk";

const client = new Lumify({ apiKey: "YOUR_API_KEY" });
const { events } = await client.events.list({
  sport: "soccer",
  league: "mls",
  status: "scheduled",
  includeOdds: true,
  limit: 5,
});
events.forEach(e => console.log(e.id, e.name));

Premier League weekend board:

curl
curl "https://lumify.ai/v1/events?sport=soccer&league=epl&status=scheduled&include_odds=true&limit=10" \
  -H "Authorization: Bearer YOUR_API_KEY"
Python
epl = client.events.list(
    sport="soccer",
    league="epl",
    status="scheduled",
    include_odds=True,
    limit=10,
)
TypeScript
const { events: epl } = await client.events.list({
  sport: "soccer",
  league: "epl",
  status: "scheduled",
  includeOdds: true,
  limit: 10,
});

Sample 3-way moneyline (abridged):

json
{
  "event_id": 9201,
  "available": true,
  "bookmakers": [
    {
      "bookmaker": "pinnacle",
      "markets": [
        {
          "key": "h2h",
          "label": "moneyline",
          "outcomes": [
            { "outcome": "Inter Miami CF", "price": 145, "point": null },
            { "outcome": "Draw", "price": 240, "point": null },
            { "outcome": "LAFC", "price": 175, "point": null }
          ]
        }
      ],
      "captured_at": "2026-08-10T18:00:00Z"
    }
  ]
}

Freshness

FeedCadenceFit
Live scores~1 minute (+ SSE/webhooks)Matchday boards
Odds ingest~10 minutes (2-min response cache)Research / agents — not HFT
StatsAfter aggregates resolveData layer for analysis
IntelligenceAfter publish / analysis runsMLS + big-five; UCL is available: false

Pricing

CallCredits
Most successful GETs (events, score, stats, intelligence, …)1
Multi-book odds (bookmaker=all or a list)1
available: false / errors0

Free Tier: 1,000 credits that never expire. Instant trial: 100 credits / 14 days, no signup. Details: /pricing.

For agents: machine-readable twin at /sports/soccer-api.md. MCP: list_events, get_odds, get_stats, get_intelligence, list_ev — /sports-mcp-server.

FAQ

What does the Soccer API include?

Filter with sport=soccer and optional league (e.g. mls, epl) for schedules, live scores (1H/2H/ET/PKs), teams/players, 3-way moneyline / Asian handicap / totals across 16 books, and soccer-native /stats. Predictive intelligence (bets[]) is live for MLS + the big-five (EPL, La Liga, Serie A, Bundesliga, Ligue 1). UCL returns available: false. No betting splits for soccer.

Why is soccer moneyline 3-way?

Soccer h2h includes Home, Away, and Draw. Intelligence tokens are ML_HOME / ML_AWAY / ML_DRAW (plus spreads and totals). ML_DRAW is match-level — team_id is null so you can sum exposure by team without double-counting the draw.

Does soccer have intelligence?

Yes for MLS + the big-five (EPL, La Liga, Serie A, Bundesliga, Ligue 1) — same probability / Price surface. UCL returns available: false. has_recommend stays false until Edge. Fields: API reference.

Do you have a separate Premier League API page?

Not yet. EPL, La Liga, Serie A, Bundesliga, Ligue 1, and UCL are sections of this page — filter with league=epl (etc.). Thin per-league micros ship only if Search Console shows distinct demand after this landing ranks.

Are soccer betting splits available?

No. Public ticket%/handle% splits cover MLB/NBA/NHL/NFL only. For soccer, use odds, /stats, and intelligence (where available) on the same event IDs.

Start with the Soccer API

Create a free key — or use an instant trial key with no signup — and list an MLS or EPL slate in under a minute.