DETROIT (AP) -- When the Kansas City Royals acquired Brad Keller during last winter's Rule 5 draft, they committed themselves to keep him on the roster all season.
As it turned out, that hasn't been a problem.
Keller pitched seven strong innings as the Royals held on to beat the Detroit Tigers 3-2 on Sunday.
Keller (9-6) allowed one run on three hits, walking three and striking out two. He improved to 5-1 with a 2.25 ERA in his last eight starts.
"The first three or four innings, he was dead-on mechanically and just banging in strike after strike," Royals manager Ned Yost said. "After that, he was still fighting it a bit, but he hung in there and gave us seven more strong innings."
Keller has only allowed more than two earned runs once since August 7.
"I was attacking them with my fastball, mostly," he said. "They were sitting on my slider a little, so I went after them with the heater."
The teams split the four-game series that finished Detroit's home season. The Royals won the season series 11-8.
The Tigers finished 38-43 at home, four games better than 2017, but drew 1.86 million fans -- the fewest since they had 1.37 million while losing 119 games in 2003.
"We wanted to win this one for our fans," Tigers manager Ron Gardenhire said. "We've got 90-some losses, but they were still standing and cheering until the last pitch."
The Royals led 3-1 in the ninth. Niko Goodrum led off the inning with a bunt single off Wily Peralta. Ronny Rodriguez added a one-out base hit, and Grayson Greiner walked to load the bases.
Victor Reyes hit a sacrifice fly to pull the Tigers within 3-2 before Peralta struck out Jim Adduci to earn his 13th save.
"Wily makes it a tightrope walk, but he's 13-for-13," Yost said. "They got a perfect bunt and a big walk, but he didn't panic. He just kept making pitches."
Daniel Norris needed 98 pitches to complete five innings, allowing one run on six hits and two walks. He struck out three.
"I didn't have any kind of command, so I was in three-ball counts on almost every hitter," he said. "The only thing I could count on was my slider, so I just kept trying to spin that in there to get out of trouble."
The Royals took a 1-0 lead in the first on Adalberto Mondesi's 12th home run and could have added to the margin in the third. Kansas City loaded the bases with one out, but Hunter Dozier grounded into an inning-ending double play.
Kansas City stranded two more batters in the fourth but had pushed Norris' pitch count to 84.
"That's the thing with Daniel -- he might get into trouble, but he's always going to give everything he's got to get out of it," Greiner said. "We were trying to find pitches that would work."
Jeimer Candelario led off the fourth with a single -- Detroit's first hit -- and Christin Stewart moved him to third with a hit-and-run single before Nicholas Castellanos tied the game with a sacrifice fly.
The Royals regained the lead with two runs in the sixth off Drew VerHagen (3-3). With two out, Alcides Escobar and Rosell Herrera singled before Herrera stole second. Cam Gallagher blooped a ball to shallow left, and Stewart couldn't make a sliding catch.
"When (Keller) is dominating like that, you just want to get him some runs," Gallagher said. "I hit that ball pretty weakly, but it got down in front of the outfielders. That's how this works."
GET IN THERE
Harold Castro made his major league debut, entering as a pinch-runner for Greiner in the ninth.
Tigers: CF JaCoby Jones missed the game after aggravating a shoulder injury while attempting a diving catch on Saturday.
Royals: Start a two-game series in Cincinnati on Tuesday. Eric Skoglund (1-5, 5.60 ERA) starts the opener against Matt Harvey (7-9, 4.92).
Tigers: Begin a three-game series in Minnesota on Tuesday, with Spencer Turnbull (0-1, 10.80) taking the mound.