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

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.

&source=gdansk lub &source=gdynia zawęża do jednego miasta.

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).

(pole nastepne, opis niżej).

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:

po dowolnej stronie (autobus czekający na przystanku stoi tuż przed nim albo tuż za nim);

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ć.

tabelakolumny
gps_snapshotid, last_update, fetched_at, vehicles, a, both, from, that, number, two, source
gps_courseid, route_id, trip_id, scheduled_start, route_short, headsign
gps_vehiclesource, vehicle_id, vehicle_code, first_seen, last_seen
gps_positionsnapshot_id, vehicle_id, course_id, service, generated, lat, lon, speed, direction, delay, gps_quality
dep_sightingid, 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_samplesighting_id, at, delay, eta, status
agg_godzinagodzina_utc, source, klasa, wersja_regul, probek, mediana, p90, srednia, ponad5min, ponad15min, przed1min, przed2min
agg_liniagodzina_utc, source, line, wersja_regul, probek, srednia, mediana, ponad5min, przed1min, przed2min, slupkow
ruch_godzinagodzina_utc, kategoria, zadan
ruch_wizytygodzina_utc, wizyt
ruch_sciezkagodzina_utc, sciezka, zadan
ruch_klientgodzina_utc, klasa, zadan, wizyt
push_subskrypcjaendpoint, p256dh, auth, utworzono, ostatnio_ok, bledy
push_alarmendpoint, alarm_id, o_ms, dodano, wyslano
ruch_dziendzien, wizyt, zadan
ruch_szkicklucz, szkic
agg_przystanekgodzina_utc, stop_key, wersja_regul, probek, srednia, ponad5min, przed1min, linii
agg_gps_godzinagodzina_utc, source, pozycji, pojazdow, predkosc_sr, predkosc_med, stojacych, jakosc_zla, bez_kursu
agg_dryfgodzina_utc, horyzont_min, wersja_regul, kursow, mediana_abs, p90_abs, mediana_znak, srednia_znak, odrzuconych, stabilnych, wczesniej60, pozniej60
agg_widmagodzina_utc, klasa, literowa, wersja_regul, znikniec
odcinekid, line, grupa_a, grupa_b, dystans_prosty
agg_odcinekgodzina_utc, odcinek_id, wersja_regul, przejazdow, czas_sum, dystans_sum, czas_med, czas_p90, predkosc_med
agg_predkosc_liniagodzina_utc, line, wersja_regul, przejazdow, odcinkow, czas_sum, dystans_sum, czas_med, predkosc_med, odrzuconych
plk_zatrzymaniepociag, 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_liniagodzina_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_grupagodzina_utc, source, grupa, wersja_odjazdow, odjazdow, przed_czasem, przed_czasem_2, przeczekal, o_czasie, spoznionych, niedopasowanych, odchylenie_med
agg_odjazd_linia_grupagodzina_utc, source, line, headsign, grupa, wersja_odjazdow, odchylenie_hist
agg_plk_godzinagodzina_utc, przewoznik, wersja_plk, zatrzyman, opoznionych, wczas, mediana_min, p90_min, of, not, hist
agg_plk_donegodzina_utc, wersja_plk, computed_ms
agg_doneaggregate, godzina_utc, wersja, computed_ms
agg_postojsource, stop_id, wersja_regul, probek, histogram, mediana_s
agg_postoj_globalnysource, 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.