Panyaza Lesufi, the official responsible for education in Gauteng province, said it was a "dark day".
The collision occurred near the town of Wolvenkop on the R25 road connecting Johannesburg with Groblersdal, News24 reported.
The cause of the crash is not yet known.More news: Sale's 13 Ks, Betts' 2B In 10th Lead Red Sox Over Jays
Russel Meiring, a spokesman for paramedic company ER24, said several children survived after being pulled from the wreckage near Bronkhorstspruit, east of the capital Pretoria.
Pictures from the scene showed the bus turned upside down on the side of the road and with smoke rising from it.
He added: "Paramedics arrived on the scene to find the fire services already in attendance".More news: Crowd trouble delays Europa League match in Lyon
ER24 said responders found about 13 children trapped inside the vehicle after its flames were put out.
Another seven children were found around the minibus, but they were declared dead by the medical team. However, the education department later clarified two of the dead were adults.
A department of education spokesman Steve Mabona said some of the bodies of the children were charred beyond recognition.More news: #BREAKING 7 Man United Fans, Not 30 Died in Calabar Electrocution
It was announced on Friday that road deaths over the long Easter weekend had jumped 50% compared to past year.
- GM Shuts Down Venezuela Operation After Authorities Seized Its Plant
- Paris Police Officer Killed In Suspected Terrorist Attack
- Macquarie Reiterates "Outperform" Rating for Wpp Plc (WPP)
- Jose Mourinho fears worst over Zlatan Ibrahimovic and Marcos Rojo injuries
- I don't feel extra joy at beating Chelsea - Mourinho
- Facebook launches augmented reality camera platform for developers
- Birmingham hire Harry Redknapp as crisis-ridden club look to beat the drop
- Iraq officials: 26 hostages, including Qatari royals, freed
- Aaron Hernandez found dead in prison with Bible verse written across forehead
- Anaheim Ducks douse Calgary Flames 3-1 to complete playoff series sweep