Keller made his professional debut that year with the Arizona League Diamondbacks and was later promoted to the Missoula Osprey.[2][4] In 15 games (13 starts), he posted a 7–3 record and 2.44 ERA. In 2014, he pitched for the Arizona League Diamondbacks, Missoula and Hillsboro Hops,[5] going 6–4 with a 4.31 ERA over 15 games (12 starts). Keller pitched for the Kane County Cougars in 2015, going 8–9 with a 2.60 ERA over 26 games (25 starts), the Visalia Rawhide in 2016 where he went 9–7 with a 4.47 ERA in 24 starts, and 2017 with the Jackson Generals,[6] where he posted a 10–9 record and 4.68 ERA in 26 starts.[7]
Keller made the 25-man roster for the Royals in 2018[10] and had his MLB debut on Opening Day, March 29, pitching an inning of scoreless relief against the Chicago White Sox; he struck out the first batter he faced, Adam Engel.[11] He split time between the bullpen and the rotation, leading the team in ERA (3.08) and tied for first on the team in wins (9). He struck out 96 batters in 140+1⁄3 innings. On April 19, 2019, Keller received a five-game suspension by Major League Baseball, which concluded he intentionally threw a pitch that hit Tim Anderson of the Chicago White Sox.
On July 7, 2020, it was announced that Keller had tested positive for COVID-19.[12] Ten days later, he was cleared to return to the Royals’ Summer Camp after producing two negative tests at least 24 hours apart.[13] On September 13, 2020, Keller pitched the first complete game shutout of his career against the Pittsburgh Pirates, allowing five hits (only one for extra bases) and one walk, striking out two batters.[14] With the 2020 Kansas City Royals, Keller appeared in nine games, compiling a 5–3 record with 2.47 ERA and 35 strikeouts in 54+2⁄3 innings pitched.[15] In 2021, he started 26 games and posted an 8–12 record, a 5.39 ERA and 120 strikeouts in 133+2⁄3 innings.
On August 18, 2022, Keller was moved to the bullpen after struggling to begin the year. On September 22, he tossed a scoreless ninth inning against the Minnesota Twins to earn his first career save.[16] In 35 appearances (22 games), he pitched to a 6-14 record and 5.09 ERA with 102 strikeouts in 139+2⁄3 innings of work.[17]
On May 19, 2023, after nine starts, Keller was placed on the injured list with right shoulder impingement syndrome.[18] On August 16, he was transferred to the 60–day injured list.[19] Keller was activated from the injured list on September 9.[20]
Chicago White Sox
On March 8, 2024, Keller signed a minor-league contract with the Chicago White Sox.[21] After three starts for the Triple–A Charlotte Knights, the White Sox added Keller to their major-league roster on April 28.[22] On May 14, the White Sox announced that Keller would be moved to the rotation to assume the spot vacated by Michael Soroka.[23] However, he was designated for assignment on May 20. In five games (two starts) for the White Sox, Keller logged a 4.86 ERA with 13 strikeouts in 16+2⁄3 innings.[24] He elected free agency on May 22.[25]
Boston Red Sox
On May 26, 2024, Keller signed a major-league contract with the Boston Red Sox.[26] In 10 games for the Red Sox, he compiled a 5.66 ERA with 17 strikeouts and 1 save across 20+2⁄3 innings pitched. On August 13, Keller rejected an optional assignment to the Triple–A Worcester Red Sox and elected free agency.[27] The next day, he re–signed with Boston on a minor-league contract.[28] He had his contract selected to the major league roster a second time on August 26.[29] Keller gave up 5 runs (3 earned) in a start against the Toronto Blue Jays before he was designated for assignment again on August 27.[30] He elected free agency once more on August 29.[31] On September 1, Keller re–signed with the Red Sox organization on a minor league contract.[32] He elected free agency on November 2.[33]