Changelog

New endpoints, parameters and data — newest first. All changes are backwards-compatible; we add fields, we don't remove them.

October 2026

Clearer season errors

  • season_not_found now names the league's newest seasons (4 October), on /v1/standings and /v1/leagues/{id}/fixtures alike. Seasons are named as /v1/leagues/{id} lists them — 26/27 for leagues spanning two years, 2026 for calendar-year ones — and the standings reference no longer suggests a plain year for every league.

October 2026

Hong Kong Jockey Club

  • The Hong Kong Jockey Club (HKJC) is now a bookmaker: hkjc on GET /v1/bookmakers, ?bookmakers= on /v1/fixtures/{id}/odds and ?bookmaker= on /v1/fixtures/{id}/odds/history. It carries 1X2 (pre-match), Asian handicap and goal line (pre-match and in-play), each with opening and closing prices and the full timestamped movement in between. 1X2 history runs back to 2016, Asian handicap and goal line to late 2019; coverage follows the fixtures HKJC itself prices. Ultra, like every book beyond bet365.
  • Fix for every bookmaker other than bet365: when a book stops quoting in play (suspended around a goal, or closed for good) it records a tick with the line and prices at 0. /v1/fixtures/{id}/odds served such a tick as the in-play price whenever it was the latest one; each stage is now the last tick with a price, and a market with no priced tick at all is omitted. /v1/fixtures/{id}/odds/history keeps these ticks in place with line and prices null and "suspended": true, so the moment the book stopped quoting is still there.

September 2026

China Sports Lottery

  • New GET /v1/chinasportslottery (27 September): the /v1/fixtures window narrowed to matches on sale in China's state football lotteries — China Sports Lottery Jingcai (竞彩), Beijing Single Match (北单) and the Traditional football lottery (传统足球). Each row carries a lottery block with the official numbers (e.g. 周六016) and, for Jingcai, the official 1X2 opening and closing prices with the time of each quote; odds is null where a numbered match has no official price.
  • ?types=jingcailottery,beijingsingle,traditional picks the lotteries (default all three); anything else is a 400 invalid_types. Every other parameter, the order and the pagination are those of /v1/fixtures; esports is not accepted. Ultra and above.
  • The official Jingcai book is now also a bookmaker: chinasportslottery on GET /v1/bookmakers, ?bookmakers= on /v1/fixtures/{id}/odds and ?bookmaker= on /v1/fixtures/{id}/odds/history (1X2 only; Ultra, like every book beyond bet365).

September 2026

Fixed goal lines

  • GET /v1/fixtures/{id}/odds gains goal_line_fixed on the bet365 entry: the Over/Under ladder Bet365 quotes side by side (0.5, 1.5, 2.5 … 9.5), one entry per line with its own opening, closing and in-play prices. The existing goal_line is the single main line that moves; the ladder keeps every line open. Every plan that sees odds sees it. Lower leagues usually carry the 2.5 line only.
  • GET /v1/fixtures/{id}/odds/history accepts market=goalline_fixed and returns the whole ladder in one call (per_page defaults to 1000 there, enough for a full match), the page's ticks grouped per line under lines; ?line=2.5 narrows to one line. Ultra, like every other history market.
  • The ladder is recorded from 26 September 2026 — earlier fixtures return an empty ladder.

September 2026

Newest fixtures first

  • GET /v1/leagues/{id}/fixtures now returns fixtures newest kickoff first, so page 1 is the current season rather than the oldest data your plan can reach. It previously ran oldest first against the whole history window, which put the current season 95 pages out on Ultra and made a default call look a decade stale.
  • New ?order= parameter on /v1/leagues/{id}/fixtures and /v1/teams/{id}/fixtures — desc (default) or asc; anything else is a 400. Team fixtures were already newest first and are unchanged at the default.
  • For a stable crawl of a full history, pin the window with start_time/end_time: the plan history floor is relative to now, so it moves while you page, in either order.

September 2026

Fixture status: unknown

  • Fixtures carry a fourth status, unknown, for rows the feed lost: more than 4 hours past kickoff and never confirmed finished. A new status_reason field says which kind — kickoff_unconfirmed (never seen starting; typically postponed and rescheduled under a new id) or result_unconfirmed (seen running, no full-time mark). Previously these rows stayed scheduled or in_play forever. Clients that switch on the status value should handle the new one.
  • ?status= on /v1/fixtures and the league and team lists accepts unknown, and every filter now selects exactly the rows whose status field carries that label — ?status=scheduled no longer returns rows that will not start. status_code, the raw feed value, is documented for the first time. See the Fixture status guide.
  • /v1/leagues?include=seasons folds each league's seasons array into the list, so one page gives the valid ?season= values for every league on it instead of one /v1/leagues/{id} call each.

