The deal is worth $18.75 million and could reach a potential $21 million, sources told ESPN.
Although Kroft went into the 2018 season looking like he would be the Bengals' No. 2 tight end behind a healthy Tyler Eifert, injuries derailed most of his season. Kroft fractured his foot in a Week 5 game against the Miami Dolphins on Oct. 7 but continued to stay on the active roster in hopes he could return that year.
The Bengals finally placed him on injured reserve on Nov. 16 to allow him to have season-ending surgery, making him the fourth tight end to go on IR last season. Kroft played in five games overall.
Kroft, 26, was considered the primary tight end for most of the 2017 season after Eifert was injured and caught 42 passes for 404 yards and seven touchdowns that season.
He has started 35 games overall for the Bengals since the team selected him in the third round (35th overall) of the 2015 draft, catching 67 passes for 661 yards and eight touchdowns.
Kroft joins Jason Croom as the only tight ends under contract for the Bills after the team released veteran Charles Clay last month. Croom, who went undrafted in 2017, made his NFL debut for the Bills last season and caught 22 passes for 259 yards and one touchdown in 15 games.
ESPN's Mike Rodak and Katherine Terrell contributed to this report.