Bus Sun Side API Online
Welche Seite eines Reisebusses auf einer Fahrt Sonne oder Schatten bekommt und welche Sitze am besten für Schatten oder Aussicht sind. Die Fahrt wird in 5-Minuten-Schritten durchlaufen: Position und Fahrtrichtung aus der Route, Sonnenstand an diesem Ort zu dieser Zeit, dann eine Schätzung je Sitz für die gewählte Busanordnung. Nutzen Sie eine Route aus unserem Register lizenzierter Linien (route_id), zwei Punkte (from/to) oder senden Sie per POST Ihre eigene Route (Halte oder eine polyline), um zusätzlich einen Sitzplan, eine Routenkarte und eine Zeitleiste als Bilder zu erhalten. Die Ergebnisse sind eine Schätzung aus Geometrie und Sonnenstand; echter Schatten hängt auch von Vorhängen, Gebäuden, Gelände und Wetter ab.
GET https://nakordoni.eu/api/v2/data/bus-sun-side
— Kontingentklasse: heavy
| Parameter | Beschreibung |
|---|---|
route_id | Routen-id aus unserem Busroutenregister (dieselben ids wie auf den Busseiten von nakordoni.eu). Verwenden Sie route_id oder from+to. |
dir | direct (Standard) oder return. |
date | Reisedatum YYYY-MM-DD (Standard heute). Der Sonnenstand hängt vom Datum ab. |
dep | Abfahrtszeit HH:MM in Ortszeit der Route (Standard: Fahrplan aus dem Register). |
from | Freie Route: Startpunkt lat,lon (zusammen mit to). |
to | Freie Route: Endpunkt lat,lon (zusammen mit from). |
depart | Freie Route: Abfahrt YYYY-MM-DDTHH:MM, Ortszeit des Startpunkts. |
lang | Sprache der Ortsnamen und Texte, 25 Sprachen (en, uk, pl, de, …). Standard en. |
bus_model | Busmodell-id aus bus-sun-catalog (Standard standard_coach). Jedes Feld unten überschreibt das Modell. |
rows | Seat rows, 8-20. |
layout | Sitzanordnung: 2+2, 2+1 oder 1+2 (links+rechts vom Gang). |
door_side | right (Kontinentaleuropa) oder left. |
windshield | large oder normal — wie viel Sonne die ersten Reihen durch die Windschutzscheibe bekommen. |
rear_window | none, small oder large — Sonne auf den letzten Reihen. |
window_height | standard oder panoramic (hohe Seitenfenster). |
deck | single, upper oder lower (Doppeldecker-Reisebusse). |
mid_door | 1 oder 0 — Mitteltür vorhanden (entfernt die Sitze dort). |
timeline | 0 = Zeitleiste weglassen (15-Minuten-Zeilen). |
track | 0 = zeitgestempelte Trackpunkte weglassen. |
weather | 1 (Standard) oder 0. Mit 1 wird eine Wettervorhersage entlang der Fahrt genutzt, wenn die Fahrt in den nächsten 3 Tagen (72 h) liegt; spätere Fahrten und weather=0 verwenden klaren Himmel. |
animation | 1 (default) or 0. With 0, the animation block (sun and coach position every 5 minutes) is left out. POST body: animation true|false. |
Antwortfelder — innerhalb des data-Objekts im Antwortumschlag. [] steht für eine Liste, data.items[].name ist also das Feld name jedes Elements. Ein Feld ist null, fehlt oder ist eine leere Liste, wenn wir keinen Wert dafür haben — nie ein Platzhalter.
| Feld | Beschreibung |
|---|---|
data.date / data.tz | Travel date and the time zone of the times in the answer. |
data.route | id, num, from, to, dir, dep, arr, km (registry route) — or the stops you sent (POST). |
data.basis | How the timed path was built: timetable (registry or your stop times), router (our road route between points) or geometry (your polyline). |
data.bus | The bus profile used: model, layout, rows, door_side, windshield, rear_window, window_height, deck, mid_door. |
data.summary | trip_min, daylight_min, night_min and minutes with the sun on the left, right, ahead and behind (weather-weighted when a forecast was used). |
data.recommend | shade_side, sun_side, shade_pct, best_shade_seats[], best_sun_seats[], confidence (high | medium | low), reason_key; tip_key hot_sun_side when the sunny side is forecast at 28 °C or more. reason_key mostly_cloudy (shade_side any) when the forecast is mostly cloud or rain. |
data.recommend_clear | The same recommendation for a clear sky (no weather). |
data.weather_changes_answer | true when the forecast changes the shade side compared with recommend_clear. |
data.weather | used, window_h (72), covered_pct, sunny_min, cloudy_min, rain_min, max_temp, note_key (forecast_used | partly_forecast | mostly_cloudy | rain_expected | clear_sky_only). |
data.zones | front / middle / back: left and right sun exposure 0-100 and rows [first, last] of that part. |
data.seats | layout, rows, cols[], grid[][]: every seat — id (e.g. 4C), side, pos (window | aisle), exp (sun exposure 0-100), door (true next to a door). |
data.timeline[] | One row per 15 min: t, lat, lon, hd (heading), az / el (sun azimuth / elevation), side (left | right | ahead | behind | none), w (sun strength); wx {code, f, temp, precip} when a forecast was used. |
data.track[] | Track points [lat, lon, sun side] for drawing the route (leave out with track=0). |
data.input | POST only: how your route was read — source, timed_by, stops, points, legs_routed, legs_straight, timezone. |
data.images | POST only: seat_map, route_map, timeline — each {url, format, expires_at}; url = https://api.nakordoni.dev/images/<random name>.<png | webp | jpg> (body format, default png). Files are kept 12 hours. format svg: PNG files plus the seat map as inline SVG (seat_map.svg). |
data.embed_html | POST only: a self-contained HTML figure with the seat map (inline SVG) to paste into a page; null with embed_html=false. |
Ohne Code ausprobieren: Der Bus-Sonnenseiten-Planer führt diese API für jede Route oder Ihre eigene Fahrt aus und zeigt Sitzplan, Karte, Zeitleiste, Bilder und den Code für den Aufruf. Planer öffnen →
Your route (POST)
Senden Sie Ihre eigene Route als JSON-Body per POST an dieselbe URL. Die Antwort hat dieselben Felder wie GET plus input (wie Ihre Route gelesen wurde), images (Sitzplan, Routenkarte und Zeitleiste) und embed_html.
Halte ohne Geometrie werden mit unserem Straßenrouter verbunden; ein Abschnitt, der nicht geroutet werden kann, wird als gerade Linie gezeichnet und in input.legs_straight gezählt. Zeiten: mindestens zwei Halte mit Zeit oder route.depart mit route.duration_min oder route.speed_kmh. Eine Fahrt kann bis zu 72 h dauern.
| Body field | Beschreibung |
|---|---|
route.stops | 2-200 Halte in Reihenfolge: {lat, lon, name?, arr?, dep?, day?}. arr / dep sind Ortszeit HH:MM; day = Tage nach route.date (Zeiten über Mitternacht werden automatisch übertragen). |
route.geometry | Ihr Pfad: GeoJSON LineString, MultiLineString, Feature oder FeatureCollection (Reihenfolge [lon, lat]) oder ein kodierter polyline-String. Bis zu 5000 Punkte. Mit stops liefern die Halte die Zeiten und die Geometrie den Pfad. |
route.polyline_precision | 5 (Standard) oder 6, für eine kodierte polyline. |
route.date | YYYY-MM-DD der Zeit des ersten Halts (Standard heute). |
route.depart | Abfahrt YYYY-MM-DDTHH:MM, wenn die Halte keine Zeiten haben oder Sie nur eine Geometrie senden. |
route.duration_min | Fahrtdauer in Minuten, zusammen mit depart (sonst ergibt sich die Zeit aus speed_kmh). |
route.speed_kmh | Durchschnittsgeschwindigkeit zusammen mit depart, Standard 65. |
route.timezone | IANA-Zeitzone der gesendeten Zeiten (Standard: Zeitzone des Landes des ersten Punkts). |
bus | Der Bus: bus_model aus dem Katalog und/oder seats, rows, layout, door_side, windshield, rear_window, window_height, deck, mid_door — dieselben Felder wie die GET-Parameter. Standard standard_coach. |
images | Welche Bilder erzeugt werden: beliebige aus seat_map, route_map, timeline (Standard alle drei); [] = keine. |
format | png (Standard), webp oder jpg: Dateityp jeder Bild-URL. svg: PNG-Dateien, und der Sitzplan wird zusätzlich inline als SVG zurückgegeben (seat_map.svg). |
theme | light (default) or dark. |
lang | Sprache der Bildbeschriftungen und Texte, 25 Sprachen (Standard en). |
width | Bildbreite in px, 240-1600 (Standard: natürliche Größe). |
embed_html | true (Standard) = zusätzlich embed_html zurückgeben; false = null. |
timeline / track | false = diese Liste in der Antwort weglassen. |
weather | true (Standard) oder false: Wettervorhersage entlang der Fahrt nutzen (nächste 3 Tage); false = nur klarer Himmel. 1 und 0 werden ebenfalls akzeptiert. |
Ein falsches oder fehlendes Feld ergibt HTTP 400, wobei error.field seinen Pfad enthält, zum Beispiel route.stops[2].lat oder bus.seats.
curl -X POST "https://nakordoni.eu/api/v2/data/bus-sun-side" \
-H "Authorization: Bearer NKD-DEV-XXXX-XXXX-XXXX" \
-H "Content-Type: application/json" \
-d '{
"route": {
"stops": [
{
"name": "Poznań Dworzec Autobusowy",
"lat": 52.4011,
"lon": 16.911,
"dep": "08:00"
},
{
"name": "Konin",
"lat": 52.223,
"lon": 18.2511,
"arr": "09:20",
"dep": "09:25"
},
{
"name": "Łódź Kaliska",
"lat": 51.7573,
"lon": 19.4306,
"arr": "10:55",
"dep": "11:05"
},
{
"name": "Warszawa Zachodnia",
"lat": 52.219,
"lon": 20.965,
"arr": "13:10"
}
],
"date": "2026-06-21",
"timezone": "Europe/Warsaw"
},
"bus": {
"bus_model": "minibus"
},
"images": [
"seat_map",
"route_map",
"timeline"
],
"format": "png",
"theme": "light",
"lang": "en",
"weather": true
}'
const res = await fetch('https://nakordoni.eu/api/v2/data/bus-sun-side', {
method: 'POST',
headers: { 'Authorization': 'Bearer NKD-DEV-XXXX-XXXX-XXXX', 'Content-Type': 'application/json' },
body: JSON.stringify({
route: { stops: [
{ name: 'Poznań', lat: 52.4011, lon: 16.911, dep: '08:00' },
{ name: 'Warszawa', lat: 52.219, lon: 20.965, arr: '11:30' } ],
date: '2026-06-21', timezone: 'Europe/Warsaw' },
bus: { bus_model: 'comfort_coach_2_1' },
images: ['seat_map'], format: 'svg', lang: 'pl'
})
});
const { data } = await res.json();
console.log(data.recommend.shade_side, data.recommend.best_shade_seats);
document.querySelector('#seats').innerHTML = data.embed_html; // or <img src="data.images.seat_map.url">
Images and embed_html
Jedes Bild hat eine eigene URL mit zufälligem Dateinamen (.png, .webp oder .jpg). Die URLs brauchen keinen Schlüssel und sind 12 Stunden gültig (expires_at); kopieren Sie die Dateien, wenn Sie sie länger benötigen. embed_html ist ein eigenständiges figure mit dem Sitzplan als Inline-SVG und einer Quellenzeile nakordoni.eu; behalten Sie die Quellenangabe bei der Anzeige bei.
Unten: die Bilder für den Beispiel-Body oben (Kleinbus, Posen nach Warschau, 21. Juni).



