Birmingham City James was a member of the
Birmingham under-18 team that finished as runners-up in the Northern Section of their league, and came from behind against
Charlton Athletic's U18 in the national semi-finals only to lose to a last-minute goal. As well as playing for the under-18s, he started several matches for Birmingham's under-23 team in the 2021–22
Premier League 2. He trained occasionally with the first team, and was given a
squad number and named in the matchday squad for the
EFL Championship match at home to
Bristol City on 2 November. With only a few minutes left, Birmingham led 3–0, and the 17-year-old James came on in place of
Jordan Graham to make his senior debut. Manager
Lee Bowyer said "He came on today, ran around, didn't give the ball away, competed and when he passed, he passed it with a purpose." With both
Ryan Woods and
Gary Gardner suspended, James made his first start against
Blackpool on 27 November, partnering
Ivan Šunjić in central midfield in a
3–4–1–2 formation. He played the whole game, headed
Kristian Pedersen's cross into the path of
Lukas Jutkiewicz who scored the 81st-minute winner, and was the
Birmingham Mail man of the match. On the same day, James signed his first professional contract.
Rennes On 12 August 2024, James signed for
Ligue 1 club
Rennes on a four-year deal for an undisclosed fee, reported by
BBC Sport to be £4 million. An unused substitute in the first week of
the Ligue 1 season, he made his debut in the second, as a second-half substitute as Rennes lost 3–1 away to
Strasbourg. ==International career==