El envío de noticias y la flota NakBus ahora están en el panel de socio
Utilice el mismo inicio de sesión (correo electrónico y contraseña) que su cuenta de desarrollador para acceder al panel de Nakordoni Partners y gestionar allí las noticias y su flota de autobuses (NakDriver / NakManager) con roles de equipo. Sus claves de API, endpoints y aplicaciones no cambian, y las páginas de aquí siguen funcionando. Abrir Nakordoni Partners

← Todos los endpoints

API de Bus Sun Side Online

Qué lado de un autocar recibe sol o sombra en un viaje, y qué asientos son mejores para la sombra o para las vistas. El viaje se recorre en pasos de 5 minutos: posición y rumbo según la ruta, posición del sol en ese lugar y a esa hora, y luego una estimación por asiento para la distribución de autobús elegida. Use una ruta de nuestro registro de líneas autorizadas (route_id), dos puntos (from/to) o envíe con POST su propia ruta (paradas o una polyline) para obtener también un mapa de asientos, un mapa de la ruta y una cronología como imágenes. Los resultados son una estimación a partir de la geometría y la posición del sol; la sombra real también depende de cortinas, edificios, relieve y meteorología.

GET https://nakordoni.eu/api/v2/data/bus-sun-side — clase de cuota: heavy

ParámetroDescripción
route_idId de ruta de nuestro registro de rutas de autobús (los mismos id que en las páginas de autobús de nakordoni.eu). Use route_id o from+to.
dirdirect (predeterminado) o return.
dateFecha del viaje YYYY-MM-DD (predeterminado hoy). La posición del sol depende de la fecha.
depHora de salida HH:MM en hora local de la ruta (predeterminado: el horario del registro).
fromRuta libre: punto de inicio lat,lon (con to).
toRuta libre: punto final lat,lon (con from).
departRuta libre: salida YYYY-MM-DDTHH:MM, hora local del punto de inicio.
langIdioma de los nombres de lugares y los textos, 25 idiomas (en, uk, pl, de, …). Predeterminado en.
bus_modelId del modelo de autobús de bus-sun-catalog (predeterminado standard_coach). Cualquier campo de abajo sustituye al modelo.
rowsSeat rows, 8-20.
layoutDistribución de asientos: 2+2, 2+1 o 1+2 (izquierda+derecha del pasillo).
door_sideright (Europa continental) o left.
windshieldlarge o normal — cuánto sol reciben las primeras filas a través del parabrisas.
rear_windownone, small o large — sol en las últimas filas.
window_heightstandard o panoramic (ventanas laterales altas).
decksingle, upper o lower (autocares de dos pisos).
mid_door1 o 0 — hay puerta central (elimina los asientos en ese punto).
timeline0 = omitir la cronología (filas de 15 minutos).
track0 = omitir los puntos de recorrido con hora.
weather1 (predeterminado) o 0. Con 1 se usa un pronóstico meteorológico a lo largo del viaje cuando el viaje es dentro de los próximos 3 días (72 h); los viajes posteriores y weather=0 usan cielo despejado.
animation1 (default) or 0. With 0, the animation block (sun and coach position every 5 minutes) is left out. POST body: animation true|false.

Campos de la respuesta — dentro del objeto data del sobre de respuesta. [] indica una lista, así que data.items[].name es el campo name de cada elemento. Un campo es null, no aparece o es una lista vacía cuando no tenemos valor: nunca un marcador de posición.

CampoDescripción
data.date / data.tzTravel date and the time zone of the times in the answer.
data.routeid, num, from, to, dir, dep, arr, km (registry route) — or the stops you sent (POST).
data.basisHow the timed path was built: timetable (registry or your stop times), router (our road route between points) or geometry (your polyline).
data.busThe bus profile used: model, layout, rows, door_side, windshield, rear_window, window_height, deck, mid_door.
data.summarytrip_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.recommendshade_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_clearThe same recommendation for a clear sky (no weather).
data.weather_changes_answertrue when the forecast changes the shade side compared with recommend_clear.
data.weatherused, 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.zonesfront / middle / back: left and right sun exposure 0-100 and rows [first, last] of that part.
data.seatslayout, 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.inputPOST only: how your route was read — source, timed_by, stops, points, legs_routed, legs_straight, timezone.
data.imagesPOST 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_htmlPOST only: a self-contained HTML figure with the seat map (inline SVG) to paste into a page; null with embed_html=false.

Pruébelo sin código: el planificador del lado del sol ejecuta esta API en cualquier ruta o en su propio viaje y muestra el plano de asientos, el mapa, la cronología, las imágenes y el código de la llamada. Abrir el planificador →

Your route (POST)

Envíe su propia ruta como cuerpo JSON con POST a la misma URL. La respuesta tiene los mismos campos que GET más input (cómo se leyó su ruta), images (mapa de asientos, mapa de la ruta y cronología) y embed_html.

Las paradas sin geometría se unen con nuestro enrutador de carreteras; un tramo que no se puede calcular se dibuja como línea recta y se cuenta en input.legs_straight. Horas: al menos dos paradas con hora, o route.depart con route.duration_min o route.speed_kmh. Un viaje puede durar hasta 72 h.

