Angelo Mathews claimed 4/59 to bowl the hosts to a 6-run victory despite injuries to Nuwan Pradeep and Dhananjaya de Silva.
Five scores of between 30 and 60 had earlier taken Sri Lanka to a competitive total of 307 before some tight middle overs from the home spinners set the stage for Mathews' late heroics.
The home side won the toss and elected to bat first. It took until the 11th over for West Indies to get their first breakthrough, Alzarri Joseph strangling Avishka Fernando down the leg side to dismiss him for 29 – a relative failure in a series in which his other two innings have yielded 50 and 127.
Dimuth Karunaratne was next to go; after a 53-ball partnership with Kusal Perera which brought just 28 runs, he lobbed a return catch to Roston Chase and departed for 44.
Perera combined with Kusal Mendis then for the biggest partnership of the innings, worth 89 by the time Kieron Pollard dismissed Perera for another 44. Mendis, having brought up his 17th ODI half-century shortly before the wicket, quickly followed his namesake back to the dressing room, mistiming a hook off Joseph in the next over.
Angelo Mathews was dismissed cheaply by Sheldon Cottrell, but Dhananjaya de Silva and Thisara Perera held the innings together with 51 and 38 respectively, both ending with strike rates north of 100 by the time they were wrangled out by Joseph, who finished with figures of 4/65.
Wanindu Hasaranga hit a couple of boundaries in the final over to give a late boost before becoming the first of three wickets to fall to the last three balls, punctuated by a wide to leave Sri Lanka 307 all out.
West Indies started strongly in reply, with first Sunil Ambris and then Shai Hope completing half-centuries. But the ball after Hope reached 50, Ambris failed to pick Hasaranga's googly and was clean bowled for a run-a-ball 60.
Hope and Nicholas Pooran kept the innings ticking over until the former popped a catch to mid-wicket from an Isuru Udana slower ball for 72. Pooran and Pollard continued in a similar vein, and just before Pooran reached his half-century, Nuwan Pradeep limped off the field mid-over, leaving Thisara to complete it, giving the feeling that it may just have been going in West Indies' favour.
But Mathews made the breakthrough straight after, his off-cutter decieving Pooran into offering a gentle chance to the cover fielder without having added to his 50. Darren Bravo was next out, run out amidst an LBW appeal against Pollard which was turned down. Sri Lanka reviewed the decision, hoping to dislodge the captain instead, but umpire's call on impact meant it was Bravo who departed.
With Dhananjaya de Silva also carrying an injury which prevented him from bowling, Karunaratne was left to call upon Mathews to complete his full allocation, something he has not done in ODIs since 2015. But the veteran all-rounder delivered the wickets of Pollard, for 49, and Jason Holder in consecutive overs.
Some destructive batting from Fabian Allen, who had not bowled earlier and was batting lower than he may have otherwise because of a shoulder injury, kept the visitors in with a chance despite a pair of run-outs in the penultimate over as Allen looked to keep strike.
With 13 required from the final over, Allen on strike and Mathews to bowl, it was still anyone's game. A boundary first ball was immediately countered by a good boundary catch by Kusal Mendis to send Allen back to the pavilion for a 15-ball 37. Joseph and Cottrell managed only two runs from the remainder of the over, sealing a 3-0 series win for Sri Lanka.