API
Serwis udostępnia własne endpointy, z których korzysta jego aplikacja. Są publiczne i dostępne bez klucza, ale nie są produktem: mogą się zmienić razem z aplikacją.
Dostępne adresy
/api/delay-leaders/api/departures/api/komunikaty/api/linie/api/live-vehicles/api/map-tile/api/mevo/api/okolica/api/pojazd/api/push-alarm/api/push-klucz/api/push-subskrypcja/api/push-wypisz/api/rozklad-linii/api/rozklady/odjazdy/api/rozklady/przystanki/api/ruch/api/skm/odjazdy/api/skm/stacje/api/statystyki/api/statystyki-linii/api/statystyki-szczegoly/api/stops/api/topology/api/trasa/api/vehicles
Wszystkie zwracają JSON i obsługują ETag — powtórne żądanie z nagłówkiem If-None-Match dostaje 304 bez treści.
Pojazdy na żywo
/api/live-vehicles zwraca pojazdy, które w tej chwili jadą daną linią, albo pojazd o danym numerze taborowym, albo jeden pojazd o dokładnie podanym kluczu.
?line=171— pojazdy linii o tym numerze (dokładne dopasowanie); opcjonalnie
&source=gdansk lub &source=gdynia zawęża do jednego miasta.
?fleet=3081— numer taborowy, dokładny lub jego początek. Zapisgdynia:3081zawęża do Gdyni.?key=3081— dokładnie ten jeden pojazd: klucz bez prefiksu to Gdańsk,gdynia:3081to Gdynia.
Odpowiedź zawiera ten pojazd albo żadnego (nigdy pojazd o numerze zaczynającym się tak samo), a &source= nie może przeczyć miastu z klucza (400).
&stops=3— tylko razem zkey, wartość od 1 do 10: dołącza do pojazdu następne przystanki
(pole nastepne, opis niżej).
&route=1— tylko razem zkey(bezkeylub z inną wartością niż1to400): dołącza do
pojazdu cały kurs, od pierwszego do ostatniego przystanku (pola trasa i poz, opis niżej). Nie łączy się z stops (400) — kto prosi o cały kurs, nie potrzebuje osobno najbliższych.
Podaj dokładnie jeden z parametrów line, fleet i key; zły parametr daje 400. Numery taborowe Gdańska i Gdyni mogą się powtarzać, dlatego każdy pojazd ma klucz key (dla Gdyni z prefiksem: gdynia:3081) i zawsze podane miasto w polu zrodlo. Gdy ten sam autobus występuje w obu źródłach (ten sam numer taborowy i ta sama linia), zwracany jest tylko rekord gdański, bo ma kierunek, przystanek i opóźnienie; lacznie liczy już po tym scaleniu.
Odpowiedź: dostepny, pobrano (czas migawki GPS w ms), lacznie (ile pojazdów pasuje) i pojazdy (najwyżej 60, posortowane według miasta i numeru taborowego). Pojazd ma pola key, zrodlo, numer, linia, a gdy serwer potrafi je ustalić: rodzaj (opis w „Rodzaj pojazdu" niżej), kierunek, doKad (dokąd jedzie), przystanek (najbliższy przystanek na trasie), miejsce (gdzie dokładnie jest, opis w „Gdzie jest pojazd" niżej), start (planowany czas rozpoczęcia bieżącego kursu, UTC w zapisie ISO, na przykład 2026-10-01T04:31:00Z), d (opóźnienie w sekundach) i wiek (wiek pozycji w sekundach względem pobrano). Pola, których nie da się ustalić, są pomijane, a nie zgadywane — na przykład Gdynia nie publikuje opóźnień ani czasu rozpoczęcia kursu. Gdy nie ma żadnych danych GPS, odpowiedź to dostepny: false z powodem.
Następne przystanki i czas przyjazdu
Z ?key=…&stops=N pojazd ma dodatkowo pole nastepne: do N najbliższych przystanków przed pojazdem, w kolejności trasy, każdy jako {id, nazwa, eta}. Pole pojawia się tylko wtedy, gdy serwer zna kierunek i położenie pojazdu na trasie, a przystanek zwalnia się z listy, gdy pojazd go minie. eta to szacunek w czasie polskim w zapisie HH:MM (z dokładnością do minuty): godzina rozkładowa tego kursu na danym przystanku plus aktualne opóźnienie pojazdu. To przybliżenie, nie obietnica — w aplikacji jest podpisane „ok.".
eta jest pomijana, a przystanek zostaje na liście, gdy serwer nie umie jej ustalić, zamiast podawać wartość zgadniętą: dla Gdyni (brak rozkładu i opóźnień w danych), dla kursu, którego nie ma w rozkładzie, dla pojazdu bez opóźnienia, dla ostatniego przystanku kursu i dla przystanku, którego czas już minął. W polskie święta państwowe eta nie ma żaden przystanek, bo rozkład zna tylko dni powszednie, soboty i niedziele, a godzina z takiego dnia byłaby błędna. Odpowiedź z stops zależy też od pliku rozkładów, więc jej ETag zmienia się razem z nim.
Cały kurs
Z ?key=…&route=1 pojazd ma zamiast nastepne dwa pola: trasa — wszystkie przystanki kursu w kolejności trasy, każdy jako {id, nazwa, eta} — oraz poz, czyli numer (od zera) pierwszego przystanku, który jest jeszcze przed pojazdem. Przystanki o numerach mniejszych niż poz pojazd już minął i nigdy nie mają eta; trasa[poz] to przystanek, do którego jedzie, a gdy poz równa się długości trasy, nie ma już przystanków przed nim. Przystanki przed pojazdem, czyli trasa.slice(poz), dostają eta według tych samych reguł co w nastepne (to jedna funkcja w kodzie) i te same wyjątki (Gdynia, święta, kurs spoza rozkładu, brak opóźnienia, ostatni przystanek, czas, który minął), więc trasa.slice(poz) jest zawsze zgodna z odpowiedzią na stops=10 w tej samej chwili. Pola pojawiają się tylko wtedy, gdy serwer zna kierunek i kurs; gdy nie, pojazd jest bez nich, bez zgadywania. Odpowiedź nie ma wtedy też nastepne. ETag odpowiedzi z route jest inny niż z stops i bez nich, bo to inna treść, i zmienia się razem z plikiem rozkładów.
Gdzie jest pojazd
Gdy serwer zna kierunek pojazdu i jego położenie na trasie, pojazd ma pole miejsce w każdym rodzaju odpowiedzi (line, fleet, key, z stops i route albo bez nich). Ma jedną z dwóch postaci:
{"na": "Paska 01"}— pojazd jest NA tym przystanku: w odległości do 25 m od niego wzdłuż trasy,
po dowolnej stronie (autobus czekający na przystanku stoi tuż przed nim albo tuż za nim);
{"z": "Ciasna 01", "do": "Paska 01"}— pojazd jest W DRODZE między dwoma przystankami:zto
ostatni przystanek za nim, do pierwszy przed nim (ten, do którego jedzie).
Z ?key=…&route=1 pole ma też i, czyli numer (od zera) w trasa przystanku, na którym jest (na), albo przystanku za nim (z). Liczy się go z tej samej listy i tą samą regułą 25 m co poz, więc zawsze się zgadzają: dla z/do jest i równe poz - 1, a trasa[poz] to do; dla na jest i mniejsze niż poz. Bez trasa nie ma i.
miejsce jest pomijane, a nie zgadywane, gdy brak kierunku albo pojazd jest poza trasą, oraz w dwóch przypadkach, na które nie ma uczciwego sformułowania: PRZED pierwszym przystankiem (żaden przystanek nie jest za pojazdem, więc „w drodze z..." wymyślałoby go) i ZA ostatnim o więcej niż 25 m (nic już nie jest przed nim). przystanek zostaje jak był — najbliższy przystanek, z tyłu albo z przodu — dla klientów, którzy go czytają. Gdy znana jest lista przystanków samego kursu (stops lub route z kursem z rozkładu), przystanki są z kursu, więc przystanek, którego kurs nie obsługuje, nigdy nie jest nazwany; w przeciwnym razie są to przystanki wariantu trasy.
Rodzaj pojazdu
Pole rodzaj ma jedną z trzech wartości: autobus, tramwaj albo trolejbus. Serwer czyta je z typu trasy (route_type) w rozkładzie GTFS miasta, do którego należy pojazd, czyli ustala rodzaj LINII, nie samego pojazdu: w danych na dzień 2026-10-01 linie gdańskie 2–12 to tramwaje, gdyńskie 21–33, 710 i 723 to trolejbusy, a pozostałe linie obu miast to autobusy. To jedyne źródło, które obejmuje oba miasta — Gdynia nie publikuje bazy pojazdów. Skutek uboczny: autobus puszczony za tramwaj (albo spalinowy na linii trolejbusowej) zostanie opisany jako rodzaj swojej linii.
rodzaj jest pomijane, a nie zgadywane, gdy pojazd nie ma numeru linii, gdy rozkład nie zna tej linii, gdy trasy o tym samym numerze mają w rozkładzie różne typy i gdy plik topologii jeszcze nie powstał. Pole zależy od tego samego pliku topologii co kierunek i przystanki, więc ETag odpowiedzi już je obejmuje: zmienia się razem z plikiem, a nie z każdą migawką GPS.
Co jest w bazie analitycznej
Dane historyczne, na których liczone są statystyki. Poniższa lista jest generowana wprost ze schematu bazy, więc nie może się z nim rozjechać.
| tabela | kolumny |
|---|---|
gps_snapshot | id, last_update, fetched_at, vehicles, a, both, from, that, number, two, source |
gps_course | id, route_id, trip_id, scheduled_start, route_short, headsign |
gps_vehicle | source, vehicle_id, vehicle_code, first_seen, last_seen |
gps_position | snapshot_id, vehicle_id, course_id, service, generated, lat, lon, speed, direction, delay, gps_quality |
dep_sighting | id, stop_key, dep_key, source, line, headsign, scheduled, trip_start, vehicle_code, vehicle_id, channel, first_seen, last_seen, samples, first_eta, last_eta, last_delay, last_status, gone_at, gone_reason |
dep_delay_sample | sighting_id, at, delay, eta, status |
agg_godzina | godzina_utc, source, klasa, wersja_regul, probek, mediana, p90, srednia, ponad5min, ponad15min, przed1min, przed2min |
agg_linia | godzina_utc, source, line, wersja_regul, probek, srednia, mediana, ponad5min, przed1min, przed2min, slupkow |
ruch_godzina | godzina_utc, kategoria, zadan |
ruch_wizyty | godzina_utc, wizyt |
ruch_sciezka | godzina_utc, sciezka, zadan |
ruch_klient | godzina_utc, klasa, zadan, wizyt |
push_subskrypcja | endpoint, p256dh, auth, utworzono, ostatnio_ok, bledy |
push_alarm | endpoint, alarm_id, o_ms, dodano, wyslano |
ruch_dzien | dzien, wizyt, zadan |
ruch_szkic | klucz, szkic |
agg_przystanek | godzina_utc, stop_key, wersja_regul, probek, srednia, ponad5min, przed1min, linii |
agg_gps_godzina | godzina_utc, source, pozycji, pojazdow, predkosc_sr, predkosc_med, stojacych, jakosc_zla, bez_kursu |
agg_dryf | godzina_utc, horyzont_min, wersja_regul, kursow, mediana_abs, p90_abs, mediana_znak, srednia_znak, odrzuconych, stabilnych, wczesniej60, pozniej60 |
agg_widma | godzina_utc, klasa, literowa, wersja_regul, znikniec |
odcinek | id, line, grupa_a, grupa_b, dystans_prosty |
agg_odcinek | godzina_utc, odcinek_id, wersja_regul, przejazdow, czas_sum, dystans_sum, czas_med, czas_p90, predkosc_med |
agg_predkosc_linia | godzina_utc, line, wersja_regul, przejazdow, odcinkow, czas_sum, dystans_sum, czas_med, predkosc_med, odrzuconych |
plk_zatrzymanie | pociag, stacja, plan, WITHOUT, shifts, happened, text, IT, plan_ms, nazwa_stacji, faktyczny, feature, would, an, Unlike, rows, faktyczny_ms, opoznienie_min, potwierdzone, odwolane, computing, observation, numer, rail, number, different, przewoznik, to, The, generated_at |
agg_odjazd_linia | godzina_utc, source, line, wersja_odjazdow, odjazdow, przed_czasem, przed_czasem_2, przeczekal, o_czasie, spoznionych, niedopasowanych, odchylenie_med, przyjazd_odchylenie_med, odchylenie_hist |
agg_odjazd_grupa | godzina_utc, source, grupa, wersja_odjazdow, odjazdow, przed_czasem, przed_czasem_2, przeczekal, o_czasie, spoznionych, niedopasowanych, odchylenie_med |
agg_odjazd_linia_grupa | godzina_utc, source, line, headsign, grupa, wersja_odjazdow, odchylenie_hist |
agg_plk_godzina | godzina_utc, przewoznik, wersja_plk, zatrzyman, opoznionych, wczas, mediana_min, p90_min, of, not, hist |
agg_plk_done | godzina_utc, wersja_plk, computed_ms |
agg_done | aggregate, godzina_utc, wersja, computed_ms |
agg_postoj | source, stop_id, wersja_regul, probek, histogram, mediana_s |
agg_postoj_globalny | source, wersja_regul, probek, histogram, mediana_s |
Żadna z tych tabel nie zawiera informacji o osobach korzystających z serwisu — opisują wyłącznie pojazdy, kursy i przystanki. Szczegóły: Prywatność.
Skąd brać dane źródłowe
Jeśli budujesz coś własnego, sięgaj bezpośrednio do API miast, a nie do tego serwisu: dane są tam pierwotne, a Twoje zapytania nie będą zależeć od dostępności cudzej nakładki.