Methodology: how the numbers on Punkto are made

Open in the app →

Every figure on a Punkto page, meaning the interval, the number of trips, the first and last departure, the travel time and the fare, is computed from the timetables we hold: 48 city networks (1215 lines), 875 railway stations and regional buses. Nothing is estimated. This page describes exactly what is computed and where its limits are.

Where the data comes from

Trains come from the ŽSR timetable in GTFS format. City transport is taken from carriers' GTFS files where they publish them (for example Dopravný podnik Bratislava, licence CC BY 4.0). Where a city does not publish open data, our own harvesters read it from publicly available sources, mainly the national app ubian.sk and the public interface of the Žilina transport company.

Regional buses are read from regional GTFS files. They are too large to read every time a page is shown, so a night job turns them into a summary of direct connections between places. Map data, places and walking and cycling routes come from OpenStreetMap (licence ODbL).

The full list of sources, carriers and validity dates is on the Data sources page, together with the licences and attributions.

The typical day: weekday, Saturday, Sunday

A timetable assigns a service variant to every date in its calendar. For a weekday, a Saturday and a Sunday we take the variant that occurs most often on that kind of day from today to the end of validity. Holidays are rare variants and lose the vote. If the validity has already ended, the whole validity period decides. A weekday never falls back to the Sunday variant while another one exists.

Every figure for a line, a stop or a pair of places is for such a typical day. A particular date, such as the day before a holiday, can differ.

Interval and number of trips

The interval is the median gap between consecutive departures from a reference stop, between 07:00 and 19:00. The reference stop of each direction is the one that the most trips call at. The median of the two directions' medians is taken again. It is therefore the typical daytime interval, not a peak-hour interval.

We state an interval only when the band holds at least three departures and the gap is no longer than two hours. For a sparser line the interval is left out and only the number of trips is given, because "every five hours" is not an interval.

Trips per day is the number of trip starts of a line on the typical day, both directions together. Departures from a stop is the number of calls there, excluding the last stop of a trip. For a pair of places it is the number of trains or buses that call at A and later at B without a change.

First and last departure

The first and last departure are the earliest and the latest departure on the typical day. A departure after midnight that still belongs to the previous service day is shown as a time of day marked "+1 day". A stop served round the clock is stated as the whole day, 00:00 to 23:59, so that the last departure never looks earlier than the first.

Travel time

The travel time between two places is the median of the scheduled minutes in the timetable. It is a planned time, not an actual one: delays and closures are not in it. For the route from an airport to the centre it is the median ride of the line between the two stops.

What a night line is

A night line is not a line with an N in its name. A line is a night line when every departure of it, on every kind of day, falls between 21:00 and 05:00, at least one is after midnight, and on its busiest kind of day it has at least four departures. A city gets a night-lines page from three such lines. This is a statement about the timetable that a reader can check.

How fares and their dates are made

We do not compute a city fare from the timetable. It is taken from the price list of the city or the carrier. A city appears on a fares page only when it has a priced ticket, a named source and the date on which we last checked the price list. Without a source there is no page.

Temporary promotions are shown by date: one that is over is not shown, and one that has not begun is announced with its first day. 730 days after the check a visible warning is added to the page, and after 1095 days it leaves the index and the sitemap. A price is always as of the day it was checked; the carrier's current price list prevails.

The train fare between two places is the full second-class fare by distance from Cenník č. 1 of the ZSSK transport rules, in force from 1 July 2026. It is shown only when the track length of every hop of the typical trip is known. Bus connections carry no fare.

How often the data is refreshed

Every night we ask the source which edition of the timetable is in force and compare it with the one our network was built from. If it changed, the network is rebuilt. A rebuilt network that would lose a third of its departures is not published and the old one stays. City networks that we collect ourselves are collected again when their coverage runs out. The train price list is compared with the publisher's index every night.

Two weeks before a timetable ends, the health check of the service warns us. A page whose timetable has ended carries a notice, and after 30 days it leaves search indexes. The sitemap date of a page changes only when the content of the page changes.

What is not covered

Some cities are missing: the Data sources page lists which. The pages do not reflect delays, closures or one-day changes, and are indicative; the carrier's official timetable is what counts. A fare is not held for every city: Čadca charges by the kilometre and Bánovce nad Bebravou has no published price list. Direct-connection pages are published only for a limited number of the most significant pairs of places and do not cover journeys with a change.

How to report a mistake

Found a wrong time, line or fare? Write to [email protected]. Include the address of the page, what is wrong and, if you know it, what is right. We correct the data in the service, but a change of timetable is always decided by the carrier. Who is behind the service is described on the operator page.

Updated: