API Documentation
Everything you need to call the 5DollarFootballAPI. Base URL https://api.5dollarfootballapi.com/v1.
Wondering how fresh the data is? Freshness and uptime are measured every minute and published on the status page.
Coming from API-Football?
Keep your endpoints, parameters and JSON on the API-Football compatible host: change the base URL and key, fetch our ids once.
curl https://api.5dollarfootballapi.com/v1/fixtures?status=live
-H "Authorization: Bearer fb_live_your_key"
{ "success": 1, "data": [ /* live matches */ ] }
data freshness and rights
Live scores and in-play statistics are written continuously while matches run; odds are stored tick by tick as bookmakers move their prices. Rather than quote update speeds here that could go stale, we publish measured freshness — per-match update ages, odds price-change frequency, result settlement completeness and independently monitored uptime — on the status page, refreshed every minute. Usage rights are equally plain: use the data in commercial products, display it to your end users and cache responses, but do not resell or redistribute the raw data as a competing feed. Public-facing products on the $0 plans (Free, Community Access, Education Access) require attribution; paid plans and private or internal use do not. Full wording in the terms.
introduction
The 5DollarFootballAPI is a read-only REST API. Every response is JSON with a top-level "success" flag. All timestamps are UTC (ISO-8601). The base URL is https://api.5dollarfootballapi.com/v1.
authentication
Authenticate every request with your API key in an Authorization header: Authorization: Bearer fb_live_your_key. You can also send it as X-API-Key. Get a key by creating a free account — no card required. Keys are shown once; store them securely and never embed them in public client-side code.
Authorization: Bearer fb_live_your_keyclient libraries
Official clients for Python and Node.js cover every endpoint with automatic rate-limit retries, typed errors and a pagination iterator. Prefer raw HTTP? Every example in these docs is plain curl, so any language with an HTTP client works just as well.
pip install fivedollarfootballnpm install fivedollarfootballattribution
If you display the data in a public-facing product — a website, app, bot or published dataset — on Free, Community Access or Education Access, include “Football data by 5DollarFootballAPI” in a reasonably visible place (a footer, an about page, a bot description or a README) and link it to the site. A plain link is fine; if your site's policy requires it you may add rel="nofollow" — the terms allow either. Attribution is optional on Pro, Ultra and Business, and for private or internal use on every plan.
HTML
<a href="https://5dollarfootballapi.com">Football data by 5DollarFootballAPI</a>Markdown
Football data by [5DollarFootballAPI](https://5dollarfootballapi.com)Plain text
Football data provided by 5DollarFootballAPI (5dollarfootballapi.com)rate limits
Each plan has one rate window: 60 requests / hour on Free, 300 requests / hour on Community, and a per-minute rate on the paid plans (10 requests / min on Pro, 40 requests / min on Ultra). The window belongs to your account, so every key you create shares it — extra keys are for organising projects, not multiplying quota. Short parallel bursts are fine as long as the window total holds, and there are no daily caps or monthly pools. The hourly plans (Free and Community) also carry a 20-requests-per-minute ceiling, so a loop left running cannot spend the whole hour in seconds; a request refused by it is not counted against the hour. Every response includes X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset for the current window. When you exceed the limit you get HTTP 429 with a Retry-After header — back off and retry.
errors
Errors return { "success": 0, "error": { ... } } with an HTTP status. The error object has a machine-readable type and code, a human message, an optional param, a doc_url, and a request_id to quote in support. We never return a silent 200 with empty data for a missing resource — you get a proper 404.
curl https://api.5dollarfootballapi.comshape
-H "Authorization: Bearer fb_live_your_key"
{
"success": 0,
"error": {
"type": "invalid_request",
"code": "fixture_not_found",
"message": "No fixture with id 99999.",
"param": "id",
"doc_url": "https://5dollarfootballapi.com/docs/errors",
"request_id": "req_a1b2c3d4e5f6"
}
}
pagination
List endpoints accept page (default 1) and per_page (default 50, max 100), and return a pagination object: { page, per_page, count, has_more }. Keep requesting the next page while has_more is true. The underlying set can change between two page requests (a match kicks off or finishes); for the volatile live view, request status=live with a large per_page (up to 500) so a single page holds everything.
fixture status
Every fixture carries a status with four values: scheduled (not kicked off), in_play (running), finished (the feed sent the full-time mark) and unknown. Build settlement, result and de-duplication logic on finished only — it is the one state the feed confirms explicitly. The feed has no postponed, cancelled or abandoned states: a postponed match keeps its original row, which never kicks off, and is rescheduled under a new fixture id; a match the feed lost mid-game (abandoned, interrupted, or a source outage) is never auto-finished. Rather than guess at what happened, a row that is more than 4 hours past its kickoff and has not been confirmed finished is reported as unknown, with a status_reason: kickoff_unconfirmed (never seen starting) or result_unconfirmed (seen running, no full-time). Re-check it later or treat the result as unavailable. The ?status= filters use the same rule as the field, so ?status=live returns exactly the rows whose status is in_play, and ?status=scheduled never returns a row that will not start. status_code is the raw feed value for reference: null before kickoff, the running minute or half at the break, full at the end.
| status | status_reason | When |
|---|---|---|
| scheduled | null | No kickoff yet; kickoff is in the future or within the last 4 hours. |
| in_play | null | The feed reports the match running (status_code is the minute, or "half" at the break) and it kicked off within the last 4 hours. |
| finished | null | The feed sent the full-time mark (status_code "full"). The only state to settle on. |
| unknown | kickoff_unconfirmed | Kickoff was more than 4 hours ago and the feed never saw the match start — typically postponed (rescheduled under a new id) or cancelled. |
| unknown | result_unconfirmed | The feed saw the match running, but more than 4 hours after kickoff it still has no full-time mark — abandoned, interrupted, or lost to a source outage. |
curl https://api.5dollarfootballapi.com/v1/fixtures?status=unknown
-H "Authorization: Bearer fb_live_your_key"
{ "success": 1, "data": [ { "id": 422841891, "status": "unknown", "status_reason": "result_unconfirmed", "status_code": "67", /* ... */ } ] }
languages
Endpoints that return team, league or country names accept a lang parameter to localize them — 21 languages besides English. Any name without a translation falls back to English on that row, so responses are always complete. An unknown code returns a 400 error. Omit lang (or pass en) for English.
| Code | Language |
|---|---|
| en | English (default) |
| bg | Bulgarian |
| cs | Czech |
| da | Danish |
| de | German |
| el | Greek |
| es | Spanish |
| et | Estonian |
| fr | French |
| hu | Hungarian |
| it | Italian |
| ja | Japanese |
| nb | Norwegian |
| nl | Dutch |
| pl | Polish |
| pt | Portuguese |
| ro | Romanian |
| ru | Russian |
| sk | Slovak |
| sv | Swedish |
| zh-cn | Chinese (Simplified) |
| zh-tw | Chinese (Traditional) |
curl https://api.5dollarfootballapi.com/v1/leagues/39/fixtures?lang=ja
-H "Authorization: Bearer fb_live_your_key"
{ "success": 1, "data": [ { "league": { "id": 39, "name": "プレミアリーグ" }, /* ... */ } ] }
league coverage
The Pro plan ($5/month) covers 137 competitions — 118 leagues (the top flight of 84 countries across Europe, the Americas, Asia and Africa, plus the 34 second divisions bet365 prices in full) and the continental club cups and national-team football — with full odds, corner and card data. The full list, with ids, is on the league coverage page. Domestic cups and the remaining second tiers are an Ultra feature, along with all 1,600+ leagues & cups.
history depth
The data runs back to 2014 for the major competitions. How much of it a key can query follows the plan: Free returns the last 3 months of results and odds, Pro ($5/month) the last 12 months, and Ultra everything — complete seasons and the full odds tick history back to 2014. Live and upcoming data is identical on every plan.
bookmakers
Fixture lists — /v1/fixtures, the league and team fixture lists, and the odds include — always quote Bet365. The single-fixture endpoint /v1/fixtures/{id}/odds takes a bookmakers parameter: one or more slugs, comma-separated, default bet365 (GET /v1/bookmakers returns the same list as JSON). Bet365 comes with every plan, Free included; the other bookmakers require Ultra or above. What each bookmaker carries:
| Bookmaker | Slug | 1X2 | Asian handicap | Goal line | Fixed goal lines | Corner line | Card lines | Half-time lines | BTTS |
|---|---|---|---|---|---|---|---|---|---|
| Bet 365 | bet365 | Pre + Live | Pre + Live | Pre + Live | Pre + Live | Pre + Live | Pre + Live | Pre + Live | Pre |
| Pinnacle | pinnacle | Pre | Pre + Live | Pre + Live | — | Pre + Live | — | — | — |
| William Hill | williamhill | Pre | Pre | Pre + Live | — | — | — | — | — |
| Ladbrokes | ladbrokes | Pre | — | Pre + Live | — | — | — | — | — |
| Vcbet | vcbet | Pre | Pre + Live | Pre + Live | — | — | — | — | — |
| 1xBet | 1xbet | Pre | Pre + Live | Pre + Live | — | — | — | — | — |
| Bwin | bwin | Pre | — | Pre + Live | — | — | — | — | — |
| Easybets | easybets | Pre | Pre + Live | Pre + Live | — | — | — | — | — |
| Interwetten | interwetten | Pre | Pre + Live | Pre + Live | — | — | — | — | — |
| Betfair | betfair | Pre | — | — | — | — | — | — | — |
| SNAI | snai | Pre | — | — | — | — | — | — | — |
| Macauslot | macauslot | Pre | Pre + Live | Pre + Live | — | Pre | — | — | — |
| Betsson | betsson | Pre | — | — | — | — | — | — | — |
| Bet-at-home | betathome | Pre | — | — | — | — | — | — | — |
| 18Bet | 18bet | Pre | Pre + Live | Pre + Live | — | — | — | — | — |
| 10BET | 10bet | Pre | — | Pre + Live | — | — | — | — | — |
| 12bet | 12bet | Pre | Pre + Live | Pre + Live | — | — | — | — | — |
| Coral | coral | Pre | — | — | — | — | — | — | — |
| Crown | crown | Pre | Pre + Live | Pre + Live | — | Pre + Live | — | — | — |
| Hong Kong Jockey Club | hkjc | Pre | Pre + Live | Pre + Live | — | — | — | — | — |
| China Sports Lottery | chinasportslottery | Pre | — | — | — | — | — | — | — |
Endpoint reference
Every endpoint is read-only and returns JSON. Each also has its own page — click through for a focused, linkable reference.
List fixtures
The window view: fixtures and results for a time window of up to 24 hours (default: today UTC), or every in-play match with ?status=live. For a whole season or one team's matches, see /v1/leagues/{id}/fixtures and /v1/teams/{id}/fixtures. Add ?include=odds,events,stats to expand every row in place — one call per screen, not one call per match. How far back you can query follows your plan: 3 months on Free, 12 months on Pro, back to 2014 on Ultra.
Parameters
| start_time | optional | Window start as a unix timestamp (seconds, UTC), inclusive. Defaults to 00:00 UTC today; if only end_time is sent, defaults to 24h before it. |
| end_time | optional | Window end as a unix timestamp (seconds, UTC), exclusive. Defaults to start_time + 24h. The window may span at most 24 hours — pick any day boundary in any timezone. |
| league | optional | Filter by league id. |
| status | optional | all | scheduled | live | finished | unknown. Defaults to all. "live" returns every in-play match right now, regardless of date; "unknown" the rows the feed lost (see Fixture status). |
| include | optional | Comma list of odds | events | stats — expands each fixture with the Bet365 market lines (odds is Pro and above on lists; Free reads the same markets per fixture at /v1/fixtures/{id}/odds), the event timeline, and the in-play statistics, in the same shapes as the per-fixture endpoints. Caps per_page at 50. |
| esports | optional | true | false. Defaults to false (real football only); true returns esoccer (e-football) matches instead. Esoccer requires the Ultra plan — other plans get a 403 insufficient_plan. |
| lang | optional | Localize team & league names (21 languages besides English, e.g. zh-cn, ja, es, de, pt). Missing translations fall back to English. |
| page, per_page | optional | Pagination (per_page max 100; 50 with include; 500 with status=live, so one page holds every live match). |
Example
curl https://api.5dollarfootballapi.com/v1/fixtures
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": [
{
"id": 422841891,
"league": { "id": 1385749887, "name": "USA USL Cup" },
"teams": { "home": { "id": 659461348, "name": "Birmingham Legion FC" }, "away": { "id": 2095841428, "name": "Tulsa" } },
"kickoff_utc": "2026-07-12T00:00:00+00:00",
"kickoff_ts": 1783814400,
"status": "finished",
"status_reason": null,
"status_code": "full",
"status_reason": null,
"status_code": "full",
"goals": { "home": 3, "away": 1 },
"corners": { "home": 13, "away": 4 },
"cards": { "home": { "yellow": 1, "red": 0 }, "away": { "yellow": 4, "red": 0 } },
"odds": {
"1x2": { "opening": { "home": 1.53, "draw": 3.75, "away": 5.0 }, "closing": { "home": 1.18, "draw": 5.5, "away": 15.0 }, "inplay": null },
"asian_handicap": { "opening": -0.25, "closing": -0.5, "inplay": -1.0 },
"goal_line": { "opening": 2.5, "closing": 2.75, "inplay": 3.0 },
"corner_line": { "opening": 9.5, "closing": 10, "inplay": 10.5 },
"corner_asian": { "opening": 0, "closing": -0.5, "inplay": null },
"card_line": { "opening": 4.5, "closing": 5, "inplay": null },
"card_asian": { "opening": 0, "closing": 0, "inplay": null },
"asian_handicap_half": { "closing": -0.25, "inplay": null },
"goal_line_half": { "closing": 1.25, "inplay": 1.5 },
"corner_line_half": { "closing": 4.5, "inplay": 5 }
},
"statistics": {
"attacks": { "home": 24, "away": 30 },
"dangerous_attacks": { "home": 11, "away": 14 },
"shots_on_target": { "home": 3, "away": 5 },
"shots_off_target": { "home": 4, "away": 2 },
"possession": { "home": 51, "away": 49 },
"first_half": {
"attacks": { "home": 15, "away": 18 },
"dangerous_attacks": { "home": 6, "away": 8 },
"shots_on_target": { "home": 1, "away": 2 },
"shots_off_target": { "home": 2, "away": 0 },
"possession": { "home": 50, "away": 50 }
}
},
"events": [
{ "type": "goal", "minute": 20, "team": "away", "count": 1 },
{ "type": "corner", "minute": 23, "team": "home", "count": 1 },
{ "type": "yellow_card", "minute": 41, "team": "home", "count": 1 },
{ "type": "period_score", "minute": null, "team": null, "period": "first_half", "score": { "home": 0, "away": 1 } },
{ "type": "missed_penalty", "minute": 55, "team": "away" },
{ "type": "substitution", "minute": 63, "team": "away", "player_in": "R. Silva", "player_out": "J. Costa" },
{ "type": "red_card", "minute": 78, "team": "away" },
{ "type": "period_score", "minute": null, "team": null, "period": "second_half", "score": { "home": 3, "away": 1 } }
]
}
],
"pagination": { "page": 1, "per_page": 50, "count": 1, "has_more": true }
}
// odds / statistics / events appear only with ?include=odds,events,stats
Get a fixture
A single fixture with goals, corners, cards and odds lines. Add ?include=events,stats to fold the event timeline and in-play statistics into the same call.
Parameters
| id | required | Fixture id. |
| include | optional | Comma list of events | stats — adds the event timeline and in-play statistics, in the same shapes as the per-fixture endpoints. |
| lang | optional | Localize the team & league names (21 languages, English fallback). |
Example
curl https://api.5dollarfootballapi.com/v1/fixtures/{id}
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": {
"id": 422841891,
"league": { "id": 1385749887, "name": "USA USL Cup" },
"teams": { "home": { "id": 659461348, "name": "Birmingham Legion FC" }, "away": { "id": 2095841428, "name": "Tulsa" } },
"kickoff_utc": "2026-07-12T00:00:00+00:00",
"kickoff_ts": 1783814400,
"status": "finished",
"status_reason": null,
"status_code": "full",
"round": 12,
"league_season_id": 2288481746,
"goals": { "home": 3, "away": 1, "half_home": 1, "half_away": 1 },
"corners": { "home": 13, "away": 4, "half_home": 6, "half_away": 2 },
"cards": { "home": { "yellow": 1, "red": 0 }, "away": { "yellow": 4, "red": 0 } },
"odds": {
"1x2": { "opening": { "home": 1.53, "draw": 3.75, "away": 5.0 }, "closing": { "home": 1.18, "draw": 5.5, "away": 15.0 }, "inplay": null },
"asian_handicap": { "opening": -0.5, "closing": -0.75, "inplay": -1.0 },
"goal_line": { "opening": 2.5, "closing": 2.75, "inplay": 3.0 },
"corner_line": { "opening": 9.5, "closing": 10, "inplay": 10.5 },
"corner_asian": { "opening": 0, "closing": -0.5, "inplay": null },
"card_line": { "opening": 4.5, "closing": 5, "inplay": null },
"card_asian": { "opening": 0, "closing": 0, "inplay": null },
"asian_handicap_half": { "closing": -0.25, "inplay": null },
"goal_line_half": { "closing": 1.25, "inplay": 1.5 },
"corner_line_half": { "closing": 4.5, "inplay": 5 }
},
"statistics": {
"attacks": { "home": 24, "away": 30 },
"dangerous_attacks": { "home": 11, "away": 14 },
"shots_on_target": { "home": 3, "away": 5 },
"shots_off_target": { "home": 4, "away": 2 },
"possession": { "home": 51, "away": 49 },
"first_half": {
"attacks": { "home": 15, "away": 18 },
"dangerous_attacks": { "home": 6, "away": 8 },
"shots_on_target": { "home": 1, "away": 2 },
"shots_off_target": { "home": 2, "away": 0 },
"possession": { "home": 50, "away": 50 }
}
},
"events": [
{ "type": "goal", "minute": 20, "team": "away", "count": 1 },
{ "type": "corner", "minute": 23, "team": "home", "count": 1 },
{ "type": "yellow_card", "minute": 41, "team": "home", "count": 1 },
{ "type": "period_score", "minute": null, "team": null, "period": "first_half", "score": { "home": 1, "away": 1 } },
{ "type": "missed_penalty", "minute": 55, "team": "away" },
{ "type": "substitution", "minute": 63, "team": "away", "player_in": "R. Silva", "player_out": "J. Costa" },
{ "type": "red_card", "minute": 78, "team": "away" },
{ "type": "period_score", "minute": null, "team": null, "period": "second_half", "score": { "home": 3, "away": 1 } }
]
}
}
// odds is inline on every plan; statistics / events appear with ?include=events,stats
Fixture odds
Full prices for every market, one entry per requested bookmaker — each of opening, closing and in-play carries the line and both prices. Bet365 (the default) serves twelve markets: 1X2 plus Asian handicap, goal, corner, corner-Asian and card lines — full-time and half-time — both-teams-to-score, and the fixed goal lines ladder (goal_line_fixed: Over/Under 0.5, 1.5, 2.5 … 9.5 quoted side by side, one entry per line with its own opening, closing and in-play prices; null when the book withdrew that line, [] before the ladder feed began on 26 September 2026 or where Bet365 quotes no alternatives). Add more books with ?bookmakers=bet365,pinnacle,… (GET /v1/bookmakers) — they carry 1X2, Asian handicap, goal line and corner line where recorded. Bookmakers beyond bet365 require the Ultra plan.
See what every bookmaker carries, per market →
Parameters
| id | required | Fixture id. |
| bookmakers | optional | Comma list of bookmaker slugs, default bet365 — e.g. bet365,pinnacle,1xbet. One odds entry per bookmaker; slugs come from GET /v1/bookmakers. Non-bet365 slugs need the Ultra plan. |
| market | optional | 1x2 | asian | goalline | goalline_fixed | corner | corner_asian | cards | cards_asian | asian_half | goalline_half | corner_half | btts. |
Example
curl https://api.5dollarfootballapi.com/v1/fixtures/{id}/odds
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": {
"fixture_id": 422841891,
"bookmakers": [
{
"name": "Bet 365", "slug": "bet365",
"odds": {
"1x2": { "opening": { "home": 1.53, "draw": 3.75, "away": 5.0 }, "closing": { "home": 1.18, "draw": 5.5, "away": 15.0 }, "inplay": null },
"asian_handicap": {
"opening": { "line": -0.25, "home": 1.95, "away": 1.85 },
"closing": { "line": -0.5, "home": 2.02, "away": 1.78 },
"inplay": { "line": -1.0, "home": 1.9, "away": 1.9 }
},
"goal_line": {
"opening": { "line": 2.5, "over": 1.9, "under": 1.9 },
"closing": { "line": 2.75, "over": 1.85, "under": 1.95 },
"inplay": { "line": 3.0, "over": 2.05, "under": 1.75 }
},
"corner_line": {
"opening": { "line": 9.5, "over": 1.85, "under": 1.85 },
"closing": { "line": 10, "over": 1.9, "under": 1.8 },
"inplay": { "line": 10.5, "over": 2.0, "under": 1.7 }
},
"corner_asian": { "opening": { "line": 0, "home": 1.875, "away": 1.875 }, "closing": null, "inplay": null },
"card_line": { "opening": { "line": 4.5, "over": 1.95, "under": 1.75 }, "closing": { "line": 5, "over": 1.85, "under": 1.85 }, "inplay": null },
"card_asian": { "opening": { "line": 0, "home": 1.9, "away": 1.8 }, "closing": null, "inplay": null },
"asian_handicap_half": { "opening": { "line": -0.25, "home": 1.98, "away": 1.82 }, "closing": { "line": -0.25, "home": 2.05, "away": 1.75 }, "inplay": null },
"goal_line_half": { "opening": { "line": 1.0, "over": 1.95, "under": 1.85 }, "closing": { "line": 1.25, "over": 2.0, "under": 1.8 }, "inplay": { "line": 1.5, "over": 2.1, "under": 1.7 } },
"corner_line_half": { "opening": { "line": 4.5, "over": 1.85, "under": 1.85 }, "closing": { "line": 4.5, "over": 1.9, "under": 1.8 }, "inplay": { "line": 5, "over": 2.0, "under": 1.7 } },
"btts": { "opening": { "yes": 1.8, "no": 1.95 }, "closing": { "yes": 1.72, "no": 2.05 }, "inplay": null },
"goal_line_fixed": [
{ "line": 0.5, "opening": { "over": 1.05, "under": 11.0 }, "closing": { "over": 1.05, "under": 11.0 }, "inplay": null },
{ "line": 1.5, "opening": { "over": 1.22, "under": 4.0 }, "closing": { "over": 1.25, "under": 3.75 }, "inplay": null },
{ "line": 2.5, "opening": { "over": 1.8, "under": 2.0 }, "closing": { "over": 1.85, "under": 1.95 }, "inplay": { "over": 2.63, "under": 1.44 } },
{ "line": 3.5, "opening": { "over": 2.75, "under": 1.4 }, "closing": { "over": 2.88, "under": 1.36 }, "inplay": { "over": 5.5, "under": 1.14 } },
{ "line": 4.5, "opening": { "over": 5.5, "under": 1.14 }, "closing": { "over": 6.0, "under": 1.12 }, "inplay": null },
{ "line": 5.5, "opening": { "over": 11.0, "under": 1.05 }, "closing": null, "inplay": null }
]
}
}
]
}
}
// ?bookmakers=bet365,pinnacle,1xbet returns one entry per book
// goal_line_fixed: the main goal_line moves (2.5 → 2.75 → 3.0); the ladder keeps
// every line open with its own prices. closing null = Bet365 withdrew that line
// before kickoff; a line absent from the ladder was never quoted.
List bookmakers
The bookmakers accepted by ?bookmakers= on /v1/fixtures/{id}/odds, in display order. Bet365 carries every market and comes with every plan; the rest require Ultra — the coverage table on the docs index shows what each carries.
See the per-bookmaker coverage table →
Example
curl https://api.5dollarfootballapi.com/v1/bookmakers
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": [
{ "name": "Bet 365", "slug": "bet365" },
{ "name": "Pinnacle", "slug": "pinnacle" },
{ "name": "William Hill", "slug": "williamhill" },
{ "name": "Ladbrokes", "slug": "ladbrokes" },
{ "name": "Hong Kong Jockey Club", "slug": "hkjc" }
]
}
// 21 entries in total: 20 bookmakers plus chinasportslottery
Odds movement history
The full pre-match and in-play tick history for one market — every recorded price/line change with the score at that moment. Bet365 (the default) carries thirteen markets: 1X2, Asian handicap, goal line and corner line (each full-time and half-time), plus corner Asian handicap, card line, card Asian handicap, both-teams-to-score and the fixed goal lines ladder (goalline_fixed — the response groups the page's ticks per line under lines instead of ticks; ?line=2.5 narrows to one line). Any other bookmaker (?bookmaker=, one at a time) carries 1x2, asian, goalline and corner. The whole endpoint requires the Ultra plan or above — Free and Pro keys get a 403 insufficient_plan.
See what every bookmaker carries, per market →
Parameters
| id | required | Fixture id. |
| bookmaker | optional | One bookmaker slug, default bet365 (see GET /v1/bookmakers). Slugs other than bet365 support only market=1x2 | asian | goalline | corner — any other market value returns a 400 invalid_market. |
| market | required | 1x2 | asian | goalline | goalline_fixed | corner | 1x2_half | asian_half | goalline_half | corner_half | corner_asian | cards | cards_asian | btts. |
| line | optional | goalline_fixed only: one fixed line (0.5, 1.5 … 9.5), e.g. line=2.5. Default is the whole ladder in one call. |
| page, per_page | optional | Pagination (per_page default 100, max 500; goalline_fixed default and max 1000, which takes a whole match in one call). Ticks are ordered oldest first; goalline_fixed pages the same stream and groups each page per line, so in the rare case a line continues on the next page, append by line. |
Example
curl https://api.5dollarfootballapi.com/v1/fixtures/{id}/odds/history
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": {
"fixture_id": 481163241,
"bookmaker": { "name": "Bet 365", "slug": "bet365" },
"market": "asian",
"ticks": [
{ "minute": null, "line": -0.75, "home": 1.8, "away": 2.05, "score": { "home": null, "away": null }, "recorded_at": "2025-06-21T01:33:14+00:00" },
{ "minute": null, "line": -1.0, "home": 2.05, "away": 1.8, "score": { "home": null, "away": null }, "recorded_at": "2025-08-16T13:06:03+00:00" },
{ "minute": null, "line": -0.75, "home": 1.925, "away": 1.925, "score": { "home": null, "away": null }, "recorded_at": "2025-08-17T09:15:01+00:00" },
{ "minute": null, "line": -0.75, "home": 1.875, "away": 1.975, "score": { "home": null, "away": null }, "recorded_at": "2025-08-17T11:34:08+00:00" },
{ "minute": 0, "line": -0.5, "home": 1.825, "away": 2.025, "score": { "home": 0, "away": 0 }, "recorded_at": "2025-08-17T13:01:27+00:00" },
{ "minute": 1, "line": -0.5, "home": 1.85, "away": 2.0, "score": { "home": 0, "away": 0 }, "recorded_at": "2025-08-17T13:02:05+00:00" },
{ "minute": 2, "line": -0.5, "home": 1.825, "away": 2.025, "score": { "home": 0, "away": 0 }, "recorded_at": "2025-08-17T13:03:11+00:00" },
{ "minute": 3, "line": -0.75, "home": 2.025, "away": 1.825, "score": { "home": 0, "away": 0 }, "recorded_at": "2025-08-17T13:04:51+00:00" },
{ "minute": 8, "line": -0.75, "home": 2.05, "away": 1.8, "score": { "home": 0, "away": 0 }, "recorded_at": "2025-08-17T13:09:26+00:00" },
{ "minute": 8, "line": -0.5, "home": 1.825, "away": 2.025, "score": { "home": 0, "away": 0 }, "recorded_at": "2025-08-17T13:09:29+00:00" }
]
},
"pagination": { "page": 1, "per_page": 10, "count": 10, "has_more": true }
}
// Shortened with ?per_page=10 — this is the first page, not the whole match.
// A typical Premier League fixture carries around 190 ticks on this market:
// roughly 18 pre-match and 170 in-play. Pre-match quotes begin weeks before
// kickoff (the first row above is 57 days out), and in-play ticks land as often
// as the book moves — seconds apart around goals, corners and cards.
//
// market=goalline_fixed replaces "ticks" with "lines", one group per line:
// "lines": [
// { "line": 0.5, "ticks": [ { "minute": null, "over": 1.05, "under": 11.0, "recorded_at": "2026-09-26T07:46:20+00:00" } ] },
// { "line": 2.5, "ticks": [
// { "minute": null, "over": 1.8, "under": 2.0, "recorded_at": "2026-09-26T07:46:20+00:00" },
// { "minute": null, "over": 1.85, "under": 1.95, "recorded_at": "2026-09-26T07:58:41+00:00" },
// { "minute": 25, "over": 2.63, "under": 1.44, "recorded_at": "2026-09-26T08:29:44+00:00" } ] },
// { "line": 3.5, "ticks": [
// { "minute": null, "over": 2.75, "under": 1.4, "recorded_at": "2026-09-26T07:46:20+00:00" },
// { "minute": null, "over": null, "under": null, "recorded_at": "2026-09-26T07:58:41+00:00" } ] }
// ]
// over and under both null = Bet365 withdrew that line at that moment. No score
// on these ticks: the ladder feed records prices only. History starts 26 September 2026.
//
// Other bookmakers mark the moments they stop quoting in play — suspended around
// a goal, or closed for good — with a tick whose line and prices are null and
// which carries "suspended": true (the flag appears on those ticks only):
// { "minute": 31, "line": null, "home": null, "away": null, "suspended": true, "score": { "home": 0, "away": 0 }, "recorded_at": "2026-09-19T14:31:47+00:00" }
// /v1/fixtures/{id}/odds skips them: each stage is the last tick with a price.
Fixture events
The chronological match timeline: goals, corners, yellow and red cards, substitutions, missed penalties, and half-time / full-time period scores — corners included, which most football APIs leave out.
Parameters
| id | required | Fixture id. |
Example
curl https://api.5dollarfootballapi.com/v1/fixtures/{id}/events
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": {
"fixture_id": 422841891,
"events": [
{ "type": "corner", "minute": 3, "team": "home", "count": 1 },
{ "type": "goal", "minute": 4, "team": "home", "count": 1 },
{ "type": "yellow_card", "minute": 27, "team": "away", "count": 1 },
{ "type": "period_score", "minute": null, "team": null, "period": "first_half", "score": { "home": 1, "away": 0 } },
{ "type": "missed_penalty", "minute": 49, "team": "away" },
{ "type": "substitution", "minute": 60, "team": "home", "player_in": "R. Lewis", "player_out": "J. Cole" },
{ "type": "red_card", "minute": 78, "team": "away" },
{ "type": "period_score", "minute": null, "team": null, "period": "second_half", "score": { "home": 2, "away": 1 } }
]
}
}
Fixture statistics
Live match statistics: attacks, shots and possession — with first-half splits.
Parameters
| id | required | Fixture id. |
Example
curl https://api.5dollarfootballapi.com/v1/fixtures/{id}/statistics
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": {
"fixture_id": 422841891,
"statistics": {
"attacks": { "home": 112, "away": 88 },
"dangerous_attacks": { "home": 54, "away": 39 },
"shots_on_target": { "home": 6, "away": 3 },
"shots_off_target": { "home": 7, "away": 5 },
"possession": { "home": 58, "away": 42 },
"first_half": {
"attacks": { "home": 47, "away": 40 },
"dangerous_attacks": { "home": 23, "away": 18 },
"shots_on_target": { "home": 2, "away": 1 },
"shots_off_target": { "home": 3, "away": 2 },
"possession": { "home": 55, "away": 45 }
}
}
}
}
Standings
League tables by season, plus corner and card tables via ?type. Corner tables include first-half splits; card tables split yellows and reds. Every response names its "source": "feed" is the table as the data feed carries it; where the feed tracks none, the current table is computed from finished results and marked "computed" (administrative point adjustments excluded). Leagues whose format a computed table cannot represent faithfully return an explicit standings_not_available error — fixtures, results and odds for those leagues are unaffected.
Parameters
| league | required | League id. |
| season | optional | A season as listed for the league on /v1/leagues/{id}: 26/27 for leagues spanning two years, 2026 for calendar-year ones. Defaults to the current season where the feed tracks one. |
| type | optional | total (default) | corner | card. |
| lang | optional | Localize team & league names (21 languages besides English, e.g. zh-cn, ja, es, de, pt). Missing translations fall back to English. |
Example
curl https://api.5dollarfootballapi.com/v1/standings
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": {
"league_id": 3120672213,
"season": "26/27",
"league_season_id": 2288481746,
"type": "corner",
"source": "feed",
"round": 38,
"table": [
{
"position": 1,
"team": { "id": 3815543475, "name": "Arsenal" },
"played": 38,
"total_for": 251, "total_against": 148,
"average_for": 6.6, "average_against": 3.9,
"points": 86,
"first_half": { "total_for": 118, "total_against": 71, "average_for": 3.1, "average_against": 1.9 }
},
{
"position": 2,
"team": { "id": 1933592177, "name": "Chelsea" },
"played": 38,
"total_for": 243, "total_against": 155,
"average_for": 6.4, "average_against": 4.1,
"points": 81,
"first_half": { "total_for": 109, "total_against": 76, "average_for": 2.9, "average_against": 2.0 }
}
]
}
}
List countries
The countries leagues belong to, each with its code — the value /v1/leagues?country= takes. Codes are ISO 3166-1 alpha-2 (DE, BR, JP); the football home nations use their ISO 3166-2 subdivision (GB-ENG, GB-SCT, GB-WLS, GB-NIR); continental and international competitions sit under region codes — EUROPE, ASIA, AFRICA, AMERICAS, OCEANIA and WORLD (e.g. the UEFA Champions League is EUROPE, the World Cup is WORLD). The region rows are listed first, then countries alphabetically by English name.
Parameters
| search | optional | Match on country name. |
| lang | optional | Localize country names (21 languages besides English, e.g. zh-cn, zh-tw, ja, es, de, pt). Unrecognized non-country rows fall back to English. |
| page, per_page | optional | Pagination. |
Example
curl https://api.5dollarfootballapi.com/v1/countries
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": [
{ "code": "WORLD", "name": "International" },
{ "code": "EUROPE", "name": "Europe" },
{ "code": "AMERICAS", "name": "America" },
{ "code": "AF", "name": "Afghanistan" },
{ "code": "AL", "name": "Albania" }
],
"pagination": { "page": 1, "per_page": 50, "count": 5, "has_more": true }
}
List leagues
Competitions, filterable by popularity, country, search or recent activity. Each carries the kickoff of its latest fixture on record (last_fixture_utc / last_fixture_ts), so a client can tell a live competition from a dormant one.
Parameters
| popular | optional | Set to 1 for popular leagues only. |
| country | optional | Filter by country code as listed by /v1/countries, e.g. DE or GB-ENG, or a region code for continental and international competitions — EUROPE, ASIA, AFRICA, AMERICAS, OCEANIA, WORLD (case-insensitive). An unknown code returns 400 invalid_country. |
| search | optional | Match on league name. |
| include | optional | seasons — adds each league's seasons array (newest first, exactly one marked current, as /v1/leagues/{id} returns it), so one page tells you the valid ?season= values for every league on it. |
| active_since | optional | Unix timestamp (seconds, UTC). Only leagues whose latest fixture on record — played or scheduled — kicks off at or after this instant. Pass "six months ago" to skip the competitions the feed has not seen a match in since; without it every competition is returned, including ones dormant for years. |
| esports | optional | true | false. Defaults to false (real football only); true returns the curated list of active esoccer (e-football) competitions instead. Esoccer requires the Ultra plan — other plans get a 403 insufficient_plan. |
| lang | optional | Localize team & league names (21 languages besides English, e.g. zh-cn, ja, es, de, pt). Missing translations fall back to English. |
| page, per_page | optional | Pagination. |
Example
curl https://api.5dollarfootballapi.com/v1/leagues
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": [
{ "id": 3120672213, "name": "Premier League", "short_name": "EPL", "country": { "code": "GB-ENG", "name": "England" }, "is_popular": true, "has_standings": true, "last_fixture_utc": "2026-09-14T19:00:00+00:00", "last_fixture_ts": 1789412400 },
{ "id": 1810150156, "name": "La Liga", "short_name": "LL", "country": { "code": "ES", "name": "Spain" }, "is_popular": true, "has_standings": true, "last_fixture_utc": "2026-09-13T20:00:00+00:00", "last_fixture_ts": 1789329600 }
],
"pagination": { "page": 1, "per_page": 50, "count": 2, "has_more": true }
}
Get a league
A single competition, with its seasons newest first — the valid ?season= values for /v1/leagues/{id}/fixtures and /v1/standings. Exactly one season is marked current. Not every covered league lists seasons: where the feed defines none, seasons is empty and fixtures are queried by start_time/end_time instead.
Parameters
| id | required | League id. |
| lang | optional | Localize the league name (21 languages, English fallback). |
Example
curl https://api.5dollarfootballapi.com/v1/leagues/{id}
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": {
"id": 3120672213,
"name": "Premier League",
"short_name": "EPL",
"country": { "code": "GB-ENG", "name": "England" },
"is_popular": true,
"has_standings": true,
"last_fixture_utc": "2026-09-14T19:00:00+00:00",
"last_fixture_ts": 1789412400,
"seasons": [
{ "season": "26/27", "current": true },
{ "season": "25/26", "current": false },
{ "season": "24/25", "current": false }
]
}
}
League fixtures
One league's fixtures and results, newest kickoff first — the bulk entry point for historical data and backtesting. Defaults to your plan's whole history window plus the upcoming schedule, so page 1 is the current season; narrow it with start_time/end_time (no 24h span cap here), pass ?season where the league lists seasons, or ?order=asc to walk the same set chronologically. Supports the same include, status and lang options as /v1/fixtures.
Parameters
| id | required | League id. |
| season | optional | A season as listed for the league on /v1/leagues/{id}, e.g. 2026 or 26/27 — shorthand for that season's kickoff window. Leagues that list no seasons take start_time/end_time instead. |
| start_time, end_time | optional | A [start_time, end_time) kickoff window — unix seconds, UTC, start inclusive, end exclusive, no span limit. Handy for slicing historical data. |
| status | optional | all | scheduled | live | finished | unknown. Defaults to all. |
| include | optional | Comma list of odds | events | stats — same as /v1/fixtures. Caps per_page at 50. |
| lang | optional | Localize team & league names (21 languages, English fallback). |
| order | optional | desc (default, newest kickoff first) or asc. For a stable full-history crawl, pin the window with start_time/end_time rather than relying on the order — the plan history floor moves as you page. |
| page, per_page | optional | Pagination (per_page max 100; 50 with include). Fixtures are ordered by kickoff, newest first by default. |
Example
curl https://api.5dollarfootballapi.com/v1/leagues/{id}/fixtures
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": [
{
"id": 2688654353,
"league": { "id": 3120672213, "name": "Premier League" },
"teams": { "home": { "id": 3815543475, "name": "Arsenal" }, "away": { "id": 1933592177, "name": "Chelsea" } },
"kickoff_utc": "2026-08-15T16:30:00+00:00",
"kickoff_ts": 1786811400,
"status": "scheduled",
"status_reason": null,
"status_code": null,
"goals": { "home": null, "away": null },
"corners": { "home": null, "away": null },
"cards": { "home": { "yellow": null, "red": null }, "away": { "yellow": null, "red": null } }
}
],
"pagination": { "page": 1, "per_page": 50, "count": 1, "has_more": true }
}
Get a team
A single team.
Parameters
| id | required | Team id. |
| lang | optional | Localize the team name (21 languages, English fallback). |
Example
curl https://api.5dollarfootballapi.com/v1/teams/{id}
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": {
"id": 4171488668,
"name": "Pyunik Yerevan"
}
}
Team fixtures
One team's matches, home and away, most recent first — recent form, head-to-head material and upcoming games in one list. Supports the same include, status and lang options as /v1/fixtures.
Parameters
| id | required | Team id. |
| status | optional | all | scheduled | live | finished | unknown. Defaults to all; "scheduled" lists upcoming games, "finished" past results, "unknown" the rows the feed lost (see Fixture status). |
| start_time, end_time | optional | Narrow to a [start_time, end_time) kickoff window — unix seconds, UTC, start inclusive, end exclusive, no span limit. |
| include | optional | Comma list of odds | events | stats — same as /v1/fixtures. Caps per_page at 50. |
| lang | optional | Localize team & league names (21 languages, English fallback). |
| order | optional | desc (default, newest kickoff first) or asc. |
| page, per_page | optional | Pagination (per_page max 100; 50 with include). Matches are ordered by kickoff, newest first by default. |
Example
curl https://api.5dollarfootballapi.com/v1/teams/{id}/fixtures
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": [
{
"id": 2295892117,
"league": { "id": 3120672213, "name": "Premier League" },
"teams": { "home": { "id": 3815543475, "name": "Arsenal" }, "away": { "id": 2437155481, "name": "Everton" } },
"kickoff_utc": "2026-08-08T14:00:00+00:00",
"kickoff_ts": 1786197600,
"status": "finished",
"status_reason": null,
"status_code": "full",
"status_reason": null,
"status_code": "full",
"goals": { "home": 2, "away": 0 },
"corners": { "home": 8, "away": 3 },
"cards": { "home": { "yellow": 1, "red": 0 }, "away": { "yellow": 2, "red": 0 } }
}
],
"pagination": { "page": 1, "per_page": 50, "count": 1, "has_more": true }
}
China Sports Lottery
The /v1/fixtures window narrowed to matches on sale in China's state football lotteries, each with its official lottery numbers and the official China Sports Lottery Jingcai (竞彩) 1X2 prices. China Sports Lottery Jingcai (竞彩) is the fixed-odds football lottery with a published price per match; Beijing Single Match (北单) is the Beijing lottery's single-match pool; the Traditional football lottery (传统足球) is the 14-match pool. Same parameters, order and pagination as /v1/fixtures, plus types. Ultra plan and above.
Parameters
| start_time | optional | Window start as a unix timestamp (seconds, UTC), inclusive. Defaults to 00:00 UTC today; if only end_time is sent, defaults to 24h before it. |
| end_time | optional | Window end as a unix timestamp (seconds, UTC), exclusive. Defaults to start_time + 24h. The window may span at most 24 hours. |
| types | optional | Comma list of jingcailottery (竞彩) | beijingsingle (北单) | traditional (传统足球). Defaults to all three. A fixture is returned when it carries a number for at least one of them, and the lottery block lists only the requested ones. |
| league | optional | Filter by league id. |
| status | optional | all | scheduled | live | finished | unknown. Defaults to all; "live" returns every in-play match on sale right now, regardless of the window. |
| include | optional | Comma list of odds | events | stats — the same expansions as /v1/fixtures (odds is the Bet365 block, not the Jingcai prices, which are always inline). Caps per_page at 50. |
| lang | optional | Localize team & league names (21 languages, English fallback). |
| page, per_page | optional | Pagination (per_page max 100; 50 with include). Ordered by kickoff, oldest first, exactly like /v1/fixtures. |
Notes
- Numbers are the official labels, returned as strings. The Jingcai number's weekday prefix follows the lottery's sales day, not the kickoff date, so an early-morning Sunday kickoff in Beijing time can still be 周六 (Saturday).
- closing is the latest pre-match price until kickoff, then frozen — the same as every other market. at is the time of that quote, unix seconds UTC; ticks counts the pre-match quotes recorded.
- odds is null when a match has a Jingcai number but no official price on record.
- Beijing Single Match and the Traditional football lottery carry the serial number only for now — no issue number and no prices.
- Prices are the official Jingcai 1X2 only; other Jingcai markets are not carried. The full price path between opening and closing is on /v1/fixtures/{id}/odds/history?bookmaker=chinasportslottery&market=1x2, and /v1/fixtures/{id}/odds?bookmakers=chinasportslottery returns the same book alongside the others.
- esports is not accepted (the lotteries never cover esoccer) and returns 400 unknown_parameter, as do from, to, date, team and live.
- Requires the Ultra plan or above; other plans get 403 insufficient_plan.
Example
curl https://api.5dollarfootballapi.com/v1/chinasportslottery
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": [
{
"id": 3335649313,
"league": { "id": 80636319, "name": "UEFA Nations League A" },
"teams": { "home": { "id": 2254257989, "name": "England" }, "away": { "id": 3596550507, "name": "Spain" } },
"kickoff_utc": "2026-09-26T18:45:00+00:00",
"kickoff_ts": 1790448300,
"status": "finished",
"status_reason": null,
"status_code": "full",
"goals": { "home": 2, "away": 3, "half_home": 2, "half_away": 1 },
"corners": { "home": 6, "away": 3, "half_home": 3, "half_away": 3 },
"cards": { "home": { "yellow": 3, "red": 0 }, "away": { "yellow": 0, "red": 0 } },
"lottery": {
"jingcailottery": {
"number": "周六016",
"odds": {
"opening": { "home": 2.7, "draw": 3.2, "away": 2.25, "at": 1790300220 },
"closing": { "home": 3.46, "draw": 3.4, "away": 1.83, "at": 1790433120 },
"ticks": 12
}
},
"beijingsingle": { "number": "87" },
"traditional": { "number": "7" }
}
}
],
"pagination": { "page": 1, "per_page": 50, "count": 1, "has_more": true }
}
// kickoff 02:45 on Sunday in Beijing, sold under Saturday's numbers: 周六016
Account status
Your plan, limits and today's usage.
Example
curl https://api.5dollarfootballapi.com/v1/status
-H "Authorization: Bearer fb_live_your_key"
{
"success": 1,
"data": {
"plan": "pro",
"limits": { "rate_limit": 10, "rate_window_seconds": 60, "burst_per_minute": null },
"usage": { "today": 124 }
}
}
Ready to build?
Create a free account, grab your key, and make your first call.