*Club domestic league appearances and goals, correct as of 21:56, 29 September 2024 (UTC) ‡ National team caps and goals, correct as of 13:01, 27 July 2019 (UTC)
James joined Cardiff City at under-9 level and signed his first professional contract with the club in April 2014.[4] James made his professional debut for Cardiff against Chelsea on 11 May 2014, coming on as an 89th minute substitute for Fraizer Campbell in a 2–1 home loss.[5]
On 13 January 2017, James signed for League Two side Yeovil Town on a contract until the end of the 2016–17 season, after his contract with Cardiff was cancelled by mutual consent.[6] In January 2018 James signed a contract extension with Yeovil Town until the end of the 2018–19 season.[7] On 1 August 2018, Yeovil accepted a bid of £400,000 from Championship side West Bromwich Albion for James.[8] The move fell through the following day after James failed to agree personal terms with the Championship club.[9]
James moved to Scottish Premiership club Hibernian in June 2019 for an undisclosed fee, signing a three-year contract.[10][11] He scored his first goal for Hibernian in a 2–0 Scottish League Cup win over Alloa Athletic on 20 July 2019.[12] On 17 September 2020, James moved on loan to Wigan Athletic until January 2021.[13][14] He scored his first goal for Wigan in a 2–1 win away at Portsmouth on 26 September 2020.[15] On 18 January 2021, James moved on loan to Salford City until the end of the 2020–21 season.[16] He was cup-tied for Salford's victory in the 2020 EFL Trophy Final (played in March 2021).[17]
James left Hibernian permanently in July 2021 and signed a one-year contract with Leyton Orient.[18] In May 2022 he signed for a further two years at Orient.[19]