Body fieldDescripción
route.stops2-200 paradas en orden: {lat, lon, name?, arr?, dep?, day?}. arr / dep son hora local HH:MM; day = días después de route.date (las horas que pasan de medianoche se ajustan automáticamente).
route.geometrySu trazado: un GeoJSON LineString, MultiLineString, Feature o FeatureCollection (orden [lon, lat]), o una cadena polyline codificada. Hasta 5000 puntos. Con stops, las paradas dan las horas y la geometría da el trazado.
route.polyline_precision5 (predeterminado) o 6, para una polyline codificada.
route.dateYYYY-MM-DD de la hora de la primera parada (predeterminado hoy).
route.departSalida YYYY-MM-DDTHH:MM, cuando las paradas no tienen horas o solo envía geometría.
route.duration_minDuración del viaje en minutos, junto con depart (si no, la hora se obtiene de speed_kmh).
route.speed_kmhVelocidad media junto con depart, predeterminada 65.
route.timezoneZona horaria IANA de las horas que envía (predeterminado: la zona del país del primer punto).
busEl autobús: bus_model del catálogo y/o seats, rows, layout, door_side, windshield, rear_window, window_height, deck, mid_door — los mismos campos que los parámetros GET. Predeterminado standard_coach.
imagesQué imágenes generar: cualquiera de seat_map, route_map, timeline (predeterminado las tres); [] = ninguna.
formatpng (predeterminado), webp o jpg: el tipo de archivo de cada URL de imagen. svg: archivos PNG, y el mapa de asientos también se devuelve inline como SVG (seat_map.svg).
themelight (default) or dark.
langIdioma de las etiquetas de las imágenes y los textos, 25 idiomas (predeterminado en).
widthAncho de la imagen en px, 240-1600 (predeterminado: tamaño natural).
embed_htmltrue (predeterminado) = devolver también embed_html; false = null.
timeline / trackfalse = omitir esa lista de la respuesta.
weathertrue (predeterminado) o false: usar el pronóstico meteorológico a lo largo del viaje (próximos 3 días); false = solo cielo despejado. También se aceptan 1 y 0.

Un campo erróneo o ausente devuelve HTTP 400 con error.field igual a su ruta, por ejemplo route.stops[2].lat o 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

Cada imagen tiene su propia URL con un nombre de archivo aleatorio (.png, .webp o .jpg). Las URL no necesitan clave y son válidas durante 12 horas (expires_at); copie los archivos si los necesita más tiempo. embed_html es un figure autónomo con el mapa de asientos como SVG inline y una línea de crédito de nakordoni.eu; conserve el crédito al mostrarlo.

Abajo: las imágenes del cuerpo de ejemplo anterior (minibús, de Poznań a Varsovia, 21 de junio).

Mapa de asientos: sombra y sol por asiento
seat_map
Mapa de la ruta coloreado según el lado del sol
route_map
Cronología: cuándo está el sol en cada lado
timeline

Bus catalogue

bus_model acepta una de estas clases genéricas de vehículo (no marcas concretas). Cualquier campo de autobús que envíe sustituye al modelo; seats se convierte en rows según el layout. La misma lista está disponible en JSON desde bus-sun-catalog.

bus_modellayoutrowsdoor_sidewindshieldrear_windowwindow_heightdeckmid_doortypical_seats
standard_coach
Standard touring coach (12-13 m, 2+2)
2+213rightlargesmallstandardsingletrue49-53
panoramic_coach
Coach with panoramic (tall) side windows, 2+2
2+213rightlargesmallpanoramicsingletrue49-53
midi_coach
Midi coach (9-10 m, 2+2)
2+29rightlargesmallstandardsinglefalse33-37
comfort_coach_2_1
Comfort coach with 2+1 seating
2+112rightlargesmallstandardsingletrue33-36
minibus
Minibus (7-8 m, 2+1)
2+16rightnormallargestandardsinglefalse16-20
double_deck_upper
Double-deck coach, upper deck
2+215rightlargesmallpanoramicupperfalse56-64 on the upper deck
double_deck_lower
Double-deck coach, lower deck
2+25rightnormalnonestandardlowertrue12-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

Con weather=1 (predeterminado; en un cuerpo POST "weather": true) la respuesta usa un pronóstico meteorológico por horas a lo largo del viaje para los próximos 3 días (72 h); las partes posteriores del viaje usan cielo despejado. summary.sun_*_min se ponderan entonces según el pronóstico, cada fila de timeline recibe wx {code, f, temp, precip} y weather {used, window_h, covered_pct, sunny_min, cloudy_min, rain_min, max_temp, note_key} indica qué parte del viaje cubrió el pronóstico. recommend_clear es la respuesta con cielo despejado; weather_changes_answer es true cuando el pronóstico cambia el lado de sombra. Cuando el pronóstico es sobre todo nuboso o lluvioso, recommend.reason_key es mostly_cloudy y shade_side es any. recommend.tip_key hot_sun_side significa que en el lado soleado se pronostican 28 °C o más.

Quota and accuracy

GET, y POST con "images": [], cuentan 1 unidad de la clase pesada; un POST que genera imágenes cuenta 2. bus-sun-catalog es una llamada barata. El mismo cuerpo POST devuelve la respuesta almacenada durante un máximo de 6 horas (1 hora si se usó un pronóstico meteorológico).

El resultado es una estimación a partir de la geometría de la ruta y la posición del sol. No conocemos cortinas, cristales tintados, edificios, árboles, relieve ni cambios de ruta. Las nubes y la lluvia proceden de un pronóstico meteorológico solo para viajes en los próximos 3 días; los viajes posteriores suponen cielo despejado. confidence es menor cuando el sol está bajo, el viaje es corto, la ruta gira a menudo o el pronóstico es sobre todo nuboso.

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"
🔑 Inicia sesión como desarrollador para probar este endpoint en vivo en el sandbox — 10 llamadas de prueba gratis por producto al día. Iniciar sesión

Actualizado