Skip to main content

fc-clubs-api

PyPI Python CI Docs License: MIT

An unofficial Python client for the EA Sports FC 27 Pro Clubs API, the same endpoints proclubs.ea.com calls from the browser. Find clubs and get their stats, members, match history and per-player match ratings as EA's raw JSON, clean Python records or pandas DataFrames.

from fc_clubs_api import FC27API

api = FC27API()
club_id = api.find_club_id("Your Club Name")
api.get_club_matches(club_id)    # last 10 league matches, as a list of dicts

Documentation · Getting started · API reference · EA endpoints · Changelog

Features

  • Three output formats: raw JSON, typed records, or a pandas dataframe, set per client or per call.
  • No required dependencies. The core is standard library only; pandas is an extra.
  • Every known club endpoint: search (all-time and current season), details, overall stats, member and career stats, matches, per-player match stats.
  • Matches from your side: opponent, score, result (win/draw/loss) and dnf, correct for league matches and friendlies.
  • 80+ decoded match events EA doesn't name: pass direction and length, possession won by pitch third, positioning, in-game feedback.
  • Crest, division and reputation images, with the crest fallback rule.
  • Timezone-aware timestamps, consistent camelCase columns, fully typed, a fc-clubs CLI.

Install

Python 3.9 or newer.

pip install "fc-clubs-api[pandas]"   # with DataFrame output (analysis, notebooks)
pip install fc-clubs-api             # no dependencies (apps, bots, APIs)

No API key needed; the data is public.

Output formats

The same data, three ways. records is the default, so a plain install needs no pandas.

Format Returns For
"raw" EA's JSON exactly as received storage, proxies, fields not mapped here
"records" list[dict]: flat, typed, renamed, timestamps as datetime backends, bots, JSON APIs
"dataframe" pandas.DataFrame with the same columns as records analysis, CSV/Excel
from fc_clubs_api import FC27API

api = FC27API(timezone="Europe/London")

api.get_member_stats(1001)                       # list of dicts (default)
api.get_member_stats(1001, output="raw")         # {"members": [...], "positionCount": {...}}
api.get_member_stats(1001, output="dataframe")   # DataFrame (needs pandas)

FC27API(output="dataframe")                      # DataFrames for every call

More on output formats →

Methods

Method One row per
find_club_id(name) returns the club id (int)
search_club_by_name(name, scope="all_time") matching club; scope="current_season" for this season
get_club_details(club_id) club: name, ids, stadium, crest
get_club_overall_stats(club_id) club: record, goals, streaks, skill rating
get_member_stats(club_id) member: this season's games, goals, assists, rating, pass/tackle rates
get_member_career_stats(club_id) member: career totals at the club
get_club_matches(club_id, match_type, count) match: opponent, score, result, dnf
get_match_players(club_id, match_type, count) player per match: rating, goals, passes, tackles, ...
get_playoff_achievements(club_id) achievement (EA has only returned [] so far)
get_json(endpoint, params) any endpoint, raw
  • Every data method takes output=. Most take all_columns=True for every field EA sends, with EA's names.
  • match_type: "leagueMatch" (default), "friendlyMatch", "playoffMatch", or MatchType.LEAGUE etc. count is capped at 10 by EA, with no paging.
  • get_match_players(..., both_teams=True, include_events=True) adds the opponents and the decoded event stats.

Examples

from fc_clubs_api import FC27API

api = FC27API(timezone="Europe/London")
club_id = api.find_club_id("Your Club Name")

# Top 5 scorers this season
members = api.get_member_stats(club_id)
members.sort_values("goals", ascending=False).head(5)[["name", "goals", "assists"]]

# Average match rating per player, best first
players = api.get_match_players(club_id)
players.groupby("name")["rating"].mean().sort_values(ascending=False)

# Where does each player win the ball back? (decoded match events)
events = api.get_match_players(club_id, include_events=True)
events.groupby("name")[["possessionWonDefensiveThird", "possessionWonMiddleThird",
                        "possessionWonAttackingThird"]].sum()

More in the recipes and examples/. From the terminal:

fc-clubs "Your Club Name"            # recent matches and squad, or --json

Errors

All network and response problems raise FC27APIError (subclasses FC27HTTPError with .status_code, FC27ConnectionError, FC27ResponseError). find_club_id raises ClubNotFoundError or AmbiguousClubError (with .candidates), both ValueErrors. Details →

Good to know

  • EA blocks non-browser requests. Every request sends browser-like headers (fc_clubs_api.HEADERS); without them EA answers 403 or not at all.
  • No caching or rate limiting. Every call goes straight to EA. Pause between requests (time.sleep(1)) when looping over many clubs.
  • Unofficial. Not affiliated with or endorsed by EA. The endpoints are undocumented and can change without notice.

Contributing

Bug reports are especially welcome when EA changes something and the client breaks. Please open an issue before writing code. See CONTRIBUTING.md.

Acknowledgements

The current-season endpoint, crest rules and match event mappings build on the community EA FC Pro Clubs API research project.

License

MIT, see LICENSE.md.

Metadata

Release files for fc-clubs-api 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fc-clubs-api 0.3.0
File Size Uploaded
fc_clubs_api-0.3.0.tar.gz 30.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fc-clubs-api 0.3.0
File Interpreter ABI Platform
fc_clubs_api-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 56.2 kB

Release files / fc_clubs_api-0.3.0.tar.gz

Download URL fc_clubs_api-0.3.0.tar.gz
Size 30.3 kB
Tags Source
SHA-256 checksum
How to use checksums
f99e05dba2559ca4cbccc6b0ea504be9a6ea5f3aa1ff9552eb17ed143c18cfcb
BLAKE2b-256 checksum
How to use checksums
e7c8a26a659fad6392ca4bb38eb9a49c5765b3e0f755e90b4458f36cf66369fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.

Transparency log

Release files / fc_clubs_api-0.3.0-py3-none-any.whl

Download URL fc_clubs_api-0.3.0-py3-none-any.whl
Size 26.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6902b5e783153e504078d20a6bd8f234ec3ba3560cdae6cff4c12445156d1ebb
BLAKE2b-256 checksum
How to use checksums
360f9a64f27927b1a3763c2b4741842770acb471c773a506371e538ef837d608
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page