The cause of the accident was unclear but the bus appeared to have hit a highway barrier either before or after it caught fire, authorities said.
Seven people who leapt from the burning bus were rushed to the Pirogov emergency hospital in the Bulgarian capital Sofia and were in a stable condition, hospital staff said. They had burns and one had a leg injury.
Bulgaria's interior ministry said 45 people had died, making it the deadliest bus accident in the Balkan country's history.
Interior Minister Boyko Rashkov said bodies were "clustered inside and are burnt to ash".
"The picture is terrifying, terrifying. I have never seen anything like that before," he told reporters at the site.
The accident happened on the Struma highway about 30km west of Sofia around 2am.
The coach party had been returning to Skopje, capital of North Macedonia, after a weekend holiday trip to Istanbul in Turkey, a trip of about 800km. A passenger list released by media in Skopje carried 51 names suggesting most victims were from North Macedonia's ethnic Albanian minority.
Bulgarian investigative service chief Borislav Sarafov said four buses from a North Macedonian travel agency had entered Bulgaria late on Monday from Turkey.
"Human error by the driver or a technical malfunction are the two initial versions for the accident," Sarafov told reporters.
"THERE WAS A BLAST"
"There was a blast. The question is whether this blast was caused from a blast in the bus, or was caused by the collision of the bus in the road barrier."
Officials said they would look at the condition of the highway, where accidents have often been reported.
North Macedonian Prime Minister Zoran Zaev said one of the seven survivors had told him the passengers were sleeping when they were woken by the sound of an explosion.
"This is a huge tragedy," he told reporters in Sofia.
He said people sitting at the back of the bus were able to break a window and jump out.
Chamuran Feizulovski, 35, a relative of one of the injured travellers, told Reuters another of the survivors said he had first felt the bus hit an obstacle and then a blast.
At daybreak the bus was standing upright but charred and gutted by fire in the middle of the highway, which was wet from rain.
CRYING AND IN SHOCK
In front of the Ismail Qemali elementary school in Skopje, pupils cried after hearing news that five of their schoolmates, all from one family, had been killed.
"Ergin was my friend. He was a very good boy. Very nice. I am so sorry that they died," Blerim Bushi, 11, told Reuters.
In Sofia, Adnan Yasharovski, 45, said his 16-year-old daughter Zuleikha called him to say she had survived the crash, and he travelled to see her in hospital.
"She was crying. Her hands were burnt but otherwise fine," he told Reuters outside the hospital. "She didn't say much, she was crying and she was in shock. I only saw her through the door as due to COVID, they did not let me into the room."
Some relatives gathered outside the Besa Trans agency in Skopje, whose Facebook page advertised trips to Istanbul. "Deepest condolences to relatives of those who died and speedy recovery for those injured," Besa said in a statement.
Zaev said the passengers were all from North Macedonia but appeared to include a Serbian citizen and a Belgian citizen. It was unclear whether the two were among the victims or injured.
Zaev said the passengers were from various communities in North Macedonia, a country of 2 million that borders Bulgaria.
In Skopje, ethnic Albanian Osman, 31, told Reuters he had come to the office of the travel agency with his brother and sister seeking information about their parents.
"We do not know if they were on the bus that crashed or not. We have no information about them. The agency is not answering the phone. Perhaps we will need to go to Bulgaria," he said.
Albanian Foreign Minister Olta Xhacka said the passengers were from the ethnic Albanian community. "Great grief for the 45 lost lives of Albanians from Northern Macedonia during the tragic accident in Bulgaria," he said on Twitter.
Flags flew at half-mast in Skopje and the North Macedonian government said it was declaring three days of mourning. Bulgaria declared a day of mourning for Wednesday to remember the victims of the crash as well as nine people killed in a fire at a nursing home.