Nuwan Kulasekara wrecked India's top order with a career-best haul of 4-40 to bowl Sri Lanka to a consolation 112-run victory in the fifth and final one-day international here on Friday.
India, who already had a winning 3-1 lead, were shot out for 103 chasing a rain-revised target of 216 off 44 overs under lights. They clinched the series 3-2.
It was India's third-lowest total against Sri Lanka in one-dayers. Teenager Virat Kohli was the top scorer with 31 in a brittle batting performance.
New-ball bowler Kulasekara was superbly backed by unorthodox spinner Ajantha Mendis, who finished with 4-10 off 4.3 overs.
"It was a good way to finish the series, but the Indians played well and deserved to win it," said Sri Lanka captain Mahela Jayawardene.
"Credit goes to the boys for the way we came back. We kept making mistakes through the series. We were not consistent in the batting department."
Man-of-the-match Kulasekara dismissed Kohli, Gautam Gambhir (11), Suresh Raina (10) and Rohit Sharma (three) in his sharp opening spell to build on Thilan Thushara's impressive maiden half-century under pressure.
Sri Lanka were struggling at 133-6 before Thushara (54 not out) and Jehan Mubarak (47 not out) added 94 off 78 balls for the seventh wicket with hard and clean hitting to help their team reach a competitive total on a slow pitch.
The hosts hardly felt the absence of main spinner Muttiah Muralitharan and seamer Chaminda Vaas as Kulasekara and Mendis did the job. Muralitharan and Vaas were rested.
"It was good to win the series with a game to spare," said India captain Mahendra Singh Dhoni, who was named man of the series for scoring 193 runs in five matches.
"These tracks are said to be slow, but the bounce has improved over the last few years. I am happy with the way our batsmen have played the spin. It was important to keep the strike rotating and our batsmen did that well."
Kulasekara ended India's early flourish when he had Gambhir caught by wicket-keeper Kumar Sangakkara. Gambhir added 38 for the opening wicket with Kohli.
The 19-year-old Kohli batted fluently, once pulling Kulasekara for a six. He fell just when he looked well-set, trapped leg-before playing across the line.
Kulasekara got a big wicket when he dismissed in-form Raina, who mistimed a pull to be caught by Dilhara Fernando at mid-off.
The seamer then returned after a rain interruption to trap Sharma leg-before to reduce the tourists to 76-4.
Sri Lanka virtually wrapped up the match when out-of-form Yuvraj Singh and Dhoni fell in the space of six runs to leave their team wobbling at 85-6.
Yuvraj inside-edged a Mendis delivery on to his stumps to finish the series with just 72 runs in five matches, while Dhoni was bowled by paceman Fernando, who finished with 2-24.
The hosts earlier plundered 84 in the last 10 overs, thanks to Thushara's brisk 46-ball knock containing six fours.
Left-arm spinner Pragyan Ojha (2-28) and seamer Irfan Pathan (2-52) raised India's hopes of restricting Sri Lanka to a modest total before Thushara and Mubarak rallied their side.
Pathan ended Sri Lanka's recovery when he removed well-set Mahela Udawatte (43) and opener Malinda Warnapura (30) in the space of four deliveries.
Udawatte and Warnapura batted sensibly to add 77 for the second wicket after the dismissal of veteran opener Sanath Jayasuriya (one) in seamer Zaheer Khan's first over.
Ojha kept a tidy line and length, removing Jayawardene (12) and Chamara Kapugedera (26) in the process.
Jayawardene, who won the first toss of the series, was held in the covers by Yuvraj, and Kapugedera was caught in the deep by Rudra Pratap Singh while going for a big shot.
Rudra Pratap also claimed a wicket when he had Sangakkara (one) caught by Gambhir at first slip. Sangakkara could make just 37 runs in five matches.