September 2026

League activity

  • Leagues carry last_fixture_utc / last_fixture_ts — the kickoff of the latest fixture on record for the competition, played or scheduled (null where the feed has none). Updated hourly.
  • /v1/leagues?active_since=UNIX keeps only leagues whose latest fixture kicks off at or after that instant, so a client can skip the roughly 40% of competitions that have not had a match in a year. Without the parameter the list is unchanged.

September 2026

Opaque ids

  • Fixture, league, team and league-season ids handed out to accounts created from September 2026 are opaque, stable integers of at most ten digits (up to 4,294,967,295 — store them as 64-bit integers; a 32-bit signed int overflows). They are not the feed's internal keys and carry no meaning of their own; store them as they come. Nothing else about the URLs or the JSON changed.
  • Accounts created before this keep the ids they already hold, unchanged and for good — nothing to migrate. Every /v1 response now carries X-ID-Scheme (legacy or public_v1) naming which family of ids the account uses; quote it when you write to support about an id.
  • An older account that would rather match the docs can move to the new ids from the dashboard. It is optional and one-way: the ids it holds stop working the moment it does, so it is for accounts that look ids up fresh rather than store them.
  • Bookmakers are addressed by slug (bet365, pinnacle, …), which /v1/bookmakers lists; the numeric bookmaker id is no longer returned to new accounts.

August 2026

Countries by code

  • Countries are now addressed by ISO code. /v1/countries returns { code, name } and leagues carry a country block ({ code, name }) instead of the numeric country_id; continent_id is gone. Codes are ISO 3166-1 alpha-2, with GB-ENG / GB-SCT / GB-WLS / GB-NIR for the home nations, and region codes EUROPE / ASIA / AFRICA / AMERICAS / OCEANIA / WORLD for continental and international competitions.
  • /v1/leagues?country= takes that code (case-insensitive); an unknown code returns 400 invalid_country rather than an unfiltered list.

August 2026

Attribution on the $0 plans

  • Free and Community Access now carry one condition when the data is shown in a public-facing product — a website, app, bot or published dataset: a reasonably visible “Football data by 5DollarFootballAPI”, linked to the site. Private and internal use needs none. Pro, Ultra and Business are unchanged: attribution stays optional.
  • The link may be plain; the terms allow rel="nofollow" if your site's policy requires it. Ready-to-paste HTML and Markdown snippets are in the docs and on the dashboard. Applies to all Free and Community keys from the date the terms were updated.

August 2026

Community Access

  • A new plan for students, researchers, early-career developers and anyone for whom $5 a month is a real decision: the free plan plus one country's whitelisted leagues (its top flight and, where we price it, the second division), the same Bet365 odds markets, 12 months of results and odds, and 300 requests / hour. Switched on from /community in a minute, on your word — nothing is verified, no card is asked for — for 12 months at a time; renewal is the same form in the last 30 days of a term.
  • The chosen country decides what the key reaches: /v1/leagues lists the top-5 plus that pack, and any other competition returns 403 insufficient_plan naming the pack. GET /v1/status reports plan "community".
  • Hourly plans (Free and Community) now also carry a 20-requests-per-minute ceiling. A request it refuses is not counted against the hour; the 429 says "Burst limit exceeded" and carries Retry-After to the next minute. /v1/status reports it as limits.burst_per_minute (null on per-minute plans).

August 2026

Odds on every plan

  • The free plan now serves every Bet365 odds market — 1X2, Asian handicap, goal line, corners, cards, halftime lines and BTTS, with opening, closing and in-play prices — on the top-5 leagues, through GET /v1/fixtures/{id} and /v1/fixtures/{id}/odds. Every plan sees the same snapshot; plans differ by coverage, throughput and history.
  • include=odds on fixture lists (/v1/fixtures and the league and team lists) starts with Pro. Free requests that ask for it get 403 insufficient_plan naming the per-fixture endpoint, not a silently missing field.
  • The rate window is per account, shared by every key the account holds. Usage in the dashboard is still broken down per key.

August 2026

Season addressing that matches the data

  • GET /v1/leagues/{id}/fixtures no longer depends on the feed's season index: it defaults to your plan's whole history window plus the upcoming schedule, start_time/end_time narrow it with no 24h cap, and ?season= now selects by the season's kickoff dates. Leagues whose seasons list is empty — the index only tracks a subset — return their full fixture history instead of season_not_found, and a ?season= they do not list is a clear 404.
  • GET /v1/standings is now explicit about coverage: where the feed carries no current table, we compute one from finished results where the league's format allows it — marked "source": "computed" (goal, corner and card tables alike; administrative point adjustments excluded). Formats a computed table cannot represent faithfully (playoff splits, Apertura/Clausura pyramids, quadruple round-robins) return an explicit standings_not_available error instead of a stale or missing-season answer. Every response now names its season and its source ("feed" | "computed").
  • Unsupported query parameters other feeds use — from, to, date, and team/live on /v1/fixtures — return 400 unknown_parameter instead of being silently ignored, so an unfiltered response can never masquerade as a filtered one.
  • Pricing copy now spells out the Pro odds package: opening, closing and in-play prices; tick-by-tick movement history stays Ultra.

