In a game where offence was an afterthought, the scoreless stalemate ended in fitting fashion: a walk-off error.

Melky Cabrera couldn't corral Nick Punto's double with one out in the 12th inning, sending the Oakland Athletics to a 1-0 victory over the Toronto Blue Jays on Friday in front of an announced crowd of 22,322 at the Coliseum.

"I'm sure they were ready to go home and get the barbecues started," Punto said.

Derek Norris led off the rally with a walk by Chad Jenkins (0-1), who tossed two innings of relief. After Jed Lowrie lined out, Punto poked a slicing double down the line in left.

Cabrera moved to his right to cut off the ball, which squirted by his glove for an error. Norris, who runs well for a catcher, hustled from first for an odd ending to a game highlighted by stellar pitching performances by Oakland's Tommy Milone, Toronto's Marcus Stroman and both bullpens.

Marcus Stroman

Toronto batters were unable to help out starter Marcus Stroman, who went seven innings and struck out seven. (Ben Margot/The Associated Press)

"That's the definition of a pitching duel," Milone said. "It's exciting. It's fun to watch. But it was about that time."

Dan Otero (7-1), the fifth Oakland reliever to toss a scoreless inning, earned the win. Cabrera never surfaced in the clubhouse during the time reporters were allowed in after the game.

"That's not the game," Blue Jays manager John Gibbons said of Cabrera's misplay. "It was great pitching on both sides."

Stroman gave up seven hits in seven innings. He struck out seven and walked three.

Milone allowed four hits in six innings, striking out six and walking one intentionally. The left-hander is 6-0 in his last 11 starts and hasn't lost since May 3 at Boston.

The pitchers quickly erased the few chances both offences had.

Jose Reyes singled on the game's first pitch, but Milone didn't allow another hit until Steve Tolleson doubled on a pop fly leading off the fifth that landed between three players battling the bright sky, which caused problems all day. Tolleson advanced to third on the second of two groundouts before Milone struck out Reyes.

Lowrie's fielding error at shortstop extended the sixth for Toronto. But Milone rebounded the way he had all afternoon, striking out Brad Glenn to strand two.

"It the same thing he's been doing all season. He changes speed and locates so well," said Blue Jays centre-fielder Darin Mastroianni, who singled with one out in the 12th for his only hit.

Stroman kept the A's off-balance and out of sync in similar fashion. He got some help from his defense, too, including Cabrera.

With two on and two outs in the third, Cabrera made a diving catch on Yoenis Cespedes's liner to left. Cabrera grabbed his midsection and jogged gingerly backed to the dugout afterward.

Josh Donaldson started a double play by fielding Edwin Encarnacion's grounder at third and threw from his backside to Punto, whose relay from second to first ended Toronto's eighth.

Toronto caught its own defensive break when Brandon Moss sprained his left ankle coming out of the box, and the Blue Jays easily turned a double play to end the bottom of the inning. Moss said the ankle is sore but hopes to play Saturday, though A's manager Bob Melvin said Moss will likely get a day off.

Oakland's Ryan Cook, Fernando Abad, Sean Doolittle, Eric O'Flaherty and Luke Gregerson all pitched a scoreless inning. Jenkins, Brett Cecil, Dustin McGowan and Aaron Loup combined to throw four scoreless innings before the A's broke through in the 12th.

"The pitching today was fantastic across the board," Melvin said. "They came in, did their job for the inning and passed the baton to the next guy."

Scott Kazmir (9-3, 2.61 ERA) starts for Oakland opposite Toronto's Mark Buehrle (10-5, 2.50 ERA) on Saturday.

Baltimore was rained out on Friday, meaning the Jays dropped a half-game behind the Orioles for the AL East lead.