India were dismissed for 274 in reply to England's first innings 287, a deficit of 13 runs, on the second day of the first Test at Edgbaston on Thursday.
The tourists were in danger of conceding a first-innings lead of more than a hundred runs at 182 for eight.
But India captain Virat Kohli made England pay for Dawid Malan dropping him in the slips on 21 and 51 with a superb 149 -- his first Test century on English soil.
India's final two wickets added 82 runs before Kohli was last man out, caught at backward point by Stuart Broad off the bowling of leg-spinner Adil Rashid.
Sam Curran, a 20-year-old left-arm swing bowler led England's attack with a Test-best four wickets for 74 runs in 17 overs in just his second match at this level.
This is England's 1,000th Test and the first of a five-match series.
Captain's role: Virat Kohli walks back to the pavilion after making 149