Documentación de la API

Guía de integración de la API vitaRoute

Inicio rápido

La API vitaRoute está basada en REST y trabaja con JSON. Todas las solicitudes deben enviarse a través de HTTPS.

Base URL: https://api.vitaroute.ai
  1. Cree una cuenta gratuita
  2. Genere una clave API desde el Panel
  3. Envíe su primera solicitud de optimización

Autenticación

Todas las solicitudes de API requieren autenticación mediante el encabezado X-Api-Key.

X-Api-Key: vtr_live_xxxxxxxxxxxxxxxxxxxx

⚠️ Nota de seguridad

No incluya sus claves API en el código fuente. Use variables de entorno.

Endpoints

POST/api/optimization/optimize

Optimización avanzada de rutas. Las rutas más eficientes se calculan evaluando 20+ parámetros con el algoritmo propietario RL de vitaRoute.

POST/api/route/calculate

Cálculo básico de rutas. Plan de ruta simple basado en clústeres.

POST/api/route/cluster-stops

Agrupa las paradas existentes según la capacidad del vehículo.

Esquema de solicitud

CampoTipoDescripción
facilityLatfloatCoordenada de latitud de la instalación/depósito
facilityLngfloatCoordenada de longitud de la instalación/depósito
totalCapacityintCapacidad máxima por vehículo (predeterminado: 14)
vehicleCountintSiempre 0 — el número de vehículos se determina automáticamente
maxWalkingint?Distancia máxima a pie (metros, predeterminado: 500)
maxDurationint?Duración máxima de la ruta (minutos, predeterminado: 90)
maxClusterDiameterKmfloatDiámetro geográfico máximo de las paradas en el mismo clúster (km, predeterminado: 25)
minSavingsKmfloatAhorro mínimo de distancia requerido para fusionar una parada (km, predeterminado: 0,3)
maxDetourFactorfloatRatio máximo de desvío al agregar una parada a una ruta existente (predeterminado: 0,6)
minDistrictPassengersintMínimo de pasajeros requeridos para crear una ruta específica de distrito (predeterminado: 8)
tripDirectionstringDirección del viaje: 'to_facility' (hacia el depósito) o 'from_facility' (desde el depósito)
arrivalTimeAtDepotstring?Hora de llegada de los vehículos al depósito (ISO 8601 UTC). Si se proporciona, la velocidad se calcula según el perfil de tráfico; de lo contrario se usan 28 km/h fijos.
useDistanceMatrixbooleanUsar la API Distance Matrix de Google Maps para distancias de ruta precisas (predeterminado: false)
nodesNodeInput[]Lista de personal/ubicaciones a optimizar

NodeInput

CampoTipoDescripción
idstringIdentificador único de personal/ubicación
namestringNombre del personal
latitudefloatCoordenada de latitud
longitudefloatCoordenada de longitud
districtstring?Nombre del distrito (opcional, para reglas de distrito)

Esquema de respuesta

{
  "routes": [
    {
      "routeId": "uuid",
      "routeName": "GEBZE 1",
      "totalDuration": 45,
      "totalDistance": 28500,
      "nodeCount": 14,
      "totalLoad": 14,
      "stops": [
        {
          "stopIndex": 0,
          "latitude": 40.8962,
          "longitude": 29.1882,
          "nodes": [
            { "id": "1", "name": "Ali Yilmaz" }
          ]
        }
      ],
      "routeCenter": {
        "latitude": 40.9,
        "longitude": 29.2
      }
    }
  ]
}

Límites de velocidad

PlanSol./mesNodos máx.Simultáneo
Free5011
Starter1,0001005
Growth5,00050020
EnterpriseIlimitadoIlimitadoPersonalizado

Cuando se supera el límite de velocidad, se devuelve una respuesta 429 Too Many Requests. El encabezado Retry-After especifica el tiempo de espera.

Códigos de error

400

Bad Request

JSON inválido o campo obligatorio faltante

401

Unauthorized

Clave API faltante o inválida

403

Forbidden

Se ha superado el límite de su plan

429

Too Many Requests

Límite de velocidad superado

500

Internal Server Error

Error del servidor, contacte con el soporte

Ejemplos de código

curl

curl -X POST https://api.vitaroute.ai/api/optimization/optimize \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: vtr_live_your_key_here" \
  -d '{
    "facilityLat": 40.9139,
    "facilityLng": 29.1167,
    "totalCapacity": 16,
    "vehicleCount": 0,
    "maxWalking": 500,
    "maxDuration": 90,
    "maxClusterDiameterKm": 25,
    "minSavingsKm": 0.3,
    "maxDetourFactor": 0.6,
    "minDistrictPassengers": 8,
    "tripDirection": "to_facility",
    "arrivalTimeAtDepot": "2025-01-15T05:00:00Z",
    "useDistanceMatrix": false,
    "nodes": [
      { "id": "1", "name": "Ali Yilmaz", "latitude": 40.8962, "longitude": 29.1882, "district": "Kadikoy" },
      { "id": "2", "name": "Ayse Demir", "latitude": 40.9278, "longitude": 29.3125, "district": "Gebze" }
    ]
  }'

