Onze Maison

How the values are built

Every number on this site is arithmetic you could run yourself. Same data in, same number out, every time — no language model is anywhere near it. This page is the whole recipe: which sources outrank which, what the estimator is, exactly what it is fed, and the things it is provably bad at.

First

Four rungs, in this order

For every graduate we walk down this ladder and stop at the first rung that holds. The badge next to his value tells you which one it was, on every single card — a number without its provenance is not published here.

  1. 1

    A reported valuation fact, with its receipt

    REPORTED

    Someone bid €X and was turned down. A contract announcement names a release clause. A club states a price. These are facts about the market, reported by a named outlet on a dated page, and they beat everything else — because they are the only evidence that exists for players nobody has actually sold. Each one is entered by hand with its source URL and an expiry date, and the card on the site prints the source. When the expiry passes, the anchor is deleted rather than extended, and the player drops back to the model.

  2. 2

    A real transfer fee, actually paid

    FEE

    If a club paid a disclosed fee for him in the last twelve months, that fee is the value. Full stop, no modelling. That is a measured choice, not deference: in our own transfer table, players resold within a year of a paid fee fetched more than that fee on average, not less — every formula we tested for easing a fresh fee toward our estimate would have moved the published number away from the price that followed. It also means a recently-bought player will often carry a bigger number here than on the valuation sites for a while: they drift back from their own pre-transfer estimate slowly, and we print the price a club actually paid, with its source. Between twelve and thirty-six months the fee stops being the answer and becomes the floor: a nineteen-year-old who has exploded since his move may be worth more than his price tag, but nobody is ever valued below what someone recently paid. Past thirty-six months a fee is history, and the card says so.

  3. 3

    The model's estimate

    EST

    No fee, no reported fact — so we estimate. That estimate comes from decision trees trained on fees that were really paid and really disclosed, described in full below. This is where most of the site's numbers come from, and it is the only rung where the number is ours rather than someone else's.

  4. 4

    A published formula, as the last resort

    EST

    When a player's record is too thin for the model — no date of birth, no resolvable position — a plain formula steps in: a base value from an age table, multiplied by a position factor, multiplied by his club's strength, boosted by his international caps. Every constant is in a public config file. It is crude on purpose, and it covers about one per cent of graduates.

Rungs 1 and 2 are somebody else’s number and we print their receipt. Rungs 3 and 4 are ours, and they wear the EST badge so you always know the difference.

Rung three

What the model actually is

It is a gradient-boosted decision tree ensemble — a few hundred small trees, each one correcting the last one’s mistakes. It is not a neural network, it does not read text, and it has no opinions. It has only ever been shown one kind of thing: transfer fees that were really paid and publicly disclosed, parsed from Wikipedia’s per-window transfer lists, together with the buying club, the date, and the player’s record.

Old fees are restated in today’s money first. The correction is not an economic index we found somewhere — it is derived from our own transfer table, as the median disclosed fee per twelve-month window, smoothed, with the most recent window set to 1.0. Football inflation measured with football fees.

The model predicts the logarithm of the fee, not the fee, so it is fitted on proportional error: being €4m out on a €10m player is the same size of mistake as being €40m out on a €100m one. The result is then clamped between €0.5m and €222m, the all-time record fee — a guardrail, not a judgement. One editorial constant sits on the end: a market-level multiplier, currently 1, which exists so the whole output can be re-levelled against published press aggregates if it drifts. At 1 it does nothing at all.

2,708

fees trained on

2010-01-30 → 2026-08-18

27

inputs per player

listed in full below

€14.1m

mean error

on 85 real fees held back from training

€8.2m

median error

half our estimates land closer than this

€222m

biggest fee it has seen

it cannot predict above this

47

fees over €80m

in the entire corpus

The inputs

All 27 of them, and nothing else

This is the complete list. There is no scout report in here, no hidden adjustment, and no field where anybody types a number they like. If a fact about a player is not on this list, it did not move his value.

