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.
- Cree una cuenta gratuita
- Genere una clave API desde el Panel
- Envíe su primera solicitud de optimización
Autenticación
Todas las solicitudes de API requieren autenticación mediante el encabezado X-Api-Key.
⚠️ Nota de seguridad
No incluya sus claves API en el código fuente. Use variables de entorno.
Endpoints
/api/optimization/optimizeOptimización avanzada de rutas. Las rutas más eficientes se calculan evaluando 20+ parámetros con el algoritmo propietario RL de vitaRoute.
/api/route/calculateCálculo básico de rutas. Plan de ruta simple basado en clústeres.
/api/route/cluster-stopsAgrupa las paradas existentes según la capacidad del vehículo.
Esquema de solicitud
| Campo | Tipo | Descripción |
|---|---|---|
facilityLat | float | Coordenada de latitud de la instalación/depósito |
facilityLng | float | Coordenada de longitud de la instalación/depósito |
totalCapacity | int | Capacidad máxima por vehículo (predeterminado: 14) |
vehicleCount | int | Siempre 0 — el número de vehículos se determina automáticamente |
maxWalking | int? | Distancia máxima a pie (metros, predeterminado: 500) |
maxDuration | int? | Duración máxima de la ruta (minutos, predeterminado: 90) |
maxClusterDiameterKm | float | Diámetro geográfico máximo de las paradas en el mismo clúster (km, predeterminado: 25) |
minSavingsKm | float | Ahorro mínimo de distancia requerido para fusionar una parada (km, predeterminado: 0,3) |
maxDetourFactor | float | Ratio máximo de desvío al agregar una parada a una ruta existente (predeterminado: 0,6) |
minDistrictPassengers | int | Mínimo de pasajeros requeridos para crear una ruta específica de distrito (predeterminado: 8) |
tripDirection | string | Dirección del viaje: 'to_facility' (hacia el depósito) o 'from_facility' (desde el depósito) |
arrivalTimeAtDepot | string? | 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. |
useDistanceMatrix | boolean | Usar la API Distance Matrix de Google Maps para distancias de ruta precisas (predeterminado: false) |
nodes | NodeInput[] | Lista de personal/ubicaciones a optimizar |
NodeInput
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Identificador único de personal/ubicación |
name | string | Nombre del personal |
latitude | float | Coordenada de latitud |
longitude | float | Coordenada de longitud |
district | string? | 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
| Plan | Sol./mes | Nodos máx. | Simultáneo |
|---|---|---|---|
| Free | 50 | 1 | 1 |
| Starter | 1,000 | 100 | 5 |
| Growth | 5,000 | 500 | 20 |
| Enterprise | Ilimitado | Ilimitado | Personalizado |
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
Bad Request
JSON inválido o campo obligatorio faltante
Unauthorized
Clave API faltante o inválida
Forbidden
Se ha superado el límite de su plan
Too Many Requests
Límite de velocidad superado
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.
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.
/api/integration/projectsLista todos los proyectos de la clave API.
/api/integration/projectsCrea un nuevo proyecto (ubicación, modelo de optimización, información de viajes).
/api/integration/projects/{projectId}Actualiza parcialmente un proyecto — solo cambian los campos proporcionados.
/api/integration/projects/{projectId}Elimina permanentemente un proyecto y todos sus datos (pasajeros, turnos, ejecuciones, planes). Irreversible.
| Campo | Tipo | Descripción |
|---|---|---|
name | string | Nombre del proyecto |
facilityLat | float | Latitud de la instalación |
facilityLng | float | Longitud de la instalación |
description | string? | Descripción (opcional) |
countryCode | string? | Código de país, p. ej. "TR" (opcional) |
icon | string? | Clave del icono de instalación (opcional) |
optimizationModel | string | "personnel" (transporte de personal) | "school" (transporte escolar) |
passengerMode | string | "fixed" (viajes fijos) | "shift" (por turnos) — solo relevante en modelo personnel |
trips | Trip[] | 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.
/api/integration/shifts?projectId=Lista todos los turnos de un proyecto.
/api/integration/shiftsAñade un nuevo turno (se requiere al menos hora de entrada o salida).
/api/integration/shifts/{shiftId}Actualiza parcialmente un turno.
/api/integration/shifts/{shiftId}Elimina un turno.
| Campo | Tipo | Descripción |
|---|---|---|
projectId | string | Id del proyecto al que se añade el turno |
name | string | Nombre del turno, p. ej. "Mañana" |
entryTime | string? | Hora de entrada, "HH:mm" (opcional) |
exitTime | string? | Hora de salida, "HH:mm" (opcional) |
nextDayExit | boolean | true = 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.
/api/integration/passengers?projectId=Lista todos los pasajeros de un proyecto.
/api/integration/passengersAñade un nuevo pasajero (se requieren nombre y ubicación).
/api/integration/passengers/{nodeId}Actualiza parcialmente un pasajero.
/api/integration/passengers/{nodeId}Elimina un pasajero.
| Campo | Tipo | Descripción |
|---|---|---|
projectId | string | Id del proyecto al que se añade el pasajero |
name | string | Nombre del pasajero |
latitude | float | Latitud |
longitude | float | Longitud |
employeeNo | string? | Número de registro/estudiante — clave natural para emparejar sus propios registros (opcional) |
department | string? | Departamento (opcional) |
gender | string? | "male" | "female" (opcional) |
specialNeeds | boolean | Necesidades especiales (por defecto: false) |
address | string? | Texto de dirección (opcional) |
city | string? | Ciudad (opcional) |
district | string? | 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ó.
/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.
/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
| Campo | Tipo | Descripción |
|---|---|---|
routeName | string? | Nombre de la ruta, p. ej. "Ruta 1" |
color | string? | Color de visualización en el mapa, hex (opcional) |
stops | Stop[] | Paradas, EN ORDEN DE RUTA |
stops[] — Stop
| Campo | Tipo | Descripción |
|---|---|---|
lat | float | Latitud de la parada |
lng | float | Longitud de la parada |
stopName | string? | Nombre de la parada (opcional) |
passengers | Passenger[] | Pasajeros asignados a esta parada |
passengers[] — Passenger
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Id de pasajero existente (debe coincidir exactamente con el de la respuesta GET) — OBLIGATORIO |
name | string? | 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.