Texas Senator Ted Cruz has won the Iowa Republican caucuses, the first vote of the US 2016 presidential election.
“Tonight is a victory for courageous conservatives,” he declared, to great applause, as he railed against Washington, lobbyists and the media.
He took 28percent of the Republican vote, beating his rival, the once frontrunner Donald Trump, and Marco Rubio.
Votes in the Democratic race are still being counted, and some US media have declared it a dead-heat.
With 95 percent of results in, frontrunner Hillary Clinton and self-proclaimed Democratic socialist Bernie Sanders, a 74-year-old senator from Vermont, are less than one percent apart.
Ms Clinton addressed her supporters but did not explicitly declare victory, choosing instead to say that she was “breathing a sigh of relief”.
Sanders, speaking shortly afterwards, said: “While the results are still not known, it looks like we are in a virtual tie”.
No such ambiguity from Republican victor Cruz, whose triumph was reward for the months he spent criss-crossing the state to woo its influential conservative and evangelical leaders.
As country music blared across the loud speaker at his Des Moines rally, the 45-year-old senator, who has been a thorn in the side of his party, relished his victory.
“Iowa has sent notice that the republican nominee and the next president of the United States will not be chosen by the media, will not be chosen by the Washington establishment,” he said.
“Tonight is a victory for courageous conservatives across Iowa and all across this great nation.”
Trump congratulated the Texas senator and said he was “honoured” by the second-place finish.
Rubio, who has struggled to gain traction in recent months, has performed far better than expected, and finished in third place – just one percentage point behind Trump.
Meanwhile, two candidates are bowing out.
Sources close to Democrat Martin O’Malley, former Maryland governor, have told the BBC that he will suspend his campaign – narrowing the field to two competitive candidates.
On the Republican side, Former Arkansas Governor Mike Huckabee tweeted that he too would suspend his campaign.