Labour has taken Kingswood from the Conservatives, in another by-election victory for Sir Keir Starmer’s party.
Damien Egan won 11,176 votes, while Tory candidate Sam Bromiley polled 8,675, giving Labour a majority of 2,501.
The seat in Gloucestershire had been held by Tory MP Chris Skidmore since 2010, but he quit in January in protest over government legislation to boost North Sea oil and gas drilling.
By-election results live: Follow updates here
The former energy minister had increased his share of the vote at each of the four elections in the past 13 years, from 40% in 2010 to 49% in 2015, 55% in 2017 and 56% in 2019.
Sir Keir said: “This is a fantastic result in Kingswood that shows people are ready to put their trust in a Labour government.
“By winning in this Tory stronghold, we can confidently say that Labour is back in the service of working people and we will work tirelessly to deliver for them.
Kingswood and Wellingborough by-elections: Odds of Rishi Sunak repeating Tory 1997-style loss have now increased
By-election results: Sunak oversees unwanted record with latest pair of defeats
Wellingborough by-election: Labour overturns big Tory majority with second win of night
“To those who have put their trust in us, you can be safe in the knowledge that the Labour Party will deliver on your priorities. Labour will give Britain its future back.”
Notably, Reform UK – previously the Brexit Party – came in third place, winning 2,578 votes – the first time their vote share at a by-election has surpassed 10%.
This means that the total of the Conservative and Reform vote equates to more than the Labour vote.
A Labour source told Sky News they believed they had won the seat at around 1.30am – the results were announced at around 1.50am.
Before 2010, Labour had won the seat at every general election since 1992.
The turnout this time was 24,905 – which equates to around 37.1% of eligible voters in the constituency.
This is a significant drop of 34 percentage points from the 2019 general election.
To win, Labour needed a swing in the share of the vote of 11.4 percentage points – equivalent to a net change of 12 in every 100 people who voted Conservative in 2019 switching sides.
Provisional calculations show the swing ended up being 16.4 from the Conservatives to Labour.
In total, the Conservative Party’s vote share fell by 21.3 percentage points, meanwhile the Labour Party’s vote increased by 11.5 percentage points.
The Liberal Democrats vote fell by 3.4 points, and the Green Party went up by 3.4 points.
Speaking after his election, Mr Egan said: “Thank you for giving me your trust and for allowing me to serve the community I’m from.
“It’s a trust that I promise to repay, to show that politics can be different and can make a difference.”
He added: “Fourteen years of Conservative government have sucked the hope out of our country.
“There’s a feeling that no matter how hard you work, you just can’t move forward, and with Rishi’s recession we are left once again paying more and getting less.”
While the Kingswood seat is disappearing at the next general election due to boundary changes, Mr Egan is standing for Bristol North East, which contains much of the same electorate.
Mr Bromiley left the hall where the vote was being counted within seconds of the declaration, with the door shut behind him to prevent journalists from following him.