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>();