August 2026

The league list, published and enforced

  • The Pro league list is published in full, with ids, at /docs/league-coverage: the top flight of 84 countries, the 34 second divisions bet365 prices in full, the continental club cups and national-team football.
  • Plan league scope is now enforced. Free keys reach the five big European leagues, Pro the published list, Ultra everything. A competition outside your plan returns 403 insufficient_plan — never an empty list.

August 2026

BTTS, and a trimmed history

  • GET /v1/leagues/{id} now lists the league's seasons (newest first, one marked current) — the valid ?season= values for league fixtures and standings.
  • country_id and is_national are dropped from team payloads — the upstream data never actually carried them, so they only misled.
  • Both-teams-to-score joins /v1/fixtures/{id}/odds (bet365, pre-match) and the coverage table.
  • Bookmakers beyond bet365 on /v1/fixtures/{id}/odds are now an Ultra feature — bet365 (every market) stays on Pro.
  • The first_10min and next_goal markets are dropped from odds history.
  • The /v1/fixtures/{id}/corners endpoint is removed — corner counts are on every fixture, corner lines on /odds, and corner tables on /standings.
  • corner_projection is dropped from /v1/fixtures/{id}/statistics and the stats include.

August 2026

Closing lines

  • The current stage is renamed closing on every odds payload — opening / closing / inplay, the terms backtesters actually use. For a match that has not kicked off yet, closing is simply the latest pre-match price so far.

August 2026

Bookmaker odds

  • /v1/fixtures/{id}/odds now returns full prices: every stage (opening, closing, in-play) carries the line and both prices, not just the line.
  • New bookmakers parameter (comma list, default bet365) and GET /v1/bookmakers — 18 more books with 1X2, Asian handicap, goal line and corner line where recorded, one odds entry per book.
  • Odds movement history too: ?bookmaker= on /v1/fixtures/{id}/odds/history (one book at a time, default bet365) replays any bookmaker's 1X2, Asian handicap, goal line or corner line tick by tick.

August 2026

Reliable live view

  • status=live now only returns matches that kicked off within the last 4 hours — stale feed rows stuck in a running status no longer appear.
  • per_page for status=live goes up to 500, so a single page holds every live match and offset pagination cannot skip or duplicate a match mid-scroll.

August 2026

Focused fixtures endpoints

  • New GET /v1/leagues/{id}/fixtures — a full season of league fixtures (defaults to the newest season with fixtures), the bulk entry point for historical data.
  • New GET /v1/teams/{id}/fixtures — one team's matches home and away, most recent first.
  • /v1/fixtures is now the window view: start_time / end_time unix timestamps bound a window of up to 24 hours (default: today UTC), so any timezone's "today" is one call. The date, season, team and live parameters are gone — use the new endpoints, and status=live for in-play. status accepts all (default) | scheduled | live | finished; unknown values return a 400.
  • esports is now a plain boolean: false (default) returns real football, true returns esoccer instead — the mixed "include" mode is gone.

August 2026

Kickoff timestamps

  • New kickoff_ts field — unix seconds, UTC — alongside kickoff_utc on every fixture payload, so comparisons and backtest math need no date parsing.

August 2026

Short-form odds lines

  • All odds lines are now single short-form numbers: split bookmaker quotes are averaged ("0.0, -0.5" becomes -0.25) on every endpoint, tick history included.
  • Card lines (card_line, card_asian) are now part of the odds include on /v1/fixtures.

August 2026

Compound requests

  • New include parameter on /v1/fixtures and /v1/fixtures/{id} — expand odds, events and in-play stats inline: one call per screen, not one call per match.

August 2026

Localization & esoccer filter

  • New lang parameter on fixtures, leagues, teams, standings and countries — team, league and country names in 21 languages besides English.
  • New esports parameter on /v1/fixtures and /v1/leagues — esoccer (e-football) leagues are excluded by default, opt in with include or only.

July 2026

v1 launched

  • Public launch: fixtures, live scores, odds (pre-match + in-play with opening lines and tick history), corners, cards, standings, match events, leagues, teams and countries.
  • API key authentication, transparent rate limits and a uniform JSON envelope.