BYTETOOLS

Fantasy Premier League API

Free Fantasy Premier League API with no key: the whole game state in one call — players, teams, gameweeks, prices, chips and scoring rules. Tested example included.

No API key requiredHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the Fantasy Premier League API?

The Fantasy Premier League game exposes an unauthenticated `bootstrap-static` endpoint that returns the complete public game state in a single response: every player with prices and form, all twenty clubs, the gameweek calendar, scoring rules and chip availability.

There is no developer programme here and no documentation — this is simply the endpoint the official FPL web app calls to load itself, and it happens to be open. That has made it the foundation of essentially every third-party FPL tool, price-change tracker and transfer planner in existence, and it has stayed stable across many seasons despite never being promised to anyone.

One request gets you everything, and that is both the appeal and the catch: the payload is around a megabyte of JSON covering roughly seven hundred players. Fetch it once per session, cache it, and derive what you need locally rather than calling repeatedly. The `chips` array shown in the captured example is worth understanding on its own — since the two-window rework, each chip appears twice with `start_event` and `stop_event` bounds, so wildcards and free hits are scoped to the first or second half of the season rather than the whole of it.

Quick facts

Base URL
https://fantasy.premierleague.com/api
Authentication
No API key for public game data. Reading a private league or your own team requires a logged-in session cookie.
Rate limit
No published limit. The payload is large and changes slowly — poll hourly at most.
Pricing
Free. Unofficial and undocumented; the Premier League's terms govern use of the data.
CORS
Not enabled — call it from your server
Official docs
Read the docs

How to use the Fantasy Premier League API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Fetch the complete public game state

GET https://fantasy.premierleague.com/api/bootstrap-static/

curl
curl 'https://fantasy.premierleague.com/api/bootstrap-static/'
JavaScript (fetch)
const res = await fetch("https://fantasy.premierleague.com/api/bootstrap-static/");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://fantasy.premierleague.com/api/bootstrap-static/", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "chips": [
    {
      "id": 1,
      "name": "wildcard",
      "number": 1,
      "start_event": 2,
      "stop_event": 19,
      "chip_type": "transfer",
      "overrides": {
        "rules": {},
        "scoring": {},
        "element_types": [],
        "pick_multiplier": null
      }
    },
    {
      "id": 2,
      "name": "wildcard",
      "number": 1,
      "start_event": 20,
      "stop_event": 38,
      "chip_type": "transfer",
      "overrides": {
        "rules": {},
        "scoring": {},
        "element_types": [],
        "pick_multiplier": null
      }
    },
    {
      "id": 3,
      "name": "freehit",
      "number": 1,
      "start_event": 2,
      "stop_event": 19,
      "chip_type": "transfer",
      "overrides": {
        "rules": {},
        "scoring": {},
        "element_types": [],
        "pick_multiplier": null
      }
    },
    {
      "id": 4,
      "name": "bboost",
      "number": 1,
      "start_event": 1,
      "stop_event": 19,
      "chip_type": "team",
      "overrides": {
        "rules": {},
        "scoring": {},
        "element_types": [],
        "pick_multiplier": null
      }
    },
    {
      "id": 5,
      "name": "3xc",
      "number": 1,
      "start_event": 1,
      "stop_event": 19,
      "chip_type": "team",
      "overrides": {
        "rules": {},
        "scoring": {},
        "element_types": [],
        "pick_multiplier": null
      }
    },
    {
      "id": 6,
      "name": "freehit",
      "number": 1,
      "start_event": 20,
      "stop_event": 38,
      "chip_type": "transfer",
      "overrides": {

Parameters

ParameterTypeRequiredDescription
(none)n/aOptional`bootstrap-static/` takes no parameters and always returns the full payload. The trailing slash is required.
/fixtures/pathOptionalSibling endpoint returning every fixture with kickoff times and difficulty ratings.
/element-summary/{id}/pathOptionalPer-player history and upcoming fixtures for one player id.

Response fields

chipsarray
Chip definitions. Each chip appears once per half-season with `start_event` and `stop_event` bounding when it can be played, plus `chip_type` of `transfer` or `team`.
chips[].overridesobject
Rule changes the chip applies while active — scoring tweaks, eligible element types and `pick_multiplier` for the captaincy chips.
eventsarray
Beyond the excerpt: the gameweek calendar, with deadlines, average and highest scores, and flags marking the current and next gameweek.
teamsarray
The twenty clubs with strength ratings split by home and away, attack and defence.
elementsarray
Every player — price in tenths of a million, ownership percentage, form, points, injury news and status codes. This is the bulk of the payload.
element_typesarray
Position definitions with squad limits and the naming used across the game.
element_statsarray
The scoring statistics tracked per player, matching the keys used inside `elements`.
total_playersinteger
How many managers are playing this season — the denominator for ownership percentages.

What you can build with the Fantasy Premier League API

  • Build an FPL transfer planner or price-change tracker
  • Analyse ownership and form to model differentials
  • Chart fixture difficulty across upcoming gameweeks
  • Answer chip-timing questions using the half-season windows

Common errors and how to fix them

404

The trailing slash was omitted.

Fix: The path is `/api/bootstrap-static/`. FPL's routing is strict about it.

Cross-origin request blocked

No Access-Control-Allow-Origin header is sent.

Fix: Call it from a server. A browser fetch will fail regardless of the absent authentication.

Player prices look wrong by a factor of ten

`now_cost` is in tenths of a million.

Fix: Divide by 10 for the price shown in the game. A value of 95 is 9.5m.

Endpoint behaviour changes without warning

It is undocumented and unsupported.

Fix: Pin nothing critical to a single field. Structures have shifted between seasons before, most recently around chips.

Fantasy Premier League API — frequently asked questions

Is there an official Fantasy Premier League API?

No. This is the endpoint the official web app calls, and it is publicly readable, but it is undocumented and carries no support or stability promise.

Do I need to log in?

Not for public game data — players, teams, gameweeks and rules are all open. Reading your own squad or a private mini-league requires a logged-in session cookie.

How large is the response?

Around a megabyte, covering roughly seven hundred players and everything else about the game. Fetch it once, cache it, and compute locally rather than polling.

Why does each chip appear twice?

Since the rework that split the season into two halves, chips are scoped by window. `start_event` and `stop_event` on each entry tell you which gameweeks that instance of the chip can be played in.

Tools that pair with this API

Fantasy Premier League is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.