It is the third highest total for England in Tests on Indian soil. The all-rounder reached his hundred off 173 balls. His stay at the crease lasted 235 balls, including 13 fours and a six.
Ravindra Jadeja (3-86) struck two quick blows after the lunch break, as the visitors went from 450-6 to 465-8. Chris Woakes (4) was caught behind, and then Adil Rashid (5) skied one to Umesh Yadav at mid on. (LIVE BLOG)
Zafar Ansari (32) then put on 52 runs with Stokes for the ninth wicket, and thus helped take England past the 500-mark in the 143rd over.
It was the first time since 2012-13 that a visiting team had crossed this barrier on Indian soil. England was the last to do it when it had scored 523 runs in Kolkata.
India managed to pull back the scoring rate in the final hour before tea, as the batsmen scored at only 2.4 per over.
Stokes was then caught behind just before the scheduled break in play, as Saha held on down leg off Yadav (2-108). India earned an extension to the session, with Ansari and Stuart Broad (6 not out) putting on 20 runs for the final wicket.
Amit Mishra (1-98) then brought the innings to a close trapping Ansari lbw just before tea.