Bus catalogue
bus_model akzeptiert eine dieser allgemeinen Fahrzeugklassen (keine konkreten Marken). Jedes gesendete Bus-Feld überschreibt das Modell; seats wird für das layout in rows umgerechnet. Dieselbe Liste ist als JSON über bus-sun-catalog verfügbar.
| bus_model | layout | rows | door_side | windshield | rear_window | window_height | deck | mid_door | typical_seats |
|---|---|---|---|---|---|---|---|---|---|
standard_coachStandard touring coach (12-13 m, 2+2) |
2+2 | 13 | right | large | small | standard | single | true | 49-53 |
panoramic_coachCoach with panoramic (tall) side windows, 2+2 |
2+2 | 13 | right | large | small | panoramic | single | true | 49-53 |
midi_coachMidi coach (9-10 m, 2+2) |
2+2 | 9 | right | large | small | standard | single | false | 33-37 |
comfort_coach_2_1Comfort coach with 2+1 seating |
2+1 | 12 | right | large | small | standard | single | true | 33-36 |
minibusMinibus (7-8 m, 2+1) |
2+1 | 6 | right | normal | large | standard | single | false | 16-20 |
double_deck_upperDouble-deck coach, upper deck |
2+2 | 15 | right | large | small | panoramic | upper | false | 56-64 on the upper deck |
double_deck_lowerDouble-deck coach, lower deck |
2+2 | 5 | right | normal | none | standard | lower | true | 12-20 on the lower deck |
Allowed values:
layout 2+2 | 2+1 | 1+2 · rows {"min":4,"max":20,"custom_min":8} · door_side right | left · windshield large | normal · rear_window none | small | large · window_height standard | panoramic · deck single | upper | lower · mid_door true | false
Weather
Mit weather=1 (Standard; im POST-Body "weather": true) nutzt die Antwort eine stündliche Wettervorhersage entlang der Fahrt für die nächsten 3 Tage (72 h); spätere Teile der Fahrt verwenden klaren Himmel. summary.sun_*_min werden dann nach der Vorhersage gewichtet, jede timeline-Zeile erhält wx {code, f, temp, precip}, und weather {used, window_h, covered_pct, sunny_min, cloudy_min, rain_min, max_temp, note_key} gibt an, welchen Anteil der Fahrt die Vorhersage abgedeckt hat. recommend_clear ist die Antwort für klaren Himmel; weather_changes_answer ist true, wenn die Vorhersage die Schattenseite ändert. Ist die Vorhersage überwiegend bewölkt oder regnerisch, ist recommend.reason_key mostly_cloudy und shade_side any. recommend.tip_key hot_sun_side bedeutet, dass für die Sonnenseite 28 °C oder mehr vorhergesagt sind.
Quota and accuracy
GET sowie POST mit "images": [] zählen als 1 Einheit der schweren Klasse; ein POST, der Bilder erzeugt, zählt 2. bus-sun-catalog ist ein günstiger Aufruf. Derselbe POST-Body liefert die gespeicherte Antwort bis zu 6 Stunden lang (1 Stunde, wenn eine Wettervorhersage verwendet wurde).
Das Ergebnis ist eine Schätzung aus der Routengeometrie und dem Sonnenstand. Vorhänge, getönte Scheiben, Gebäude, Bäume, Gelände und eine geänderte Route sind uns nicht bekannt. Wolken und Regen stammen nur für Fahrten in den nächsten 3 Tagen aus einer Wettervorhersage; spätere Fahrten nehmen klaren Himmel an. confidence ist niedriger, wenn die Sonne tief steht, die Fahrt kurz ist, die Route oft abbiegt oder die Vorhersage überwiegend bewölkt ist.
curl "https://nakordoni.eu/api/v2/data/bus-sun-side?route_id=521&dir=direct&date=2026-06-21&bus_model=standard_coach&lang=en" \ -H "Authorization: Bearer NKD-DEV-XXXX-XXXX-XXXX"
Aktualisiert