Swansea City
A highly regarded prospect of the Hull City academy side, James joined Swansea City in 2014 for an initial fee of £72,000, immediately becoming part of their U18 academy side. By the 2016–17 season, James had become an integral part of the Swansea U23 side who gained promotion to the PDL Division 1, winning the league by an 11-point margin. Additionally, James contributed to the side winning the Premier League Cup, and reaching the semi-finals of the Premier League International Cup and the quarter-finals of the EFL Trophy.
Following his impressive displays in the development squad, James was included in the first-team squad for the first time in January 2016 for the FA Cup defeat to Oxford United. Although James did not make an appearance off the bench, his progress was deemed sufficient for him to be offered a new three-year contract the following week. He was again named on the bench for a Premier League fixture against Stoke City in October 2016.
On 30 June 2017, James signed for League One club Shrewsbury Town on loan until the end of the season. His loan deal was terminated by mutual consent on 31 August 2017, after he failed to force his way into the starting 11. James' only inclusion in a matchday squad was as an unused substitute in an EFL Cup first round tie against Nottingham Forest.
On 6 February 2018, he made his Swansea first-team debut as a late substitute, scoring in the 82nd minute of an 8–1 FA Cup victory over Notts County.
He made his league debut for Swansea on 17 August 2018 in a 0–0 draw against Birmingham City in the EFL Championship. He scored his first league goal for the club on 24 November 2018 in a 4–1 home defeat against Norwich City. In December 2018, with James now a regular and one of the standout performers for Swansea, manager Graham Potter revealed that the club were looking to open talks with James over a new contract. Despite discussion of a move to Leeds United during the January 2019 transfer window, James was named in the starting line-up for Swansea against Birmingham City on 29 January, with James scoring his second goal of the season in a 3–3 draw.
On 31 January 2019, with James expressing his desire to leave Swansea to join Leeds, a structured £10 million fee was agreed between the two clubs, James agreed terms and completed the medical at Leeds, and was at Elland Road conducting signing interviews and announcement photoshoots ahead of the deal being completed. However, after speculation of a disagreement between Swansea owners and their chairman regarding the structure of the deal only an hour before the transfer window's 11 pm deadline, James was left at Elland Road awaiting the deal to be signed off by Swansea, with the window closing at 11 pm.
After Swansea failed to complete the deal, James' agent said it was "very disappointing", stating: "Swansea made no attempt to keep the player and at the first sign of money they couldn't show him the door quickly enough." At the end of the 2018–19 season, with Leeds missing out on automatic promotion, Leeds head coach Marcelo Bielsa said that he refused to blame the club for missing out on James, but said, "I'm not underlying the importance of the absence of James".