Ageage
His age on the valuation date, to the decimal. The strongest single signal in football pricing: the same player is a different asset at 22 and at 31.
Positionpos_GK · pos_DEF · pos_MID · pos_FWD
Four on/off switches — goalkeeper, defender, midfielder, forward — of which exactly one is lit. Keepers and forwards have never been priced alike and the model is not asked to pretend otherwise.
Career appearancestotal_apps
Every senior and loan appearance across his career, added up. Proof he plays, not just that he is signed.
Career goalstotal_goals
Goals in those appearances. Worth a great deal for a striker and very little for a centre-back, which is why the model sees position too.
Last season's formls_apps · ls_goal_contrib · ls_contrib_per_app · form_trend
Appearances and goals + assists in the last completed season, read from the career-statistics table on his Wikipedia article — as totals, as a per-game rate, and as a trend against the season before it. Career totals cannot see a breakout season; these can. On the historical fees the model trains on they are computed as of the transfer date, so the model never reads a player's future. When the article has no season table, or its table stops before the season in question, the model is handed a BLANK rather than a zero.
Last season's assistsls_assistsone-way
Assists in the last completed season, read from the French and Spanish Wikipedia statistics tables — the English career tables almost never carry an assists column, and without one every creator reads as a mediocre finisher. A source is only believed for a player once its league appearances and goals agree with the English record on at least two seasons; a parser gone wrong on some exotic table then costs coverage, never poisons a value. When no source passes that gate, the model is handed a BLANK rather than a zero. More assists can only raise an estimate, never lower it.
The experts' voteballon_recentone-way
His best Ballon d'Or ranking over the three closed years before the reference date — the vote lands in autumn, so a summer transfer can never read the award that follows it. This is the one public, dated, freely-licensed measure of what experts think a player IS, and it exists precisely for the players counting stats cannot see: the metronome who runs a treble-winning side on fifty appearances and seven goal contributions. Never nominated is a BLANK, not a zero — most of football is unranked and that is not missing data. The same votes also ground a corpus floor: no prime-age player ranked top 15 within three years has sold below the published figure in our fee corpus, and when that floor holds an estimate up, the card says so with its n.
Last season's league starts, at levells_apps_at_level · share_rawone-way
How much of the last completed season's league programme he actually played (appearances over a 38-game season), and those appearances weighted by the strength of the club he played them for — 28 games at a Champions League club outweigh 38 in a relegation fight. Goals and assists price attackers; a defender's market signal is starting league games regularly at a good club, and this is that signal. The share counts every league appearance whether or not we can identify the club; the level weight is a BLANK, not a zero, when the clubs cannot be identified, and a season for a reserve side counts as zero level, deliberately.
The strength of his leagueseller_lg
The median Elo of the clubs in his current club's (country, division) cohort — the strength of the LEAGUE he plays in, as opposed to the strength of his club. A strong club in a weak league (AEK Athens: club rating ~1640, Greek top-flight cohort ~1360) resells into a very different market than the same rating inside the Bundesliga, and club rating alone cannot say so. On the historical fees the model trains on, this is computed for the club that SOLD the player — the club he was at when the fee was agreed — which is exactly what the current club is at valuation time. A club in no rated league is a BLANK, not a zero.
Appearances at a club on this boardranked_apps
How many of those games were for the FIRST team of one of our 160 academies. Reserve sides — Barcelona B, Bayern II, Real Madrid Castilla — are stripped out, because fourth-tier reserve football counting as "played at a big club" was quietly inflating a fifth of this feature.
Appearances per year since his debutapps_per_year
Playing time as a rate rather than a total, so a 33-year-old squad filler does not out-score a 21-year-old who starts every week.
Appearances per year of adulthoodage_apps
Appearances divided by (age − 16): how much senior football he has played for how young he is. The signature of a player brought through early.
Senior international capssenior_capsone-way
Games for the full national team. The clearest public verdict on a player that does not come from a transfer market.
Senior caps in the last two yearscaps_last_24mone-way
Of those caps, the ones won in the current or previous calendar year — read from the per-year international table on his Wikipedia article, with the infobox national-team rows as the fallback. A career total cannot tell a 30-cap retiree from a 9-cap current international; this can. When neither source can place his caps in time, the model is handed a BLANK rather than a zero.
Youth international capsyouth_caps
U-17 to U-21 selections. What his country thought of him before anyone had bought him — which is most of what there is to know about a teenager.
Honours wonhonours_countone-way
How many honours his Wikidata record lists.
Honours, weightedhonours_weightone-way
The same honours, but a Ballon d'Or is not a league title. The weights are in a public config file: Ballon d'Or 30, a World Cup 15, the Kopa Trophy 15, a Champions League 8, a domestic title 3, anything unlisted 1.
Wikipedia readershiplog_pageviewsone-way
The logarithm of his median monthly Wikipedia pageviews. Our only measure of public attention — how many people go and look him up — and a decent stand-in for the noise around a player that fee data alone never captures.
Famous and youngfame_youthone-way
Readership multiplied by (30 − age), floored at zero. It exists because the fee history contains no sale of a generational teenager at all, so nothing else in the model can reach those numbers. It is the one input that is openly an extrapolation — and the reason the ladder above puts reported facts on the top rung.
His current club's strengthelo
The Elo rating of the club he plays for today, from ClubElo, falling back to a published per-league table. If neither can place his club, the model is handed a BLANK rather than a low number — a club we cannot identify is missing information, not a bad club, and conflating the two was worth a systematic error.

