Match ends, Torino 2, Juventus 1.
Torino came from behind to beat runaway leaders Juventus to secure their first Turin derby victory for 20 years.
Juve would have wrapped up a fourth consecutive title with a win, coupled with a Lazio defeat, and led when Andrea Pirlo curled home a free-kick.
Matteo Darmian levelled in style as he chipped the ball into the box with his first touch from a cross and lashed home with his second.
And Fabio Quagliarella tapped home against his old club for a famous win.
At least 10 Torino fans were injured in the first half when a paper banger exploded, causing splinters from seats to hit supporters.
Second-placed Lazio drew 1-1 with Chievo, meaning a Juventus win would not have secured the title anyway.
But for Juve, the game was about more than the title as their 17-match unbeaten run and seven-game winning streak in the derby came to an end.
And they almost rescued a point late on, just moments after Josef Martinez had a goal disallowed for Torino.
Alessandro Matri's cross hit the post and Simone Pepe was unable to turn in the rebound.
In injury time, Pirlo had a glorious chance to level but shinned his shot from 18 yards out, firing well over.
In Rome, Lazio led Chievo through Miroslav Klose but Alberto Paloschi levelled.
Lazio are one point above city rivals Roma in the battle for the final automatic Champions League spot.
Sixth-placed Fiorentina suffered a surprise 3-1 home defeat by Cagliari, who close the gap on safety to seven points.
The visitors, in Gianluca Festa's first game in charge, scored one of the goals of the season. Diego Farias ran from his own half, skipping past a defender with a backheel and then nutmegging another to fire home.
Elsewhere, Antonio Nocerino scored the only goal as bankrupt Parma, who are being funded by the league to complete their fixtures, beat Palermo 1-0 to delay their inevitable relegation by a few more days.
Europa League chasers Genoa beat Cesena 3-1, while 37-year-old Luca Toni scored twice as Verona beat Sassuolo 3-2.
German Denis scored an injury-time equaliser as lowly Atalanta drew 2-2 with Empoli.
- 24MorettiBooked at 70mins
- 33da Silva Peres
- 94BenassiSubstituted forVivesat 72'minutesBooked at 88mins
- 14GazziBooked at 59mins
- 7El Kaddouri
- 36DarmianSubstituted forMolinaroat 82'minutes
- 11LópezSubstituted forMartinezat 61'minutes
- 21G Silva
- 22Carvalho De Oliveira
- 19BonucciBooked at 77mins
- 20PadoinSubstituted forLlorenteat 86'minutes
- 37PereyraSubstituted forPepeat 78'minutes
- 9MorataSubstituted forTévezat 65'minutes
- 17De Ceglie
- Paolo Tagliavento
- Shots on Target
Second Half ends, Torino 2, Juventus 1.
Stephan Lichtsteiner (Juventus) wins a free kick in the defensive half.
Foul by Fabio Quagliarella (Torino).
Leonardo Bonucci (Juventus) wins a free kick in the defensive half.
Foul by Alessandro Gazzi (Torino).
Attempt missed. Andrea Pirlo (Juventus) right footed shot from outside the box is high and wide to the right. Assisted by Fernando Llorente.
Offside, Torino. Daniele Padelli tries a through ball, but Fabio Quagliarella is caught offside.
Attempt missed. Alessandro Matri (Juventus) header from the centre of the box misses to the left. Assisted by Simone Pepe with a cross.
Foul by Angelo Ogbonna (Juventus).
Alessandro Gazzi (Torino) wins a free kick in the attacking half.
Attempt missed. Leonardo Bonucci (Juventus) header from the centre of the box misses to the left. Assisted by Andrea Pirlo with a cross following a corner.
Corner, Juventus. Conceded by Cristian Molinaro.
Attempt blocked. Alessandro Matri (Juventus) right footed shot from the right side of the box is blocked.
Giuseppe Vives (Torino) is shown the yellow card for hand ball.
Hand ball by Giuseppe Vives (Torino).
Andrea Pirlo (Juventus) wins a free kick in the attacking half.
Foul by Josef Martinez (Torino).
Foul by Simone Pepe (Juventus).
Cristian Molinaro (Torino) wins a free kick on the left wing.