Lazio only needed to avoid defeat in what was effectively a play-off at the Stadio Olimpico on Sunday, but they collapsed incredibly in the closing stages as captain Senad Lulic was dismissed.
Ivan Perisic's remarkable own-goal, an Adam Marusic shot deflecting in off the midfielder's face, gave Lazio the lead, but Danilo D'Ambrosio levelled with an acrobatic effort from close range.
Felipe Anderson's breakaway goal restored the lead and put Lazio in control at half-time, but the Nerazzurri somehow completed a stunning comeback with two goals in three minutes.
Referee Gianluca Rocchi had already changed his mind about one penalty for the visitors following a VAR review when he pointed to the spot after Stefan de Vrij - strongly rumoured to be joining Inter at the end of the season - hacked Mauco Icardi down in the box.
The Inter captain converted and, after Lulic was shown a second yellow card, Matias Vecino headed in Marcelo Brozovic's corner, Simone Inzaghi's men unable to muster a fightback of their own after the coach earlier made defensive changes to leave them fifth and devastated at the full-time whistle.
Icardi mishit an early chance and Antonio Candreva thudded a volley narrowly wide as Inter made a flying start.
Luiz Felipe should have opened the scoring, blazing over when picked out by a low left-wing Ciro Immobile cross, but Lazio led in the ninth minute in freakish circumstances.
Although Samir Handanovic denied rising star Sergej Milinkovic-Savic, Lazio kept the ball alive and when Marusic let fly the ball cannoned in off the face of the helpless Perisic.
Icardi missed a golden chance to level in the 22nd minute, dragging wide after Joao Cancelo's interception and throughball, Milinkovic-Savic denied by the woodwork from a superb free-kick at the other end moments later.
Inter's equaliser was no less dramatic than the opener, Thomas Strakosha keeping out D'Ambrosio's initial effort but unable to stop the full-back turning home the rebound, the goalkeeper's protests that he was fouled falling on deaf ears.
Lazio retook the lead in the 41st minute with a sensational break, Anderson rolling in a superb finish after he and captain Lulic countered at rapid pace to unlock Inter's defence.
Icardi was becoming influential but Anderson rippled the side-netting as Lazio again threatened on the counter, Spalletti's side growing increasingly desperate with their own attacks.
Rocchi awarded Inter a penalty in the 72nd minute after Milinkovic-Savic appeared to handle the ball in the box, but after consulting VAR the referee elected not to award the spot-kick, replays showing the ball hit Serbia international on the shoulder.
100 - Mauro Icardi scored tonight his 100th goal in Serie A for Inter, in 159 games played. Nerazzurro.— OptaPaolo (@OptaPaolo) May 20, 2018
But Rocchi had no choice but to point to the spot when Icardi was hacked down by De Vrij - the Lazio defender having confirmed he is leaving the club at the end of his contract.
The Inter skipper stepped up to slot in past Handanovic and set up a dramatic finale in the capital, Lulic seeing red after losing composure and needlessly bringing down Brozovic.
And when Brozovic floated a corner to the near post, Vecino met it with a glancing header to secure Inter's Champions League qualification at the expense of their heartbroken hosts, who saw substitute Patric sent from the touchline in the dying stages.
Key Opta stats:
- Inter have qualified for the next Champions League; it's the first time for the Nerazzurri since 2011-12.
- Inter have won last three away league games, as many as their previous 12.
- Lazio have picked up only two points in the last three league games, after they had won five of their previous six (1 draw).
- Danilo D'Ambrosio has scored nine of his 11 Serie A goals from corner situations.