Born in Chelmsford, James began his playing career with Colchester United where he had been a member of the Academy since the age of nine. James featured for the Colchester under-18 side for the first time in October 2013 in a 3–1 win over Stevenage in the Youth Alliance Cup. This came in the same season that Colchester's under-18 side won both their Football League Youth Alliance South East league and the national cup. In July 2015, James and fellow academy graduate Tariq Issa committed themselves to the club by signing four-year professional contracts. He was then named on the bench for a first-team game for the first time on 20 October as an unused substitute in Colchester's 2–1 win over Port Vale. Caretaker managerSteve Ball handed James his professional debut on 8 May 2016 during Colchester's final game of the season. He was introduced as a 64th-minute replacement for Joe Edwards, who had suffered an injury in a 2–1 defeat against Rochdale at the Colchester Community Stadium. Ahead of the 2016–17 season, James agreed a new four-year contract with the club just one year into his existing four-year deal. He made his first appearance of the new season on 4 October 2016 as a substitute in Colchester's 2–1 defeat to Southampton U23 in the EFL Trophy. He made his first professional start on 21 February in the U's 1–0 win at home to Wycombe Wanderers, playing the full 90-minutes. In the latter stages of the season, James began to establish himself in the first-team following his first start and clean sheet against Wycombe. He revealed that his preferred position is a sweeper role which gives him "more license with the ball". He ended the season having made 15 first-team appearances. On 2 February 2018, James signed for hometown club Chelmsford City on loan until the end of the season. He made his debut the following day in a 2–0 victory against Chippenham Town. On 31 August 2018, James signed for National League side Braintree Town on loan until January 2019. He made his debut on 1 September in Braintree's 1–1 draw at Boreham Wood. He was recalled early from his loan spell in November 2018 after 12 league appearances for Braintree. Just over a month later, James returned to Braintree Town for a further month's loan. He scored his first senior goal on 29 December with a match winning header 22-minutes from time in Braintree's 1–0 victory at Maidenhead United. His loan was extended again for another month on 18 January 2019. On 8 November 2019, James joined National League South side Maidstone United on loan for a month. After his Maidstone loan, James joined Welling United alongside Colchester teammate Diaz Wright on loan for one month on 10 January 2020. He made his debut the next day in a 1–0 defeat to Wealdstone. He scored his first goal for the club in a 3–2 victory against Hungerford Town on 18 January. His loan was extended for a further month on 4 March.
Career statistics
Honours
;Colchester United U18
2013–14 Football League Youth Alliance South East winner