ממשק ה-API של Bus Sun Side Online
איזה צד של האוטובוס מקבל שמש או צל בנסיעה, ואילו מושבים הם הטובים ביותר לצל או לנוף. הנסיעה נסרקת בצעדים של 5 דקות: מיקום וכיוון מהמסלול, מיקום השמש במקום ובשעה האלה, ואז הערכה לכל מושב לפי סידור האוטובוס שנבחר. השתמשו במסלול ממרשם הקווים המורשים שלנו (route_id), בשתי נקודות (from/to), או שלחו ב-POST מסלול משלכם (תחנות או polyline) כדי לקבל גם מפת מושבים, מפת מסלול וציר זמן כתמונות. התוצאות הן הערכה על סמך גאומטריה ומיקום השמש; הצל בפועל תלוי גם בווילונות, בבניינים, בפני השטח ובמזג האוויר.
GET https://nakordoni.eu/api/v2/data/bus-sun-side
— מחלקת מכסה: heavy
| פרמטר | תיאור |
|---|---|
route_id | id של מסלול ממרשם קווי האוטובוס שלנו (אותם id כמו בדפי האוטובוס ב-nakordoni.eu). השתמשו ב-route_id או ב-from+to. |
dir | direct (ברירת מחדל) או return. |
date | תאריך הנסיעה YYYY-MM-DD (ברירת מחדל היום). מיקום השמש תלוי בתאריך. |
dep | שעת יציאה HH:MM בשעון המקומי של המסלול (ברירת מחדל: לוח הזמנים מהמרשם). |
from | מסלול חופשי: נקודת התחלה lat,lon (יחד עם to). |
to | מסלול חופשי: נקודת סיום lat,lon (יחד עם from). |
depart | מסלול חופשי: יציאה YYYY-MM-DDTHH:MM, שעה מקומית של נקודת ההתחלה. |
lang | שפת שמות המקומות והטקסטים, 25 שפות (en, uk, pl, de, …). ברירת מחדל en. |
bus_model | id של דגם אוטובוס מ-bus-sun-catalog (ברירת מחדל standard_coach). כל שדה למטה דורס את הדגם. |
rows | Seat rows, 8-20. |
layout | סידור מושבים: 2+2, 2+1 או 1+2 (שמאל+ימין למעבר). |
door_side | right (אירופה היבשתית) או left. |
windshield | large או normal — כמה שמש מקבלות השורות הראשונות דרך השמשה הקדמית. |
rear_window | none, small או large — שמש בשורות האחרונות. |
window_height | standard או panoramic (חלונות צד גבוהים). |
deck | single, upper או lower (אוטובוסים דו-קומתיים). |
mid_door | 1 או 0 — יש דלת אמצעית (מסיר את המושבים שם). |
timeline | 0 = להשמיט את ציר הזמן (שורות של 15 דקות). |
track | 0 = להשמיט את נקודות המסלול עם חותמת זמן. |
weather | 1 (ברירת מחדל) או 0. עם 1 נעשה שימוש בתחזית מזג אוויר לאורך הנסיעה כשהנסיעה בתוך 3 הימים הקרובים (72 h); נסיעות מאוחרות יותר ו-weather=0 משתמשים בשמיים בהירים. |
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. |
שדות התשובה — בתוך אובייקט data שבמעטפת התשובה. [] מסמן רשימה, ולכן data.items[].name הוא שדה name של כל פריט. שדה יהיה null, ייעדר או יחזור כרשימה ריקה כשאין לנו ערך עבורו — לעולם לא ערך ממלא מקום.
| שדה | תיאור |
|---|---|
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. |
נסו בלי קוד: מתכנן הצד המואר מריץ את ה-API הזה על כל קו או על הנסיעה שלכם ומציג מפת מושבים, מפה, ציר זמן, תמונות ואת הקוד של הקריאה. פתיחת המתכנן →
Your route (POST)
שלחו מסלול משלכם כגוף JSON ב-POST לאותו URL. בתשובה אותם שדות כמו ב-GET ובנוסף input (איך המסלול נקרא), images (מפת מושבים, מפת מסלול וציר זמן) ו-embed_html.
תחנות ללא גאומטריה מחוברות בנתב הכבישים שלנו; קטע שלא ניתן לנתב מצויר כקו ישר ונספר ב-input.legs_straight. שעות: לפחות שתי תחנות עם שעה, או route.depart עם route.duration_min או route.speed_kmh. נסיעה יכולה להימשך עד 72 h.
| Body field | תיאור |
|---|---|
route.stops | 2-200 תחנות לפי הסדר: {lat, lon, name?, arr?, dep?, day?}. arr / dep הם שעה מקומית HH:MM; day = ימים אחרי route.date (שעות שעוברות את חצות מתגלגלות אוטומטית). |
route.geometry | המסלול שלכם: GeoJSON LineString, MultiLineString, Feature או FeatureCollection (סדר [lon, lat]), או מחרוזת polyline מקודדת. עד 5000 נקודות. יחד עם stops, התחנות נותנות את השעות והגאומטריה נותנת את המסלול. |
route.polyline_precision | 5 (ברירת מחדל) או 6, עבור polyline מקודד. |
route.date | YYYY-MM-DD של שעת התחנה הראשונה (ברירת מחדל היום). |
route.depart | יציאה YYYY-MM-DDTHH:MM, כשלתחנות אין שעות או כששולחים גאומטריה בלבד. |
route.duration_min | משך הנסיעה בדקות, יחד עם depart (אחרת הזמן מחושב מ-speed_kmh). |
route.speed_kmh | מהירות ממוצעת יחד עם depart, ברירת מחדל 65. |
route.timezone | אזור זמן IANA של השעות שאתם שולחים (ברירת מחדל: האזור של המדינה של הנקודה הראשונה). |
bus | האוטובוס: bus_model מהקטלוג ו/או seats, rows, layout, door_side, windshield, rear_window, window_height, deck, mid_door — אותם שדות כמו פרמטרי GET. ברירת מחדל standard_coach. |
images | אילו תמונות ליצור: כל אחת מ-seat_map, route_map, timeline (ברירת מחדל שלושתן); [] = אף אחת. |
format | png (ברירת מחדל), webp או jpg: סוג הקובץ של כל URL של תמונה. svg: קובצי PNG, ומפת המושבים מוחזרת גם כ-SVG מוטמע (seat_map.svg). |
theme | light (default) or dark. |
lang | שפת התוויות בתמונות והטקסטים, 25 שפות (ברירת מחדל en). |
width | רוחב התמונה ב-px, 240-1600 (ברירת מחדל: גודל טבעי). |
embed_html | true (ברירת מחדל) = להחזיר גם embed_html; false = null. |
timeline / track | false = להשמיט את הרשימה הזו מהתשובה. |
weather | true (ברירת מחדל) או false: שימוש בתחזית מזג האוויר לאורך הנסיעה (3 הימים הקרובים); false = שמיים בהירים בלבד. מתקבלים גם 1 ו-0. |
שדה שגוי או חסר מחזיר HTTP 400 כש-error.field מכיל את הנתיב שלו, לדוגמה route.stops[2].lat או 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
לכל תמונה יש URL משלה עם שם קובץ אקראי (.png, .webp או .jpg). ה-URL אינם דורשים מפתח ותקפים 12 שעות (expires_at); העתיקו את הקבצים אם הם נחוצים לכם זמן רב יותר. embed_html הוא figure עצמאי עם מפת המושבים כ-SVG מוטמע ושורת קרדיט של nakordoni.eu; שמרו על הקרדיט כשאתם מציגים אותו.
למטה: התמונות עבור גוף הדוגמה שלמעלה (מיניבוס, פוזנן לוורשה, 21 ביוני).



