
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.
Kohli, one of the outstanding batsmen of his generation, managed just 134 runs in five Tests at an average of 13.4 on his maiden tour of England four years ago.
But the now 29-year-old India skipper surpassed that total in one innings during the second day's play of the series opener at Edgbaston.
Kohli was on 97 when No 11 Umesh Yadav walked out to bat, with India 217 for nine in reply to England's first innings 287.
But a late cut four off all-rounder Ben Stokes, his 14th boundary in 172 balls, saw Kohli to a 22nd Test hundred in what is the first of a five-match series.
However, England slip fielder Dawid Malan dropped Kohli twice, on 21 and 51, with James Anderson and Stokes the unlucky bowlers.
Kohli then topped his 2014 series total in the one knock with a two off leg-spinner Adil Rashid.