Official results from Tuesday showed moderate Democrat Conor Lamb leading conservative Republican Rick Saccone by a fraction of a percentage point with votes counted from 100 per cent of precincts.
"It took a little longer than we thought but we did it. You did it," Lamb told cheering supporters.
Meanwhile, a spokesman for Rick Saccone tells ABC News' Adam Kelsey: "We have no plans to concede — tonight, at least. We want to make sure all the ballots are counted."
Saccone ran as an extension of Trump in a district the US president won by 20 points in 2016. He said he would be “Trump’s wingman” in Washington and touted himself as “Trump before Trump”.
The contest, to replace a Republican who resigned amid a scandal last year, was the latest good election showing for the Democrats, who also won a governor's race in Virginia and scored a U.S. Senate upset in conservative Alabama.
Tuesday's result has little bearing on the current balance of power in the House, but Democrats hope a win will boost their momentum as they try to pick up the 24 seats they need to gain control in November.