fmplayer APIfmplayer.net ↗
Access Football Manager player profiles, attributes, contracts, and best roles across FM 18–26 databases via the fmplayer.net API. Search, filter, and bulk-list players.
What is the fmplayer API?
The fmplayer.net API exposes four endpoints covering Football Manager player data across nine game editions (FM 18 through FM 26). Use search_players to query the database by name fragment, nationality, age range, or ability thresholds and get back paginated rows of up to 50 players per page. Use get_player to pull a single player's full profile including every attribute group, contract details, best roles with scores, and similar player references.
curl -X GET 'https://api.parse.bot/scraper/be792d47-ce5c-4019-826b-1cace8f01386/search_players?name=saka&version=26' \ -H 'X-API-Key: $PARSE_API_KEY'
Searches the Football Manager player database of one game version and returns one page of up to 50 player summary rows (id, name, positions, club, age, nation, wage, contract expiry, value, current/potential ability). All filters are optional and combine with AND; omitting every filter lists the whole database sorted by current ability descending, the site's default. Pagination is by `page` (1-based, 50 rows per page, one upstream round trip plus one form-page load per call); `has_more`/`next_page` are derived from the site's own page-full signal, so the last page reports has_more=false. An unknown nation or attribute name yields a 422; numeric filter values the site rejects (e.g. an attribute threshold outside 1-20) also yield a 422. Zero matches is a valid empty `players` list.
| Param | Type | Description |
|---|---|---|
| name | string | Player name fragment; the site matches it as a substring (e.g. one shape: a surname). |
| page | integer | 1-based result page; each page holds up to 50 rows. |
| ca_max | integer | Maximum current ability. |
| ca_min | integer | Minimum current ability (site scale, roughly 1-200). |
| nation | string | Nationality name exactly as the site lists it (case-insensitive), e.g. one shape: Japan. Unknown names return a 422. |
| pa_max | integer | Maximum potential ability. |
| pa_min | integer | Minimum potential ability. |
| age_max | integer | Maximum age in years. |
| age_min | integer | Minimum age in years. |
| sort_by | string | Column to sort by. Omitted = the site's default ordering (current ability descending). |
| version | string | Football Manager database edition to search. |
| sort_dir | string | Sort direction; only applied when sort_by is given. |
| attribute | string | Name of one player attribute to threshold on, as the site spells it (e.g. one shape: Pace). Unknown names return a 422. Combine with attribute_min and/or attribute_max. |
| value_max | integer | Maximum transfer value in whole euros. |
| value_min | integer | Minimum transfer value in whole euros. |
| attribute_max | integer | Maximum value for `attribute` on the in-game 1-20 scale. Requires `attribute`. |
| attribute_min | integer | Minimum value for `attribute` on the in-game 1-20 scale (the profile pages display the same attributes multiplied by 10). Requires `attribute`. |
| positions_all | string | Comma-separated position codes (same code list as positions_any); a player must play ALL of them. Do not pass an array. |
| positions_any | string | Comma-separated position codes; a player matches if he plays ANY of them. Codes: gk, dc, dr, dl, wbr, wbl, dm, mc, mr, ml, amc, amr, aml, st (e.g. gk,dc). Do not pass an array. |
{
"type": "object",
"fields": {
"page": "integer page number served",
"count": "integer number of rows on this page",
"players": "array of player summary rows: player_id (string, feeds get_player), name, positions (array of codes), club, club_id, age, nation, wage_short/wage_detail (yearly wage, abbreviated and full euro text), contract_expires/contract_expires_detail, value_short/value_detail (or 'Not sale'), current_ability, potential_ability, profile_url",
"version": "game edition label the rows come from, e.g. FM 26",
"has_more": "boolean, true when a further page exists",
"next_page": "integer page to request next, or null on the last page",
"page_size": "integer rows per page (50)"
},
"sample": {
"data": {
"page": 1,
"count": 50,
"players": [
{
"age": 23,
"club": "Arsenal",
"name": "Bukayo Saka",
"nation": "England",
"club_id": "602",
"player_id": "28122642",
"positions": [
"AMR",
"AML"
],
"wage_short": "15M",
"profile_url": "https://fmplayer.net/fm-26/bukayo-saka-28122642",
"value_short": "170M",
"wage_detail": "€ 15.080.000 p/y",
"value_detail": "€ 169.545.610",
"current_ability": 181,
"contract_expires": "06-2027",
"potential_ability": 188,
"contract_expires_detail": "30 June 2027"
}
],
"version": "FM 26",
"has_more": true,
"next_page": 2,
"page_size": 50
},
"status": "success"
}
}About the fmplayer API
What the API Covers
The fmplayer.net API surfaces player data from Football Manager databases across FM 18 through FM 26. Every endpoint accepts a version parameter that selects the game edition. The four endpoints divide into two query patterns: targeted search/profile lookup (search_players, get_player) and bulk enumeration (list_players_bulk, find_player_page_count).
Searching and Reading Profiles
search_players accepts up to eight optional filter parameters — name, nation, ca_min, ca_max, pa_min, pa_max, age_max, and page — and returns up to 50 player summary rows per page. Each row includes player_id, name, positions (array of position codes), club, club_id, age, nation, wage, contract expiry, value, and both current and potential ability. The has_more and next_page fields let you walk pages programmatically. get_player takes a player_id from those results and returns the complete profile: a contract object with fields for Club, Wage, Expire, and Release clause when present; a badges array of personality and hidden-attribute labels; attribute groups; and best roles with numeric scores.
Bulk Enumeration and Page Counting
list_players_bulk fetches multiple result pages concurrently and returns all collected rows in one response, ordered by current ability descending. A compact boolean flag trims each row to player_id, name, age, nation, positions, club, club_id, current_ability, and potential_ability. The ultra_compact mode returns rows as value arrays aligned to a columns list, useful for large datasets. The max_pages input (clamped at 100) and optional limit bound the response size; start_page and the returned next_page let you resume. find_player_page_count runs a binary search to determine the exact last_page and total_players for any filter combination without returning player rows. If the execution budget is exhausted before completion, complete is false and low_page/high_page bounds are returned so a follow-up call can resume the search.
Filtering and Pagination Notes
Nationality values passed to nation must match the site's own spelling exactly (case-insensitive); unrecognized values return empty results rather than an error. Ability scores follow the FM in-game scale of roughly 1–200. Pages are 1-based and each holds a maximum of 50 rows across all endpoints.
The fmplayer API is a managed, monitored endpoint for fmplayer.net — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when fmplayer.net changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official fmplayer.net API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a scouting dashboard that filters players by
ca_min,pa_min,age_max, andnationacross FM editions - Populate a squad planner by bulk-fetching all players for a specific FM version with
list_players_bulk - Compare a player's best-role scores and attribute groups between FM editions using
get_playerwith differentversionvalues - Calculate the total player count for a filtered ability range before committing to a full bulk fetch using
find_player_page_count - Surface contract details — wage, expiry, and release clause — to identify out-of-contract or affordable targets
- Generate 'similar players' lists by reading the comparable player references returned in a full profile from
get_player - Export a compact ranked list of all players in a given FM edition sorted by current ability for spreadsheet analysis
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does fmplayer.net have an official developer API?+
What does `get_player` return beyond what `search_players` provides?+
get_player returns the full attribute breakdown across all attribute groups, best roles with numeric scores, a badges array for personality and hidden attributes, and a complete contract object that includes the release clause when one is set — none of which appear in the summary rows from search_players.Can I retrieve club rosters or filter players by club name?+
search_players and list_players_bulk do not currently accept a club name as a filter parameter. You can retrieve a player's current club from summary rows (club, club_id fields) and from the contract object in get_player. You can fork this API on Parse and revise it to add a club-based filter endpoint.Does the API cover real-world player stats, match performance, or FIFA/EA FC data?+
What happens if `find_player_page_count` runs out of time before finishing?+
complete: false along with low_page and high_page bounds from the binary search so far. Pass those two values back as inputs on a follow-up call to resume from where it stopped. Once complete is true, last_page and total_players hold the exact figures.