Documentation API

Guide d'intégration de l'API vitaRoute

Démarrage rapide

L'API vitaRoute est basée sur REST et fonctionne avec JSON. Toutes les requêtes doivent être envoyées via HTTPS.

Base URL: https://api.vitaroute.ai
  1. Créer un compte gratuit
  2. Générer une clé API depuis le tableau de bord
  3. Envoyer votre première requête d'optimisation

Authentification

Toutes les requêtes API nécessitent une authentification via l'en-tête X-Api-Key.

X-Api-Key: vtr_live_xxxxxxxxxxxxxxxxxxxx

⚠️ Note de sécurité

N'incluez pas vos clés API dans le code source. Utilisez des variables d'environnement.

Points de terminaison

POST/api/optimization/optimize

Optimisation avancée des itinéraires. Les itinéraires les plus efficaces sont calculés en évaluant 20+ paramètres avec l'algorithme RL propriétaire vitaRoute.

POST/api/route/calculate

Calcul de route de base. Plan de route simple basé sur les clusters.

POST/api/route/cluster-stops

Regroupe les arrêts existants selon la capacité du véhicule.

Schéma de requête

ChampTypeDescription
facilityLatfloatCoordonnée de latitude de l'installation/dépôt
facilityLngfloatCoordonnée de longitude de l'installation/dépôt
totalCapacityintCapacité maximale par véhicule (défaut : 14)
vehicleCountintToujours 0 — le nombre de véhicules est déterminé automatiquement
maxWalkingint?Distance de marche maximale (mètres, défaut : 500)
maxDurationint?Durée maximale de l'itinéraire (minutes, défaut : 90)
maxClusterDiameterKmfloatDiamètre géographique maximal des arrêts dans le même cluster (km, défaut : 25)
minSavingsKmfloatÉconomie de distance minimale requise pour fusionner un arrêt (km, défaut : 0,3)
maxDetourFactorfloatRatio de détour maximal lors de l'ajout d'un arrêt à une route existante (défaut : 0,6)
minDistrictPassengersintNombre minimum de passagers pour créer une route spécifique à un district (défaut : 8)
tripDirectionstringDirection du trajet : 'to_facility' (vers le dépôt) ou 'from_facility' (depuis le dépôt)
arrivalTimeAtDepotstring?Heure d'arrivée des véhicules au dépôt (ISO 8601 UTC). Si fournie, la vitesse est calculée selon le profil de trafic ; sinon 28 km/h fixe est utilisé.
useDistanceMatrixbooleanUtiliser l'API Google Maps Distance Matrix pour des distances routières précises (défaut : false)
nodesNodeInput[]Liste du personnel/des emplacements à optimiser

NodeInput

ChampTypeDescription
idstringIdentifiant unique du personnel/emplacement
namestringNom du personnel
latitudefloatCoordonnée de latitude
longitudefloatCoordonnée de longitude
districtstring?Nom du district (optionnel, pour les règles de district)

Schéma de réponse

{
  "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
      }
    }
  ]
}

Limites de taux

PlanRequêtes/moisNœuds maxSimultané
Free5011
Starter1,0001005
Growth5,00050020
EnterpriseIllimitéIllimitéPersonnalisé

Lorsque la limite de taux est dépassée, une réponse 429 Too Many Requests est renvoyée. L'en-tête Retry-After spécifie le temps d'attente.

Codes d'erreur

400

Bad Request

JSON invalide ou champ obligatoire manquant

401

Unauthorized

Clé API manquante ou invalide

403

Forbidden

La limite de votre plan a été dépassée

429

Too Many Requests

Limite de taux dépassée

500

Internal Server Error

Erreur serveur, veuillez contacter le support

Exemples de code

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 d'intégration (intégration ERP)

Une API conçue pour gérer vitaRoute de bout en bout depuis votre propre interface (par exemple un système ERP). Créez et mettez à jour les enregistrements de projets, d'équipes et de passagers, lisez les plans d'itinéraire finalisés et réécrivez vos modifications, sans jamais passer par l'interface extranet.

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

Utilise la même authentification (X-Api-Key) ; tous les points de terminaison se trouvent sous https://api.vitaroute.ai/api/integration.

Toutes les requêtes PUT (mise à jour) sont PARTIELLES — seuls les champs envoyés dans le corps changent, les champs omis conservent leur valeur actuelle.

Lors de la mise à jour d’un plan, N’envoyez PAS la géométrie de l’itinéraire (savedPolyline) ni la distance/durée (savedStats) — vitaRoute les calcule elle-même à partir de l’ordre des arrêts via Google Directions, afin que la carte affiche toujours un trajet routier réel et valide.