Bus catalogue
bus_model מקבל אחת ממחלקות הרכב הכלליות האלה (לא יצרנים ספציפיים). כל שדה אוטובוס שנשלח דורס את הדגם; seats מומר ל-rows לפי ה-layout. אותה רשימה זמינה כ-JSON מ-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
עם weather=1 (ברירת מחדל; בגוף POST "weather": true) התשובה משתמשת בתחזית מזג אוויר שעתית לאורך הנסיעה ל-3 הימים הקרובים (72 h); בחלקים מאוחרים יותר של הנסיעה מניחים שמיים בהירים. אז summary.sun_*_min משוקללים לפי התחזית, כל שורה ב-timeline מקבלת wx {code, f, temp, precip}, ו-weather {used, window_h, covered_pct, sunny_min, cloudy_min, rain_min, max_temp, note_key} מראה איזה חלק מהנסיעה כוסה בתחזית. recommend_clear היא התשובה לשמיים בהירים; weather_changes_answer הוא true כשהתחזית משנה את צד הצל. כשהתחזית בעיקר מעוננת או גשומה, recommend.reason_key הוא mostly_cloudy ו-shade_side הוא any. recommend.tip_key hot_sun_side פירושו שבצד השמשי צפויים 28 °C או יותר.
Quota and accuracy
GET, וגם POST עם "images": [], נספרים כיחידה 1 של המחלקה הכבדה; POST שיוצר תמונות נספר כ-2. bus-sun-catalog היא קריאה זולה. אותו גוף POST מחזיר את התשובה השמורה עד 6 שעות (שעה 1 כשנעשה שימוש בתחזית מזג אוויר).
התוצאה היא הערכה על סמך גאומטריית המסלול ומיקום השמש. וילונות, זכוכית כהה, בניינים, עצים, פני השטח ומסלול ששונה אינם ידועים לנו. עננים וגשם מגיעים מתחזית מזג אוויר רק לנסיעות ב-3 הימים הקרובים; לנסיעות מאוחרות יותר מניחים שמיים בהירים. confidence נמוך יותר כשהשמש נמוכה, הנסיעה קצרה, המסלול פונה לעיתים קרובות או שהתחזית בעיקר מעוננת.
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"
עודכן