13 schoolchildren killed in South Africa minibus collision

Rescue workers and South African Police Service (SAPS) forensic team members stand next to a covered body at the scene of an accident, where a minibus carrying school students collided with a truck killing 12 pupils, in Vanderbijlpark on January 19, 2026
(AFP photo)
Rescue workers and South African Police Service (SAPS) forensic team members stand next to a covered body at the scene of an accident, where a minibus carrying school students collided with a truck killing 12 pupils, in Vanderbijlpark on January 19, 2026 (AFP photo)

JOHANNESBURG — A minibus carrying students to school collided with a truck south of Johannesburg on Monday, killing 13 pupils, South African police said.

It was the latest in a string of deadly crashes in a country whose modern road network is undermined by rampant speeding, reckless driving and poorly maintained vehicles.

The crash happened near the industrial city of Vanderbijlpark, about 60 kilometres south of Johannesburg.

Police said the driver of the minibus appeared to have lost control while attempting to overtake other vehicles.

The toll rose to 13 after an injured child died of their injuries, the provincial education department said in a statement. Several children were also badly hurt.

Authorities did not immediately release the ages of the children but provincial education minister Matome Chiloane said they were from primary schools, where pupils are aged from six years, and also high schools.

Images on social media showed the crushed minibus on the roadside with distraught parents gathered behind the police tape. Some broke down wailing when they were allowed to see the bodies.

"It is a terrible scene," Gauteng premier Panyaza Lesufi said.

In a statement of condolence, President Cyril Ramaphosa said everything must be done to enforce the rules of the road and ensure the quality of school transport services in order to protect learners, "the nation's most precious assets".

Many South African parents have to rely on private minibuses to get their children to school because of limited public transportation.

At least five students were killed and eight others injured in September when a school minibus ploughed into a creche in a KwaZulu-Natal township.

In July 2024, 11 children -- some as young as seven and eight -- were killed when a minibus taking them to school near Johannesburg overturned and caught fire after being hit by another vehicle.

More than 11,400 lives were lost on South African roads in 2025, according to the latest data from the transport ministry.

.col-lg-12.second .opinion-widget{border-top:1px solid #D0D0D0;} #widget_1623 .opinions-title {font-size:32px;} #widget_1623 .opinions-title a{font-size:32px;} .first-author{ background-color:#ecedef; } .first-opinion-author-name{ background-color:white; width:max-content; padding:5px; }
.epaper-separator{ height: 1px; width: 100%; background-color: #D0D0D0; margin: 15px 0; }

Today’s Paper

.related-articles .article-widget-sm .article-title{font-size:16px;-webkit-line-clamp:3;} .related-articles .layout-ratio{padding-bottom:55%;}
.alert-success { color :#A3656F ; } .alert-danger { color : red ; } .footer { font-family:Myriad Pro,Arial; } .newspaper-footer{ visibility:hidden; } .socialFixOuter { position: fixed; top: 50%; margin-top: 40px; right: 0; transition: .2s; z-index: 20; height: 217px; width: 40px; } .socialFix { height: 30px; width: 30px; display: block; position: relative; cursor: pointer; background-size: 18px 18px; transition: .2s; background-position: center; background-repeat: no-repeat; border-radius: 2px; margin-top: 1px; } .socialFix:hover { width: 40px; margin-left: -10px; } .app-badge-img { height: 36px; width: auto; } @media (max-width: 768px) { .app-badge-img { height: 32px; } .app-badges { justify-content: center !important; } }
document.addEventListener("DOMContentLoaded", function () { const socialFix = document.querySelector(".socialFixOuter"); if (!socialFix) return; let firstInteraction = false; let hideTimeout = null; function checkMobileScreen() { if (window.innerWidth < 768) { socialFix.style.display = "none"; } else { socialFix.style.display = "block"; } } checkMobileScreen(); window.addEventListener("resize", checkMobileScreen); function handleFirstInteraction() { if (firstInteraction) return; if (window.innerWidth < 768) return; firstInteraction = true; socialFix.style.right = "-25px"; } socialFix.addEventListener("mouseenter", function () { if (window.innerWidth < 768) return; if (hideTimeout) clearTimeout(hideTimeout); socialFix.style.right = "0"; }); socialFix.addEventListener("mouseleave", function () { if (window.innerWidth < 768) return; if (hideTimeout) clearTimeout(hideTimeout); hideTimeout = setTimeout(() => { socialFix.style.right = "-25px"; }, 500); }); ["click", "touchstart"].forEach((evt) => { socialFix.addEventListener(evt, handleFirstInteraction); }); }); function validateEmail(email) { if (email.length > 255) return false; const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; if (!emailRegex.test(email)) return false; if (email.includes('..') || email.startsWith('.') || email.endsWith('.')) return false; return true; } function sanitizeInput(input) { input = input.replace(/<[^>]*>/g, ''); input = input.replace(/javascript:/gi, ''); input = input.replace(/on\w+\s*=/gi, ''); input = input.replace(/[<>"'&(){}[\]]/g, ''); return input.trim(); } document.addEventListener('DOMContentLoaded', function () { function showModal(message, type) { const messageContainer = document.getElementById("messageContainerFooter"); messageContainer.textContent = message; messageContainer.className = `alert alert-${type} mt-3`; messageContainer.classList.remove("d-none"); setTimeout(() => { messageContainer.classList.add("d-none"); }, 5000); } document.getElementById("emailFormFooter").addEventListener("submit", function(event) { event.preventDefault(); const emailInput = document.getElementById("emailFooter"); const email = sanitizeInput(emailInput.value.trim()); if (!validateEmail(email)) { showModal('Invalid email format', 'danger'); return; } const formData = new FormData(); formData.append('email', email); fetch('/subscribeNewsletter', { method: "POST", body: formData, headers: { "Accept": "application/json", "X-Requested-With": "XMLHttpRequest" } }) .then(response => { if (!response.ok) { showModal("Error submitting email. Try again.", 'danger'); } return response.json(); }) .then(data => { showModal(data.message, 'success'); }) .catch(error => { showModal("Error submitting email. Try again.", 'danger'); }); }); });