Projets

Créez, listez, mettez à jour et supprimez des projets. Un ERP doit stocker ici l'id du projet vitaRoute correspondant à son propre enregistrement client.

GET/api/integration/projects

Liste tous les projets de la clé API.

POST/api/integration/projects

Crée un nouveau projet (emplacement, modèle d'optimisation, informations de trajet).

PUT/api/integration/projects/{projectId}

Met à jour partiellement un projet — seuls les champs fournis changent.

DELETE/api/integration/projects/{projectId}

Supprime définitivement un projet et toutes ses données (passagers, équipes, exécutions, plans). Irréversible.

ChampTypeDescription
namestringNom du projet
facilityLatfloatLatitude du site
facilityLngfloatLongitude du site
descriptionstring?Description (facultatif)
countryCodestring?Code pays, ex. "TR" (facultatif)
iconstring?Clé d'icône du site (facultatif)
optimizationModelstring"personnel" (transport du personnel) | "school" (transport scolaire)
passengerModestring"fixed" (trajets fixes) | "shift" (par équipes) — pertinent uniquement en modèle personnel
tripsTrip[]Liste des trajets (heure+direction). Au moins un requis en mode fixed ; ignoré en mode shift.

Équipes

CRUD complet pour les enregistrements d'équipe définissant les heures d'entrée/sortie dans les projets basés sur des équipes.

GET/api/integration/shifts?projectId=

Liste toutes les équipes d'un projet.

POST/api/integration/shifts

Ajoute une nouvelle équipe (au moins une heure d'entrée ou de sortie requise).

PUT/api/integration/shifts/{shiftId}

Met à jour partiellement une équipe.

DELETE/api/integration/shifts/{shiftId}

Supprime une équipe.

ChampTypeDescription
projectIdstringId du projet auquel ajouter l'équipe
namestringNom de l'équipe, ex. "Matin"
entryTimestring?Heure d'entrée, "HH:mm" (facultatif)
exitTimestring?Heure de sortie, "HH:mm" (facultatif)
nextDayExitbooleantrue = sortie le lendemain (pertinent uniquement si exitTime est fourni)

Passagers

CRUD complet pour les enregistrements de passagers/élèves/employés. Le champ employee_no est une clé naturelle optionnelle permettant à votre ERP de faire correspondre les enregistrements via son propre numéro de matricule/élève.

GET/api/integration/passengers?projectId=

Liste tous les passagers d'un projet.

POST/api/integration/passengers

Ajoute un nouveau passager (nom et emplacement requis).

PUT/api/integration/passengers/{nodeId}

Met à jour partiellement un passager.

DELETE/api/integration/passengers/{nodeId}

Supprime un passager.

ChampTypeDescription
projectIdstringId du projet auquel ajouter le passager
namestringNom du passager
latitudefloatLatitude
longitudefloatLongitude
employeeNostring?Matricule/numéro d'élève — clé naturelle pour faire correspondre vos propres enregistrements (facultatif)
departmentstring?Département (facultatif)
genderstring?"male" | "female" (facultatif)
specialNeedsbooleanBesoins particuliers (par défaut : false)
addressstring?Texte d'adresse (facultatif)
citystring?Ville (facultatif)
districtstring?Quartier (facultatif)

Transfert de plan

Lisez les plans d'itinéraire finalisés filtrés par projet/date/équipe/direction ; réécrivez l'ordre des arrêts et l'affectation des passagers que vous avez modifiés.

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

Renvoie le(s) plan(s) d'itinéraire finalisé(s) correspondant aux filtres projet/plage de dates/équipe/direction — y compris itinéraires, arrêts, passagers, distance et durée — en intégralité.

PUT/api/integration/plan/{runId}

Écrase les données d'itinéraire/arrêt/passager d'une exécution avec les modifications faites côté ERP. La géométrie de l'itinéraire est recalculée par vitaRoute.

result[] — Route

ChampTypeDescription
routeNamestring?Nom de l'itinéraire, ex. "Ligne 1"
colorstring?Couleur d'affichage sur la carte, hex (facultatif)
stopsStop[]Arrêts, DANS L'ORDRE DE L'ITINÉRAIRE

stops[] — Stop

ChampTypeDescription
latfloatLatitude de l'arrêt
lngfloatLongitude de l'arrêt
stopNamestring?Nom de l'arrêt (facultatif)
passengersPassenger[]Passagers affectés à cet arrêt

passengers[] — Passenger

ChampTypeDescription
idstringId de passager existant (doit correspondre exactement à celui de la réponse GET) — REQUIS
namestring?Nom du passager (affichage uniquement)

Exemples de l'API d'intégration

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.