India's Kuldeep Yadav and Yuzvendra Chahal combined to restrict Sri Lanka to 215 after a strong start by the visitors in the third and deciding one-day international on Sunday.
After the visitors were put in to bat, opener Upul Tharanga hit an 82-ball 95 to build a solid platform, but the Indian spinners struck back to dispatch the islanders in 44.5 overs at Visakhapatnam.
Tharanga's 121-ball second-wicket partnership with Sadeera Samarawickrama, who made 42, was the highlight of the Sri Lankan innings that fell apart from a commanding 136-1.
Leg-spinner Chahal got Samarawickrama, who was included in the XI in place of Lahiru Thirimanne, caught at deep cover to end the stubborn stand.
The in-form Tharanga, who registered his 36th ODI fifty, kept up the pressure with an attacking innings as he passed 1,000 runs in 2017.
But Yadav checked Sri Lanka's surge in the 28th over with a twin strike, denying Tharanga a hundred and then sending Niroshan Dickwella (8) trudging back to the pavilion.
Tharanga, who hit 12 fours and three sixes, was beaten by a tossed-up delivery from the left-arm wrist spinner and wicketkeeper Mahendra Singh Dhoni pulled off a sharp stumping.
The decision was referred to the third umpire, who gave it out after TV replays suggested the batsman's toe was on the line rather than behind it when the bails came off.
Chahal soon joined in to take the key wickets of Angelo Mathews, for 17, and skipper Thisara Perera, for six, as Sri Lanka slipped to 197-6.
Fast bowlers Hardik Pandya, who struck twice, and Bhuvneshwar Kumar soon wiped out the tail to dim Sri Lanka's hopes of a first-ever series win in India.