python

import requests

response = requests.post(
    "https://api.vitaroute.ai/api/optimization/optimize",
    headers={
        "Content-Type": "application/json",
        "X-Api-Key": "vtr_live_your_key_here"
    },
    json={
        "facilityLat": 40.9139,
        "facilityLng": 29.1167,
        "totalCapacity": 16,
        "vehicleCount": 0,
        "maxWalking": 500,
        "maxDuration": 90,
        "maxClusterDiameterKm": 25,
        "minSavingsKm": 0.3,
        "maxDetourFactor": 0.6,
        "minDistrictPassengers": 8,
        "tripDirection": "to_facility",
        "arrivalTimeAtDepot": "2025-01-15T05:00:00Z",
        "useDistanceMatrix": False,
        "nodes": [
            {"id": "1", "name": "Ali Yilmaz", "latitude": 40.8962, "longitude": 29.1882}
        ]
    }
)

data = response.json()
for route in data["routes"]:
    print(f"{route['routeName']}: {route['nodeCount']} stops, {route['totalDuration']} min")

javascript

const response = await fetch(
  "https://api.vitaroute.ai/api/optimization/optimize",
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-Api-Key": "vtr_live_your_key_here",
    },
    body: JSON.stringify({
      facilityLat: 40.9139,
      facilityLng: 29.1167,
      totalCapacity: 16,
      vehicleCount: 0,
      maxWalking: 500,
      maxDuration: 90,
      maxClusterDiameterKm: 25,
      minSavingsKm: 0.3,
      maxDetourFactor: 0.6,
      minDistrictPassengers: 8,
      tripDirection: "to_facility",
      arrivalTimeAtDepot: "2025-01-15T05:00:00Z",
      useDistanceMatrix: false,
      nodes: [
        { id: "1", name: "Ali Yilmaz", latitude: 40.8962, longitude: 29.1882 },
      ],
    }),
  }
);

const { routes } = await response.json();
routes.forEach(route => {
  console.log(`${route.routeName}: ${route.nodeCount} stops`);
});

C#

using System.Net.Http.Json;

var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-Api-Key", "vtr_live_your_key_here");

var payload = new {
    facilityLat = 40.9139,
    facilityLng = 29.1167,
    totalCapacity = 16,
    vehicleCount = 0,
    maxWalking = 500,
    maxDuration = 90,
    maxClusterDiameterKm = 25,
    minSavingsKm = 0.3,
    maxDetourFactor = 0.6,
    minDistrictPassengers = 8,
    tripDirection = "to_facility",
    arrivalTimeAtDepot = "2025-01-15T05:00:00Z",
    useDistanceMatrix = false,
    nodes = new[] {
        new { id = "1", name = "Ali Yilmaz", latitude = 40.8962, longitude = 29.1882 }
    }
};

var response = await client.PostAsJsonAsync(
    "https://api.vitaroute.ai/api/optimization/optimize",
    payload
);

var result = await response.Content.ReadFromJsonAsync<RouteResponse>();

API de integración (integración ERP)

Una API diseñada para gestionar vitaRoute de extremo a extremo desde su propia interfaz (por ejemplo, un sistema ERP). Cree y actualice registros de proyectos, turnos y pasajeros, lea planes de ruta finalizados y escriba de vuelta sus ediciones, todo sin usar la interfaz de extranet.

Base URL: https://api.vitaroute.ai/api/integration

Usa la misma autenticación (X-Api-Key); todos los endpoints están bajo https://api.vitaroute.ai/api/integration.

Todas las solicitudes PUT (actualización) son PARCIALES — solo cambian los campos enviados en el cuerpo; los omitidos conservan su valor actual.

Al actualizar un plan, NO envíe la geometría de la ruta (savedPolyline) ni la distancia/duración (savedStats) — vitaRoute las calcula por sí mismo a partir del orden de paradas mediante Google Directions, de modo que el mapa siempre muestre una ruta real y válida.

Proyectos

Cree, liste, actualice y elimine proyectos. Un ERP debe guardar aquí el id del proyecto vitaRoute correspondiente a su propio registro de cliente.

GET/api/integration/projects

Lista todos los proyectos de la clave API.

POST/api/integration/projects

Crea un nuevo proyecto (ubicación, modelo de optimización, información de viajes).

PUT/api/integration/projects/{projectId}

Actualiza parcialmente un proyecto — solo cambian los campos proporcionados.

DELETE/api/integration/projects/{projectId}

Elimina permanentemente un proyecto y todos sus datos (pasajeros, turnos, ejecuciones, planes). Irreversible.

CampoTipoDescripción
namestringNombre del proyecto
facilityLatfloatLatitud de la instalación
facilityLngfloatLongitud de la instalación
descriptionstring?Descripción (opcional)
countryCodestring?Código de país, p. ej. "TR" (opcional)
iconstring?Clave del icono de instalación (opcional)
optimizationModelstring"personnel" (transporte de personal) | "school" (transporte escolar)
passengerModestring"fixed" (viajes fijos) | "shift" (por turnos) — solo relevante en modelo personnel
tripsTrip[]Lista de viajes (hora+dirección). Se requiere al menos uno en modo fixed; se ignora en modo shift.

