API Bus Sun Side Online
Quel côté d'un autocar reçoit le soleil ou l'ombre pendant un trajet, et quels sièges sont les meilleurs pour l'ombre ou pour la vue. Le trajet est parcouru par pas de 5 minutes : position et cap d'après l'itinéraire, position du soleil à cet endroit et à cette heure, puis une estimation par siège pour la disposition de bus choisie. Utilisez un itinéraire de notre registre des lignes autorisées (route_id), deux points (from/to), ou envoyez en POST votre propre itinéraire (arrêts ou polyline) pour obtenir aussi un plan des sièges, une carte du trajet et une chronologie en images. Les résultats sont une estimation à partir de la géométrie et de la position du soleil ; l'ombre réelle dépend aussi des rideaux, des bâtiments, du relief et de la météo.
GET https://nakordoni.eu/api/v2/data/bus-sun-side
— classe de quota: heavy
| Paramètre | Description |
|---|---|
route_id | Id d'itinéraire de notre registre des lignes de bus (les mêmes id que sur les pages bus de nakordoni.eu). Utilisez route_id ou from+to. |
dir | direct (par défaut) ou return. |
date | Date du trajet YYYY-MM-DD (par défaut aujourd'hui). La position du soleil dépend de la date. |
dep | Heure de départ HH:MM, heure locale de l'itinéraire (par défaut : l'horaire du registre). |
from | Trajet libre : point de départ lat,lon (avec to). |
to | Trajet libre : point d'arrivée lat,lon (avec from). |
depart | Trajet libre : départ YYYY-MM-DDTHH:MM, heure locale du point de départ. |
lang | Langue des noms de lieux et des textes, 25 langues (en, uk, pl, de, …). Par défaut en. |
bus_model | Id du modèle de bus de bus-sun-catalog (par défaut standard_coach). Tout champ ci-dessous remplace le modèle. |
rows | Seat rows, 8-20. |
layout | Disposition des sièges : 2+2, 2+1 ou 1+2 (gauche+droite de l'allée). |
door_side | right (Europe continentale) ou left. |
windshield | large ou normal — quantité de soleil que les premières rangées reçoivent à travers le pare-brise. |
rear_window | none, small ou large — soleil sur les dernières rangées. |
window_height | standard ou panoramic (hautes vitres latérales). |
deck | single, upper ou lower (autocars à deux niveaux). |
mid_door | 1 ou 0 — porte centrale présente (supprime les sièges à cet endroit). |
timeline | 0 = omettre la chronologie (lignes de 15 minutes). |
track | 0 = omettre les points de trace horodatés. |
weather | 1 (par défaut) ou 0. Avec 1, une prévision météo le long du trajet est utilisée lorsque le trajet a lieu dans les 3 prochains jours (72 h) ; les trajets ultérieurs et weather=0 utilisent un ciel dégagé. |
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. |
Champs de la réponse — à l’intérieur de l’objet data de l’enveloppe. [] indique une liste : data.items[].name est donc le champ name de chaque élément. Un champ vaut null, est absent ou est une liste vide quand nous n’avons pas de valeur — jamais un espace réservé.
| Champ | Description |
|---|---|
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. |
Essayez sans code : le planificateur du côté soleil exécute cette API sur n’importe quel itinéraire ou votre propre trajet et affiche le plan des sièges, la carte, la chronologie, les images et le code de l’appel. Ouvrir le planificateur →
Your route (POST)
Envoyez votre propre trajet sous forme de corps JSON en POST à la même URL. La réponse contient les mêmes champs que GET plus input (comment votre trajet a été lu), images (plan des sièges, carte du trajet et chronologie) et embed_html.
Les arrêts sans géométrie sont reliés par notre routeur routier ; un tronçon impossible à calculer est tracé en ligne droite et compté dans input.legs_straight. Horaires : au moins deux arrêts horodatés, ou route.depart avec route.duration_min ou route.speed_kmh. Un trajet peut durer jusqu'à 72 h.
| Body field | Description |
|---|---|
route.stops | 2-200 arrêts dans l'ordre : {lat, lon, name?, arr?, dep?, day?}. arr / dep sont en heure locale HH:MM ; day = jours après route.date (les heures qui passent minuit sont reportées automatiquement). |
route.geometry | Votre tracé : un GeoJSON LineString, MultiLineString, Feature ou FeatureCollection (ordre [lon, lat]), ou une chaîne polyline encodée. Jusqu'à 5000 points. Avec stops, les arrêts donnent les horaires et la géométrie donne le tracé. |
route.polyline_precision | 5 (par défaut) ou 6, pour une polyline encodée. |
route.date | YYYY-MM-DD de l'heure du premier arrêt (par défaut aujourd'hui). |
route.depart | Départ YYYY-MM-DDTHH:MM, lorsque les arrêts n'ont pas d'horaires ou que vous n'envoyez qu'une géométrie. |
route.duration_min | Durée du trajet en minutes, avec depart (sinon l'heure est déduite de speed_kmh). |
route.speed_kmh | Vitesse moyenne avec depart, 65 par défaut. |
route.timezone | Fuseau horaire IANA des heures envoyées (par défaut : le fuseau du pays du premier point). |
bus | Le bus : bus_model du catalogue et/ou seats, rows, layout, door_side, windshield, rear_window, window_height, deck, mid_door — les mêmes champs que les paramètres GET. Par défaut standard_coach. |
images | Les images à produire : n'importe lesquelles parmi seat_map, route_map, timeline (par défaut les trois) ; [] = aucune. |
format | png (par défaut), webp ou jpg : le type de fichier de chaque URL d'image. svg : fichiers PNG, et le plan des sièges est aussi renvoyé en SVG inline (seat_map.svg). |
theme | light (default) or dark. |
lang | Langue des libellés des images et des textes, 25 langues (par défaut en). |
width | Largeur de l'image en px, 240-1600 (par défaut : taille naturelle). |
embed_html | true (par défaut) = renvoyer aussi embed_html ; false = null. |
timeline / track | false = omettre cette liste de la réponse. |
weather | true (par défaut) ou false : utiliser la prévision météo le long du trajet (3 prochains jours) ; false = ciel dégagé uniquement. 1 et 0 sont aussi acceptés. |
Un champ erroné ou manquant renvoie HTTP 400 avec error.field égal à son chemin, par exemple route.stops[2].lat ou 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
Chaque image a sa propre URL avec un nom de fichier aléatoire (.png, .webp ou .jpg). Les URL ne nécessitent pas de clé et restent valides 12 heures (expires_at) ; copiez les fichiers si vous en avez besoin plus longtemps. embed_html est un figure autonome avec le plan des sièges en SVG inline et une ligne de crédit nakordoni.eu ; conservez le crédit lorsque vous l'affichez.
Ci-dessous : les images pour l'exemple de corps ci-dessus (minibus, Poznań à Varsovie, 21 juin).



Bus catalogue
bus_model accepte l'une de ces classes de véhicules génériques (pas de marques précises). Tout champ de bus envoyé remplace le modèle ; seats est converti en rows selon le layout. La même liste est disponible en JSON via bus-sun-catalog.
| 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
Avec weather=1 (par défaut ; dans un corps POST "weather": true), la réponse utilise une prévision météo horaire le long du trajet pour les 3 prochains jours (72 h) ; les parties ultérieures du trajet utilisent un ciel dégagé. summary.sun_*_min sont alors pondérés par la prévision, chaque ligne de timeline reçoit wx {code, f, temp, precip}, et weather {used, window_h, covered_pct, sunny_min, cloudy_min, rain_min, max_temp, note_key} indique quelle part du trajet la prévision a couverte. recommend_clear est la réponse par ciel dégagé ; weather_changes_answer vaut true lorsque la prévision change le côté ombragé. Lorsque la prévision est surtout nuageuse ou pluvieuse, recommend.reason_key vaut mostly_cloudy et shade_side vaut any. recommend.tip_key hot_sun_side signifie que le côté ensoleillé est prévu à 28 °C ou plus.
Quota and accuracy
GET, ainsi que POST avec "images": [], comptent pour 1 unité de la classe lourde ; un POST qui produit des images compte pour 2. bus-sun-catalog est un appel peu coûteux. Le même corps POST renvoie la réponse enregistrée pendant 6 heures au maximum (1 heure si une prévision météo a été utilisée).
Le résultat est une estimation à partir de la géométrie du trajet et de la position du soleil. Les rideaux, les vitres teintées, les bâtiments, les arbres, le relief et un trajet modifié nous sont inconnus. Les nuages et la pluie proviennent d'une prévision météo uniquement pour les trajets des 3 prochains jours ; les trajets ultérieurs supposent un ciel dégagé. confidence est plus faible lorsque le soleil est bas, que le trajet est court, que l'itinéraire tourne souvent ou que la prévision est surtout nuageuse.
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"
Mis à jour