The inputs marked one-way carry a hard constraint: the model is forbidden from ever lowering a value when one of them goes up. Winning another cap, another trophy, or gaining readers cannot make a player cheaper. That is not something the data taught it — it is a rule we imposed, because the alternative is a model that occasionally produces an insulting number for a reason no one can explain.

The uncomfortable part

What it cannot do

It cannot price a player nobody has sold. Decision trees do not extrapolate. Whatever the largest fee in their training data is, that is the highest number they can produce, for anyone, ever. Ours is €222m, and only 47 disclosed fees in the whole corpus clear €80m. So the very best players — the ones whose clubs would never sell them, who therefore generate no fee for anyone to learn from — come out systematically low. This is not a bug we are about to fix; it is what a fee-trained estimator is. It is also the entire reason rung 1 exists: when the press reports a rejected bid or a release clause, we use that instead and show you the article.

It is often wrong, and we publish by how much. Every run trains on the older fees, then predicts the last 120 days of real disclosed fees it has never seen — 85 of them. The average miss is €14.1m and the median miss €8.2m, the gap between them being the handful of big transfers it gets badly wrong. Treat every EST on this site as a number with that much air around it.

Its view of the market is English-language. Fees are parsed from Wikipedia’s “List of English football transfers” pages, because those are the ones that carry machine- readable amounts. Deals between two Serie A clubs, or two Brazilian ones, are largely invisible to it — so it has learned what the Premier League pays more thoroughly than what anyone else pays.

It reads today’s record on yesterday’s transfer. Appearances, goals, honours and readership are current totals, used even for a fee paid three years ago — no historical snapshot of those numbers exists in open data. Club strength is likewise today’s Elo table, not the table on the day of the deal. Both make the model slightly too clever about the past, and we would rather say so than bury it.

It has never seen a fee that was not disclosed. Undisclosed fees, add-ons, sell-on clauses and swap deals are all outside its world. The number it produces is an estimate of a headline fee, not of a club’s accounting.

When we get one badly wrong and the player then moves, the miss goes in the ledger with the real fee next to it. The track record keeps the bad calls as carefully as the good ones.

You asked directly

No language model touches the number

The valuation pipeline is Python, SQL and scikit-learn. There is no model of language in it, no API call to one, and no place where free text becomes a euro amount. Run it twice on the same snapshot and you get the same numbers to the cent: the training data is fixed by the snapshot date, the algorithm is deterministic, and the one random element — the seed the trees are built with — is pinned to a constant in the source. The estimate on a card is a pure function of the published data.

A language model does appear in this project, once, in a role with no write access to anything: as an auditor. It reads a published value, searches the web, and reports whether a named outlet has published a relevant FACT — a bid, a clause, a club statement, a fee. It returns flags and URLs. It is explicitly forbidden from supplying a valuation of its own, and if the only figure it can find traces back to a valuation aggregator, the required answer is “no fact found” and our number stands unchanged. Anything it flags is read by a human, who writes the anchor by hand with the source URL and an expiry date, or does not.

An LLM that “recalls” a player’s market value is quoting an aggregator from its training data. That is why it is never asked. No value from Transfermarkt or any other valuation database is scraped, stored, cited or laundered through anything in this project; the whole dataset is built from Wikidata (CC0), Wikipedia (CC BY-SA), ClubElo and named press articles.

You do not have to take any of this on faith — this page IS the algorithm, spelled out in full: every input the model receives, every rung of the ladder, every bound and every guard. If a number still looks wrong after reading it, write to us and we will show the receipts.

If we are wrong

How to challenge a number

Open an issue. Tell us the player and what you think is wrong, and if you have one, attach the thing that settles it: a link to an article reporting a bid, a clause, a completed transfer or a club statement, with its date. That is what we can act on — a reported fact becomes an anchor at the next refresh, and the card starts showing your source.

What we cannot act on is a figure from a valuation site, however confident. It is not a fact about the market, and it is not something we are able to cite. “He is obviously worth more than that” is welcome too, mind — it is often right, and if it is right about several players at once it is a model problem rather than a data problem, which is more useful to us than any single correction.

Write to us · corrections ship with the next refresh, each one logged with its reason. Wrong positions, missing graduates and eligibility arguments go to the same place — the rules cover those.

Data as of 2026-08-19 · rules phase0-r1r16-v1 · values gbt-v2.5 · model fitted 2026-08-17. Not affiliated with any club, league or federation.