The driver of the minibus was also killed, emergency services spokesman Russel Meiring told CNN.
Medical personnel treated several children at the scene.
The minibus burst into flames after the collision. The cause of the accident is still under investigation.
Panyaza Lesufi, the official responsible for education in Gauteng province, said it was a “dark day”.
The minibus collided with a truck on the single carriageway R25, between Verena in Mpumalanga and Bronkhorstspruit in Gauteng, having left from Mahlenga High.
The emergency services rescued seven children before the bus burst into flames.
“It is believed the driver of minibus underestimated the speed of the truck and collided with him whilst turning,” the Gauteng Education Department said in a statement.
Pictures show the minibus on its side, entirely burnt out.
In a statement, emergency medical service ER24 described arriving at the scene, where firefighters were tackling the flames. A number of children had already been pulled out by “members of the community”, the statement said.
“Once the flames had been extinguished, paramedics found that approximately 13 children [were] lying trapped inside the vehicle. Unfortunately, nothing could be done for the children and they were declared dead on the scene,” the statement added.
ER24 and the Gauteng Education Department have since confirmed the number has risen to 20. However, the education department later clarified two of the dead were adults.
“This is a huge loss and we’re deeply pained by the tragic news,” the education department tweeted.
South Africa has some of the deadliest roads in the world. According to the country’s Road Traffic Management Corporation, there were 13,673 deaths in the 12 months from October 2015 – which equates to more than 37 people dying every day.
It was announced on Friday that road deaths over the long Easter weekend had jumped 50% compared to last year.