Sri Lanka Inter-Provincial Bus Timetable (Normal Road)
The departure, stop and arrival times the National Transport Commission prints for normal-road inter-provincial buses — Colombo to Kandy, Anuradhapura, Kurunegala, Kegalle, Gampola and Balangoda, plus Kandy to Kurunegala and Kegalle. Pick a corridor and a time; it lists the buses that leave after it. No signup, no ads, every sheet cited.
How it works
There is no modelling anywhere in this tool. Every time on the page was read off a National Transport Commission running panel — the per-route PDF NTC publishes under the National Transport Commission Act No. 37 of 1991 — and the code does two things with them: it selects the printed rows whose departure is at or after the time you ask about, and it subtracts two printed times to get a duration. It never derives a time from a distance, and it never averages one route's times into another's.
Where the sheets come from
NTC's timetable index page links three Google Drive folders. The normal-road folder holds four sub-folders, one per service class, and a sheet per route inside each. Every route below records the Drive file id of its own sheet, so the download URL can be rebuilt and the claim checked: drive.google.com/uc?export=download&id=<id>. Sheets with a text layer were read with pdftotext -layout. The Sinhala column headers are in a legacy font encoding that the text dump mangles, so every header, footer and run label was read a second time off a rendered image of the page rather than trusted from the text.
Selecting the buses
Given a corridor, a direction, a service class and a time t, the tool returns the first n rows whose departure is >= t. The comparison is greater-than-or-equal, not greater-than, so a bus leaving at exactly the minute you asked about still counts — you can catch the bus that is leaving now, and excluding it would answer the "first bus of the day" question with the second bus.
Journey and leg times
A journey is arrival − departurein minutes, with a single midnight rollover: when a printed time is smaller than the one before it in the same row, 24 hours are added. That case is real, not theoretical. The last bus out of Colombo on route 01 leaves at 23:40 and reaches Kandy at 03:50, so its arrival is stored as 1,430 minutes past midnight and the journey comes out at 250 minutes — 4 hours 10, exactly what the sheet's footer says. A naive subtraction would report minus 19 hours 50. Leg times use the same rule and are shown beside the leg times the sheet itself prints in its footer, as a visible cross-check.
Nothing is recomputed from distance
NTC's route 01 sheet prints 116.0 km, a running time of 4 hours 10 and an average speed of 31.0 km/h. But 116 ÷ 4.1667 is 27.8 km/h, so NTC's speed figure is measured on some other basis — the route 15-1 sheet notes that 15 minutes of driver rest sits inside its running time, which is the sort of thing that explains the gap. The page prints NTC's figures as NTC prints them and derives no speed of its own.
How the data checks itself
Two functions run on every page load. validateTimetable() walks all 1,079 transcribed rows and asserts that each has one time per stop column, that every arrival falls after its departure, that no journey lands outside a 30-to-480-minute band, and that departures appear in the order the sheet prints them. It currently reports no problems. crossCheckJourney()recomputes each class's journey time as the median of its own end-to-end rows and compares that with the running time printed in the sheet footer — two independent numbers off the same PDF, so a transcription that slipped a column stops agreeing. 10 of the 10 class panels agree.
Worked examples
Which corridors are on this page
Each corridor below is an NTC bus time table transcribed in full, not a sample: 1,079 bus turns from 8 running panels, across 10 route-and-class columns. The oldest sheet in the set took effect on 2014-09-11; the newest on 2026-01-20.
| Corridor | Route no. | Class | Buses/day | Sheet in force |
|---|---|---|---|---|
| Colombo ⇄ Kandy | 01 | Normal | 366 | 2020-02-12 |
| Colombo ⇄ Kandy | 01 | Luxury (AC) | 116 | 2025-04-06 |
| Colombo ⇄ Anuradhapura | 15-1 | Normal | 39 | 2026-01-20 |
| Colombo ⇄ Anuradhapura | 15-1 | Semi-Luxury | 29 | 2026-01-20 |
| Colombo ⇄ Kurunegala | 06 | Normal | 49 | 2022-11-21 |
| Colombo ⇄ Kegalle | 1-1 | Normal | 100 | 2014-09-11 |
| Kandy ⇄ Kurunegala | 602 | Normal | 160 | 2017-02-01 |
| Kandy ⇄ Kegalle | 662 | Normal | 94 | 2018-07-11 |
| Colombo ⇄ Gampola / Nawalapitiya | 19-2 | Normal | 64 | 2017-01-01 |
| Colombo ⇄ Balangoda (via Ratnapura) | 98-6 | Normal | 62 | 2015-06-03 |
What is not here yet, and why
A corridor missing from the table above is a corridor whose sheet could not be transcribed to a standard worth publishing. It is not a corridor with no buses.
- Colombo ⇄ Matara (route 2) — NTC's sheet is a scan with no text layer
- Colombo ⇄ Galle (route 2-1) — NTC's sheet is a scan with no text layer
- Colombo ⇄ Jaffna (route 15-87) — NTC's sheet is a scan with no text layer
- Colombo ⇄ Batticaloa (route 48-1) — NTC's sheet is a scan with no text layer
- Colombo ⇄ Vavuniya (route 15-7) — NTC's sheet is a scan with no text layer
- Colombo ⇄ Tangalle (route 32-4) — NTC's sheet is a scan with no text layer
- Colombo ⇄ Nuwara Eliya (route 79-1) — NTC's sheet is a scan with no text layer
- Colombo ⇄ Badulla (routes 99, 99-8, 99-9, 99-10, 99-318) — the sheet mixes five route numbers and an unlabelled sixth column; not transcribable to a verifiable standard yet
- Panadura ⇄ Kandy (route 17) — most turns join the route part-way and the sheet prints the joining point as free text
- Colombo ⇄ Matale (route 08) — NTC publishes a departure list for this route, not a running panel — no stop or arrival times
- Puttalam corridor (routes 4-11, 87-2, 92-4, 92-5) — a separate NTC folder with a different sheet shape
- Southern Expressway services — covered by the highway bus timetable, not repeated here
- Intra-provincial and city routes — licensed by the provincial road passenger transport authorities, which publish no comparable panel
Frequently asked questions
Sources & references
- National Transport Commission — Inter-Provincial Bus Time Tables index
- NTC — NormalWay timetable folder (the normal-road sheets, by service class)
- Sri Lanka Transport Board — the state carrier
The individual sheets these times come from:
- 01 Kandy - Colombo Normal Panal.pdf · in force from 2020-02-12
- 01 Kandy-Colombo(L)Normal Day2025.04.06.pdf · in force from 2025-04-06
- 15-1 N SL Anuradapura - Colombo Panel 2025.01.20.pdf · in force from 2026-01-20
- 6 Kurunegala - Colombo (R.N.06) N.pdf · in force from 2022-11-21
- 1-1 Kegalle - Colombo (N).pdf · in force from 2014-09-11
- 602 Kurunegala - Kandy (N).pdf · in force from 2017-02-01
- 662 Kandy - Kegalle (N).pdf · in force from 2018-07-11
- 19-2 Gampola - Colombo (N).pdf · in force from 2017-01-01
- 98-6 Balangoda - Colombo (N).pdf · in force from 2015-06-03
Every sheet was downloaded and transcribed on 2026-09-26. NTC reissues a panel rather than editing one, so this page is re-checked against the folder on a fixed cycle and whenever a reader reports a change. Fares are deliberately absent: they are gazetted separately and live on the bus fare calculator. If a permitted bus does not run, NTC's passenger hotline is 1955.
Related tools
Comments & feedback
Spotted a bug or want an improvement? Tell us — our team reviews every comment, and good ideas get built. Comments are public and anonymous.
Spotted a time that has changed, or a corridor you need added?
Email me at [email protected] — most fixes ship within 24 hours.