API-Dokumentation
vitaRoute API Integrationsleitfaden
Schnellstart
Die vitaRoute API ist REST-basiert und arbeitet mit JSON. Alle Anfragen müssen über HTTPS gesendet werden.
- Kostenloses Konto erstellen
- API-Schlüssel im Dashboard generieren
- Ihre erste Optimierungsanfrage senden
Authentifizierung
Alle API-Anfragen erfordern eine Authentifizierung über den X-Api-Key-Header.
⚠️ Sicherheitshinweis
Fügen Sie Ihre API-Schlüssel nicht in den Quellcode ein. Verwenden Sie Umgebungsvariablen.
Endpunkte
/api/optimization/optimizeErweiterte Routenoptimierung. Die effizientesten Routen werden durch Bewertung von 20+ Parametern mit dem proprietären RL-Algorithmus von vitaRoute berechnet.
/api/route/calculateGrundlegende Routenberechnung. Einfacher cluster-basierter Routenplan.
/api/route/cluster-stopsGruppiert vorhandene Haltestellen nach Fahrzeugkapazität.
Anfrage-Schema
| Feld | Typ | Beschreibung |
|---|---|---|
facilityLat | float | Breitengrad der Anlage/des Depots |
facilityLng | float | Längengrad der Anlage/des Depots |
totalCapacity | int | Maximale Kapazität pro Fahrzeug (Standard: 14) |
vehicleCount | int | Immer 0 — Fahrzeuganzahl wird automatisch bestimmt |
maxWalking | int? | Maximale Gehentfernung (Meter, Standard: 500) |
maxDuration | int? | Maximale Routendauer (Minuten, Standard: 90) |
maxClusterDiameterKm | float | Maximaler geografischer Durchmesser der Haltestellen im selben Cluster (km, Standard: 25) |
minSavingsKm | float | Mindest-Distanzeinsparung zum Zusammenführen einer Haltestelle (km, Standard: 0,3) |
maxDetourFactor | float | Maximaler Umwegfaktor beim Hinzufügen einer Haltestelle zu einer bestehenden Route (Standard: 0,6) |
minDistrictPassengers | int | Mindestanzahl an Fahrgästen für eine bezirksspezifische Route (Standard: 8) |
tripDirection | string | Fahrtrichtung: 'to_facility' (Hinfahrt zum Depot) oder 'from_facility' (Rückfahrt vom Depot) |
arrivalTimeAtDepot | string? | Ankunftszeit der Fahrzeuge am Depot (ISO 8601 UTC). Bei Angabe wird die Geschwindigkeit anhand des Verkehrsprofils berechnet; sonst werden feste 28 km/h verwendet. |
useDistanceMatrix | boolean | Google Maps Distance Matrix API für genaue Straßenentfernungen verwenden (Standard: false) |
nodes | NodeInput[] | Liste des zu optimierenden Personals/der Standorte |
NodeInput
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Eindeutige Personal-/Standortkennung |
name | string | Personalname |
latitude | float | Breitengradkoordinate |
longitude | float | Längengradkoordinate |
district | string? | Bezirksname (optional, für Bezirksregeln) |
Antwort-Schema
{
"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
}
}
]
}Ratenlimits
| Plan | Monatl. Anfragen | Max. Knoten | Gleichzeitig |
|---|---|---|---|
| Free | 50 | 1 | 1 |
| Starter | 1,000 | 100 | 5 |
| Growth | 5,000 | 500 | 20 |
| Enterprise | Unbegrenzt | Unbegrenzt | Individuell |
Wenn das Ratenlimit überschritten wird, wird eine 429 Too Many Requests Antwort zurückgegeben. Der Retry-After-Header gibt die Wartezeit an.
Fehlercodes
Bad Request
Ungültiges JSON oder fehlendes Pflichtfeld
Unauthorized
API-Schlüssel fehlt oder ist ungültig
Forbidden
Ihr Planlimit wurde überschritten
Too Many Requests
Ratenlimit überschritten
Internal Server Error
Serverfehler, bitte wenden Sie sich an den Support
Code-Beispiele
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>();Integrations-API (ERP-Integration)
Eine API zur vollständigen Verwaltung von vitaRoute aus Ihrer eigenen Oberfläche (z. B. einem ERP-System). Erstellen und aktualisieren Sie Projekt-, Schicht- und Fahrgastdaten, lesen Sie finalisierte Routenpläne und schreiben Sie Ihre Änderungen zurück — ganz ohne die Extranet-Oberfläche.
Verwendet dieselbe Authentifizierung (X-Api-Key); alle Endpunkte liegen unter https://api.vitaroute.ai/api/integration.
Alle PUT-Anfragen (Aktualisierung) sind TEILWEISE — nur die im Body gesendeten Felder ändern sich, ausgelassene Felder behalten ihren aktuellen Wert.
Senden Sie beim Aktualisieren eines Plans KEINE Routengeometrie (savedPolyline) oder Distanz/Dauer (savedStats) — vitaRoute berechnet diese selbst aus Ihrer Haltestellenreihenfolge über Google Directions, sodass die Karte immer einen gültigen, realen Straßenverlauf zeigt.
Projekte
Projekte erstellen, auflisten, aktualisieren und löschen. Ein ERP sollte hier die id des vitaRoute-Projekts speichern, das seinem eigenen Kundendatensatz entspricht.
/api/integration/projectsListet alle Projekte des API-Schlüssels auf.
/api/integration/projectsErstellt ein neues Projekt (Standort, Optimierungsmodell, Fahrtinformationen).
/api/integration/projects/{projectId}Aktualisiert ein Projekt teilweise — nur die angegebenen Felder ändern sich.
/api/integration/projects/{projectId}Löscht ein Projekt und alle zugehörigen Daten (Fahrgäste, Schichten, Läufe, Pläne) dauerhaft. Nicht rückgängig zu machen.
| Feld | Typ | Beschreibung |
|---|---|---|
name | string | Projektname |
facilityLat | float | Standort Breitengrad |
facilityLng | float | Standort Längengrad |
description | string? | Beschreibung (optional) |
countryCode | string? | Ländercode, z. B. "TR" (optional) |
icon | string? | Standort-Symbolschlüssel (optional) |
optimizationModel | string | "personnel" (Personaltransport) | "school" (Schülertransport) |
passengerMode | string | "fixed" (feste Fahrten) | "shift" (schichtbasiert) — nur im personnel-Modell relevant |
trips | Trip[] | Liste der Fahrten (Zeit+Richtung). Im fixed-Modus ist mindestens eine erforderlich; im shift-Modus wird sie ignoriert. |
Schichten
Vollständiges CRUD für Schichtdatensätze, die Ankunfts-/Abfahrtszeiten in schichtbasierten Projekten definieren.
/api/integration/shifts?projectId=Listet alle Schichten eines Projekts auf.
/api/integration/shiftsFügt eine neue Schicht hinzu (mindestens Ankunfts- oder Abfahrtszeit erforderlich).
/api/integration/shifts/{shiftId}Aktualisiert eine Schicht teilweise.
/api/integration/shifts/{shiftId}Löscht eine Schicht.
| Feld | Typ | Beschreibung |
|---|---|---|
projectId | string | Id des Projekts, dem die Schicht hinzugefügt wird |
name | string | Schichtname, z. B. "Morgen" |
entryTime | string? | Ankunftszeit, "HH:mm" (optional) |
exitTime | string? | Abfahrtszeit, "HH:mm" (optional) |
nextDayExit | boolean | true = Abfahrt am nächsten Tag (nur relevant, wenn exitTime angegeben ist) |
Fahrgäste
Vollständiges CRUD für Fahrgast-/Schüler-/Mitarbeiterdatensätze. Das Feld employee_no ist ein optionaler natürlicher Schlüssel, damit Ihr ERP Datensätze anhand seiner eigenen Personal-/Schülernummer abgleichen kann.
/api/integration/passengers?projectId=Listet alle Fahrgäste eines Projekts auf.
/api/integration/passengersFügt einen neuen Fahrgast hinzu (Name und Standort erforderlich).
/api/integration/passengers/{nodeId}Aktualisiert einen Fahrgast teilweise.
/api/integration/passengers/{nodeId}Löscht einen Fahrgast.
| Feld | Typ | Beschreibung |
|---|---|---|
projectId | string | Id des Projekts, dem der Fahrgast hinzugefügt wird |
name | string | Fahrgastname |
latitude | float | Breitengrad |
longitude | float | Längengrad |
employeeNo | string? | Personal-/Schülernummer — natürlicher Schlüssel zum Abgleich Ihrer eigenen Datensätze (optional) |
department | string? | Abteilung (optional) |
gender | string? | "male" | "female" (optional) |
specialNeeds | boolean | Besondere Bedürfnisse (Standard: false) |
address | string? | Adresstext (optional) |
city | string? | Stadt (optional) |
district | string? | Stadtteil (optional) |
Planübertragung
Finalisierte Routenpläne nach Projekt/Datum/Schicht/Richtung gefiltert lesen; die von Ihnen bearbeitete Haltestellenreihenfolge und Fahrgastzuordnung zurückschreiben.
/api/integration/plan?projectId=&dateFrom=&dateTo=&shiftName=&direction=Gibt finalisierte Routenpläne zurück, gefiltert nach Projekt/Datumsbereich/Schicht/Richtung — inklusive Routen, Haltestellen, Fahrgästen, Distanz und Dauer.
/api/integration/plan/{runId}Überschreibt die Routen-/Haltestellen-/Fahrgastdaten eines Laufs mit den ERP-seitigen Änderungen. Die Routengeometrie wird von vitaRoute neu berechnet.
result[] — Route
| Feld | Typ | Beschreibung |
|---|---|---|
routeName | string? | Routenname, z. B. "Route 1" |
color | string? | Anzeigefarbe auf der Karte, Hex (optional) |
stops | Stop[] | Haltestellen, IN ROUTENREIHENFOLGE |
stops[] — Stop
| Feld | Typ | Beschreibung |
|---|---|---|
lat | float | Haltestelle Breitengrad |
lng | float | Haltestelle Längengrad |
stopName | string? | Haltestellenname (optional) |
passengers | Passenger[] | Dieser Haltestelle zugeordnete Fahrgäste |
passengers[] — Passenger
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Vorhandene Fahrgast-Id (muss exakt der aus der GET-Antwort entsprechen) — ERFORDERLICH |
name | string? | Fahrgastname (nur zur Anzeige) |
Beispiele der Integrations-API
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.