Turnos

CRUD completo para los registros de turno que definen las horas de entrada/salida en proyectos basados en turnos.

GET/api/integration/shifts?projectId=

Lista todos los turnos de un proyecto.

POST/api/integration/shifts

Añade un nuevo turno (se requiere al menos hora de entrada o salida).

PUT/api/integration/shifts/{shiftId}

Actualiza parcialmente un turno.

DELETE/api/integration/shifts/{shiftId}

Elimina un turno.

CampoTipoDescripción
projectIdstringId del proyecto al que se añade el turno
namestringNombre del turno, p. ej. "Mañana"
entryTimestring?Hora de entrada, "HH:mm" (opcional)
exitTimestring?Hora de salida, "HH:mm" (opcional)
nextDayExitbooleantrue = la salida es al día siguiente (solo relevante si se indica exitTime)

Pasajeros

CRUD completo para registros de pasajeros/estudiantes/empleados. El campo employee_no es una clave natural opcional para que su ERP pueda emparejar registros por su propio número de registro/estudiante.

GET/api/integration/passengers?projectId=

Lista todos los pasajeros de un proyecto.

POST/api/integration/passengers

Añade un nuevo pasajero (se requieren nombre y ubicación).

PUT/api/integration/passengers/{nodeId}

Actualiza parcialmente un pasajero.

DELETE/api/integration/passengers/{nodeId}

Elimina un pasajero.

CampoTipoDescripción
projectIdstringId del proyecto al que se añade el pasajero
namestringNombre del pasajero
latitudefloatLatitud
longitudefloatLongitud
employeeNostring?Número de registro/estudiante — clave natural para emparejar sus propios registros (opcional)
departmentstring?Departamento (opcional)
genderstring?"male" | "female" (opcional)
specialNeedsbooleanNecesidades especiales (por defecto: false)
addressstring?Texto de dirección (opcional)
citystring?Ciudad (opcional)
districtstring?Distrito (opcional)

Transferencia de plan

Lea planes de ruta finalizados filtrados por proyecto/fecha/turno/dirección; escriba de vuelta el orden de paradas y la asignación de pasajeros que editó.

GET/api/integration/plan?projectId=&dateFrom=&dateTo=&shiftName=&direction=

Devuelve el/los plan(es) de ruta finalizados que coinciden con los filtros de proyecto/rango de fechas/turno/dirección — incluyendo rutas, paradas, pasajeros, distancia y duración — completos.

PUT/api/integration/plan/{runId}

Sobrescribe los datos de ruta/parada/pasajero de una ejecución con las ediciones hechas en el ERP. La geometría de la ruta es recalculada por vitaRoute.

result[] — Route

CampoTipoDescripción
routeNamestring?Nombre de la ruta, p. ej. "Ruta 1"
colorstring?Color de visualización en el mapa, hex (opcional)
stopsStop[]Paradas, EN ORDEN DE RUTA

stops[] — Stop

CampoTipoDescripción
latfloatLatitud de la parada
lngfloatLongitud de la parada
stopNamestring?Nombre de la parada (opcional)
passengersPassenger[]Pasajeros asignados a esta parada

passengers[] — Passenger

CampoTipoDescripción
idstringId de pasajero existente (debe coincidir exactamente con el de la respuesta GET) — OBLIGATORIO
namestring?Nombre del pasajero (solo visualización)

Ejemplos de la API de integración

GET /projects

curl https://api.vitaroute.ai/api/integration/projects \
  -H "X-Api-Key: vtr_live_your_key_here"

POST /passengers

curl -X POST https://api.vitaroute.ai/api/integration/passengers \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: vtr_live_your_key_here" \
  -d '{
    "projectId": "b3f1c2a4-...",
    "name": "Ali Yilmaz",
    "latitude": 40.8962,
    "longitude": 29.1882,
    "employeeNo": "EMP-00123"
  }'

GET /plan

curl "https://api.vitaroute.ai/api/integration/plan?projectId=b3f1c2a4-...&shiftName=Sabah&direction=to_facility" \
  -H "X-Api-Key: vtr_live_your_key_here"

PUT /plan/{runId}

curl -X PUT https://api.vitaroute.ai/api/integration/plan/9e7d0f21-... \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: vtr_live_your_key_here" \
  -d '{
    "result": [
      {
        "routeName": "Hat 1",
        "color": "#1E40AF",
        "stops": [
          {
            "lat": 40.8962, "lng": 29.1882, "stopName": "Kadikoy Iskele",
            "passengers": [{ "id": "3f9a...", "name": "Ali Yilmaz" }]
          }
        ]
      }
    ]
  }'
# Not: savedPolyline / savedStats göndermezsiniz — vitaRoute rota
# geometrisini durak sırasından kendisi hesaplar.