CycladesGo
How we get our data
Last updated:
CycladesGo is an independent, commercial project. It is not affiliated with, endorsed by or operated by any KTEL or bus operator, and it is not a ticket sales office. This page explains exactly where every number on this site comes from, how we transform it, and where we are known to be wrong.
The short answer
Departure times come from the island's own bus operator. Stop coordinates come from OpenStreetMap. Fares are checked by hand against what the operator publishes. There is no real-time vehicle feed, and there will not be one — see known limits .
Where each part comes from
| Island | Operator | Official source | Coordinates | Snapshot |
|---|---|---|---|---|
| Naxos | KTEL Naxos ΚΤΕΛ Νάξου | naxosbuses.com | OpenStreetMap (ODbL) | 2026-11-02 |
| Paros | KTEL Paros ΚΤΕΛ Πάρου | ktelparou.gr | OpenStreetMap (ODbL) | 2026-11-02 |
| Santorini | KTEL Santorini ΚΤΕΛ Θήρας | ktel-santorini.gr | OpenStreetMap (ODbL) | 2026-11-02 |
| Milos | Milos Buses | milosbuses.com | OpenStreetMap (ODbL) | 2026-11-02 |
| Ios | Ios Local Buses (KTEL Ios) Δημοτικές Γραμμές Ίου | ktel-ios.gr | OpenStreetMap (ODbL) | 2026-11-02 |
-
Operator: KTEL Naxos · official timetable retrieved 2026-11-02verified until 2026-11-06+30 22850 22291
-
Operator: KTEL Paros · official timetable retrieved 2026-11-02verified until 2026-11-27
-
Operator: KTEL Santorini · official timetable retrieved 2026-11-02verified until 2026-11-08
-
Operator: Milos Buses · official timetable retrieved 2026-11-02verified until 2027-05-03
-
Operator: Ios Local Buses (KTEL Ios) · official timetable retrieved 2026-11-02verified until 2026-11-30
We take departure times and fares from the operator. We take coordinates, road geometry and place names from OpenStreetMap, which is licensed ODbL 1.0 — that is why every island app carries the “© OpenStreetMap contributors” attribution. We do not copy an operator's page layout, styling or timetable artwork; we publish the facts in our own presentation.
The pipeline, step by step
- 1
Fetch
A per-operator adapter reads one class of operator website and produces a normalised shape. Each Cyclades operator uses a different CMS, so each has its own adapter plus a committed fixture it is tested against.
- 2
Extract
Departures, destinations, stop names and the operator’s own corridor labels come out as structured records, with the source URL and a content hash attached.
- 3
Place
Stop names are matched to OpenStreetMap within a distance bound. A name match alone is never enough — duplicate place names collide, and a wrong coordinate sends a traveller to the wrong village.
- 4
Interpolate
If the operator publishes only a departure and an arrival time, the intermediate stop times are distributed along the road geometry. Every interpolated value is flagged as an estimate in the data and in the UI.
- 5
Validate
The dataset is checked against a schema, then audited for duplicate coordinates, noise stops and destinations we cannot map. Unmapped destinations are recorded as a gap rather than silently dropped.
- 6
Publish
The dataset is committed to Git. The Vercel build never touches the network. If the dataset’s validity window has passed, the build fails rather than shipping a stale schedule.
What “interpolated” means, precisely
Suppose an operator prints one bus leaving Naxos Town at 07:00 and reaching Apollon at 07:55, with twelve stops in between and no times for them. We distribute those 55 minutes across the stops in proportion to road distance. Departures from the hub and from named villages are therefore exact; the village-to-village times in the middle are estimates and can be off by up to a few minutes on a steep road or in August traffic. Anything interpolated is labelled as such.
The validity window, and why we would rather go offline
Every dataset carries a date after which it is no longer trustworthy. When that date passes, the build fails. This is uncomfortable and it is deliberate: a holidaymaker acting on a timetable from last August is worse off than one who sees nothing at all. It is also a promise we can keep automatically rather than by remembering.
Where we have been wrong
Twice, in ways worth writing down. On Paros, stop names were matched to OpenStreetMap by name alone, which produced a wrong coordinate for two stops; the fix was distance-bounded matching. Then a single new destination label on Naxos — “AIRPORT (300meters)” — stalled a publish for days and left the island on an expired timetable; the fix was recording unmapped destinations as gaps and publishing the rest. Both are documented in the changelog. If you find a third, tell us .
What we deliberately do not do
- We do not upload or register our GTFS with Google Maps, Apple Maps, Moovit, Transit App or any other aggregator. Being a transit data provider carries accuracy and liability obligations we are not equipped to carry. The data stays ours to serve; you are welcome to download it.
- We do not sell, book or issue bus tickets, and we take no commission on fares.
- We do not run advertising trackers, and we do not sell or share visitor data. Sponsorship buys visibility and nothing else.