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.
- Créer un compte gratuit
- Générer une clé API depuis le tableau de bord
- 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.
⚠️ Note de sécurité
N'incluez pas vos clés API dans le code source. Utilisez des variables d'environnement.
Points de terminaison
/api/optimization/optimizeOptimisation 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.
/api/route/calculateCalcul de route de base. Plan de route simple basé sur les clusters.
/api/route/cluster-stopsRegroupe les arrêts existants selon la capacité du véhicule.
Schéma de requête
| Champ | Type | Description |
|---|---|---|
facilityLat | float | Coordonnée de latitude de l'installation/dépôt |
facilityLng | float | Coordonnée de longitude de l'installation/dépôt |
totalCapacity | int | Capacité maximale par véhicule (défaut : 14) |
vehicleCount | int | Toujours 0 — le nombre de véhicules est déterminé automatiquement |
maxWalking | int? | Distance de marche maximale (mètres, défaut : 500) |
maxDuration | int? | Durée maximale de l'itinéraire (minutes, défaut : 90) |
maxClusterDiameterKm | float | Diamètre géographique maximal des arrêts dans le même cluster (km, défaut : 25) |
minSavingsKm | float | Économie de distance minimale requise pour fusionner un arrêt (km, défaut : 0,3) |
maxDetourFactor | float | Ratio de détour maximal lors de l'ajout d'un arrêt à une route existante (défaut : 0,6) |
minDistrictPassengers | int | Nombre minimum de passagers pour créer une route spécifique à un district (défaut : 8) |
tripDirection | string | Direction du trajet : 'to_facility' (vers le dépôt) ou 'from_facility' (depuis le dépôt) |
arrivalTimeAtDepot | string? | 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é. |
useDistanceMatrix | boolean | Utiliser l'API Google Maps Distance Matrix pour des distances routières précises (défaut : false) |
nodes | NodeInput[] | Liste du personnel/des emplacements à optimiser |
NodeInput
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant unique du personnel/emplacement |
name | string | Nom du personnel |
latitude | float | Coordonnée de latitude |
longitude | float | Coordonnée de longitude |
district | string? | 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
| Plan | Requêtes/mois | Nœuds max | Simultané |
|---|---|---|---|
| Free | 50 | 1 | 1 |
| Starter | 1,000 | 100 | 5 |
| Growth | 5,000 | 500 | 20 |
| Enterprise | Illimité | 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
Bad Request
JSON invalide ou champ obligatoire manquant
Unauthorized
Clé API manquante ou invalide
Forbidden
La limite de votre plan a été dépassée
Too Many Requests
Limite de taux dépassée
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.
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.
/api/integration/projectsListe tous les projets de la clé API.
/api/integration/projectsCrée un nouveau projet (emplacement, modèle d'optimisation, informations de trajet).
/api/integration/projects/{projectId}Met à jour partiellement un projet — seuls les champs fournis changent.
/api/integration/projects/{projectId}Supprime définitivement un projet et toutes ses données (passagers, équipes, exécutions, plans). Irréversible.
| Champ | Type | Description |
|---|---|---|
name | string | Nom du projet |
facilityLat | float | Latitude du site |
facilityLng | float | Longitude du site |
description | string? | Description (facultatif) |
countryCode | string? | Code pays, ex. "TR" (facultatif) |
icon | string? | Clé d'icône du site (facultatif) |
optimizationModel | string | "personnel" (transport du personnel) | "school" (transport scolaire) |
passengerMode | string | "fixed" (trajets fixes) | "shift" (par équipes) — pertinent uniquement en modèle personnel |
trips | Trip[] | 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.
/api/integration/shifts?projectId=Liste toutes les équipes d'un projet.
/api/integration/shiftsAjoute une nouvelle équipe (au moins une heure d'entrée ou de sortie requise).
/api/integration/shifts/{shiftId}Met à jour partiellement une équipe.
/api/integration/shifts/{shiftId}Supprime une équipe.
| Champ | Type | Description |
|---|---|---|
projectId | string | Id du projet auquel ajouter l'équipe |
name | string | Nom de l'équipe, ex. "Matin" |
entryTime | string? | Heure d'entrée, "HH:mm" (facultatif) |
exitTime | string? | Heure de sortie, "HH:mm" (facultatif) |
nextDayExit | boolean | true = 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.
/api/integration/passengers?projectId=Liste tous les passagers d'un projet.
/api/integration/passengersAjoute un nouveau passager (nom et emplacement requis).
/api/integration/passengers/{nodeId}Met à jour partiellement un passager.
/api/integration/passengers/{nodeId}Supprime un passager.
| Champ | Type | Description |
|---|---|---|
projectId | string | Id du projet auquel ajouter le passager |
name | string | Nom du passager |
latitude | float | Latitude |
longitude | float | Longitude |
employeeNo | string? | Matricule/numéro d'élève — clé naturelle pour faire correspondre vos propres enregistrements (facultatif) |
department | string? | Département (facultatif) |
gender | string? | "male" | "female" (facultatif) |
specialNeeds | boolean | Besoins particuliers (par défaut : false) |
address | string? | Texte d'adresse (facultatif) |
city | string? | Ville (facultatif) |
district | string? | 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.
/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é.
/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
| Champ | Type | Description |
|---|---|---|
routeName | string? | Nom de l'itinéraire, ex. "Ligne 1" |
color | string? | Couleur d'affichage sur la carte, hex (facultatif) |
stops | Stop[] | Arrêts, DANS L'ORDRE DE L'ITINÉRAIRE |
stops[] — Stop
| Champ | Type | Description |
|---|---|---|
lat | float | Latitude de l'arrêt |
lng | float | Longitude de l'arrêt |
stopName | string? | Nom de l'arrêt (facultatif) |
passengers | Passenger[] | Passagers affectés à cet arrêt |
passengers[] — Passenger
| Champ | Type | Description |
|---|---|---|
id | string | Id de passager existant (doit correspondre exactement à celui de la réponse GET) — REQUIS |
name | string? | 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.