API Dokümantasyonu
vitaRoute API entegrasyon rehberi
Hızlı Başlangıç
vitaRoute API'si REST tabanlıdır ve JSON ile çalışır. Tüm istekler HTTPS üzerinden gönderilmelidir.
- Ücretsiz hesap oluşturun
- Dashboard'dan API key oluşturun
- İlk optimizasyon isteğinizi gönderin
Kimlik Doğrulama
Tüm API istekleri X-Api-Key header'ı ile kimlik doğrulaması gerektirir.
⚠️ Güvenlik Notu
API key'lerinizi kaynak kodunuza dahil etmeyin. Ortam değişkenleri kullanın.
Endpoint'ler
/api/optimization/optimizeGelişmiş rota optimizasyonu. RL destekli tescilli vitaRoute algoritması ile 20+ parametre değerlendirilerek en verimli rotalar hesaplanır.
/api/route/calculateTemel rota hesaplama. Kümeleme tabanlı basit rota planı.
/api/route/cluster-stopsMevcut duraksları araç kapasitesine göre kümelere ayırır.
İstek Şeması
| Alan | Tip | Açıklama |
|---|---|---|
facilityLat | float | Tesis/depo enlem koordinatı |
facilityLng | float | Tesis/depo boylam koordinatı |
totalCapacity | int | Araç başına maksimum kapasite (varsayılan: 14) |
vehicleCount | int | Her zaman 0 — araç sayısı otomatik belirlenir |
maxWalking | int? | Maksimum yürüme mesafesi (metre, varsayılan: 500) |
maxDuration | int? | Maksimum rota süresi (dakika, varsayılan: 90) |
maxClusterDiameterKm | float | Aynı kümedeki durakların maksimum coğrafi çapı (km, varsayılan: 25) |
minSavingsKm | float | Bir durak birleştirme için minimum mesafe kazancı (km, varsayılan: 0.3) |
maxDetourFactor | float | Mevcut rotaya eklenen durağın maksimum sapma oranı (varsayılan: 0.6) |
minDistrictPassengers | int | İlçeye özel rota oluşturmak için minimum yolcu sayısı (varsayılan: 8) |
tripDirection | string | Yolculuk yönü: 'to_facility' (tesise gidiş) veya 'from_facility' (tesisten dönüş) |
arrivalTimeAtDepot | string? | Araçların tesise varış saati (ISO 8601 UTC). Verilirse trafik profiline göre hız hesaplanır; verilmezse sabit 28 km/sa kullanılır. |
useDistanceMatrix | boolean | Google Maps Distance Matrix API kullanılsın mı? (varsayılan: false) |
nodes | NodeInput[] | Optimize edilecek personel/konum listesi |
NodeInput
| Alan | Tip | Açıklama |
|---|---|---|
id | string | Benzersiz personel/lokasyon kimliği |
name | string | Personel adı |
latitude | float | Enlem koordinatı |
longitude | float | Boylam koordinatı |
district | string? | İlçe adı (isteğe bağlı, district kuralları için) |
Yanıt Şeması
{
"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
}
}
]
}İstek Limitleri
| Plan | Aylık İstek | Maks. Node | Eş Zamanlı |
|---|---|---|---|
| Free | 50 | 1 | 1 |
| Starter | 1,000 | 100 | 5 |
| Growth | 5,000 | 500 | 20 |
| Enterprise | Sınırsız | Sınırsız | Özel |
Rate limit aşıldığında 429 Too Many Requests yanıtı döner. Retry-After header'ı bekleme süresini belirtir.
Hata Kodları
Bad Request
Geçersiz JSON veya eksik zorunlu alan
Unauthorized
API key eksik veya geçersiz
Forbidden
Plan limitiniz aşıldı
Too Many Requests
Rate limit aşıldı
Internal Server Error
Sunucu hatası, destek ekibine bildirin
Kod Örnekleri
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>();Entegrasyon API'si (ERP Entegrasyonu)
Kendi arayüzünüzden (ör. bir ERP sisteminden) vitaRoute'u uçtan uca yönetmek için tasarlanmış bir API. Proje, vardiya ve yolcu kayıtlarını oluşturup güncelleyebilir, kesinleşmiş güzergah planlarını okuyabilir ve düzenlediğiniz planı geri yazabilirsiniz — extranet arayüzüne hiç girmeden.
Aynı kimlik doğrulama (X-Api-Key) kullanılır; tüm uçlar https://api.vitaroute.ai/api/integration altında yer alır.
Tüm PUT (güncelleme) istekleri KISMİDİR — yalnızca gövdede gönderdiğiniz alanlar değişir, atladığınız alanlar mevcut değerini korur.
Plan güncellemesinde yol geometrisi (savedPolyline) ve mesafe/süre bilgisi (savedStats) GÖNDERİLMEZ — vitaRoute, verdiğiniz durak sırasından Google Directions ile bunları kendisi hesaplar. Böylece harita her zaman geçerli, gerçek bir yol gösterir.
Projeler
Proje oluşturma, listeleme, güncelleme ve silme. Bir ERP, kendi müşteri kaydına karşılık gelen vitaRoute projesinin kimliğini (id) burada saklamalıdır.
/api/integration/projectsAPI anahtarının sahip olduğu tüm projeleri listeler.
/api/integration/projectsYeni bir proje oluşturur (tesis konumu, optimizasyon modeli, sefer bilgileri).
/api/integration/projects/{projectId}Bir projeyi kısmen günceller — yalnızca gönderilen alanlar değişir.
/api/integration/projects/{projectId}Bir projeyi ve ona bağlı tüm veriyi (yolcu, vardiya, koşu, plan) kalıcı olarak siler. Geri alınamaz.
| Alan | Tip | Açıklama |
|---|---|---|
name | string | Proje adı |
facilityLat | float | Tesis enlem koordinatı |
facilityLng | float | Tesis boylam koordinatı |
description | string? | Açıklama (opsiyonel) |
countryCode | string? | Ülke kodu, örn. "TR" (opsiyonel) |
icon | string? | Tesis ikonu anahtarı (opsiyonel) |
optimizationModel | string | "personnel" (personel taşımacılığı) | "school" (okul servisi) |
passengerMode | string | "fixed" (sabit sefer) | "shift" (vardiyalı) — yalnızca personnel modelinde anlamlı |
trips | Trip[] | Sefer listesi (saat+yön). Sabit modelde en az bir sefer zorunlu; vardiyalı modelde yok sayılır. |
Vardiyalar
Vardiyalı projelerde tesise giriş/çıkış saatlerini tanımlayan vardiya kayıtlarının tam CRUD'u.
/api/integration/shifts?projectId=Bir projenin tüm vardiyalarını listeler.
/api/integration/shiftsYeni bir vardiya ekler (giriş/çıkış saatlerinden en az biri zorunludur).
/api/integration/shifts/{shiftId}Bir vardiyayı kısmen günceller.
/api/integration/shifts/{shiftId}Bir vardiyayı siler.
| Alan | Tip | Açıklama |
|---|---|---|
projectId | string | Vardiyanın ekleneceği proje kimliği |
name | string | Vardiya adı, örn. "Sabah" |
entryTime | string? | Tesise giriş saati, "HH:mm" (opsiyonel) |
exitTime | string? | Tesisten çıkış saati, "HH:mm" (opsiyonel) |
nextDayExit | boolean | true = çıkış ertesi gün (yalnızca exitTime verilmişse anlamlı) |
Yolcular
Yolcu/öğrenci/personel kayıtlarının tam CRUD'u. employee_no alanı, ERP'nizin kendi sicil/öğrenci numarasıyla hızlı eşleştirme yapabilmeniz için opsiyonel bir doğal anahtardır.
/api/integration/passengers?projectId=Bir projenin tüm yolcularını listeler.
/api/integration/passengersYeni bir yolcu ekler (ad ve konum zorunludur).
/api/integration/passengers/{nodeId}Bir yolcuyu kısmen günceller.
/api/integration/passengers/{nodeId}Bir yolcuyu siler.
| Alan | Tip | Açıklama |
|---|---|---|
projectId | string | Yolcunun ekleneceği proje kimliği |
name | string | Yolcu adı |
latitude | float | Enlem koordinatı |
longitude | float | Boylam koordinatı |
employeeNo | string? | Sicil/öğrenci no — kendi kaydınızla eşleştirme için doğal anahtar (opsiyonel) |
department | string? | Departman (opsiyonel) |
gender | string? | "male" | "female" (opsiyonel) |
specialNeeds | boolean | Özel ihtiyaç durumu (varsayılan: false) |
address | string? | Adres metni (opsiyonel) |
city | string? | Şehir (opsiyonel) |
district | string? | İlçe (opsiyonel) |
Plan Aktarımı
Kesinleşmiş güzergah planlarını proje/tarih/vardiya/yön filtreleriyle okuma; düzenlediğiniz durak sırası ve yolcu atamasını geri yazma.
/api/integration/plan?projectId=&dateFrom=&dateTo=&shiftName=&direction=Proje, tarih aralığı, vardiya ve yön filtreleriyle geçmişe yönelik kesinleşmiş plan(lar)ı — güzergah, durak, yolcu, mesafe ve süre dahil — tam veriyle döner.
/api/integration/plan/{runId}Bir koşunun güzergah/durak/yolcu verisini, ERP tarafında yapılan düzenlemeyle baştan yazar. Yol geometrisi vitaRoute tarafından yeniden hesaplanır.
result[] — Route
| Alan | Tip | Açıklama |
|---|---|---|
routeName | string? | Güzergah adı, örn. "Hat 1" |
color | string? | Haritada gösterim rengi, hex (opsiyonel) |
stops | Stop[] | Duraklar, güzergahtaki SIRAYLA |
stops[] — Stop
| Alan | Tip | Açıklama |
|---|---|---|
lat | float | Durak enlem koordinatı |
lng | float | Durak boylam koordinatı |
stopName | string? | Durak adı (opsiyonel) |
passengers | Passenger[] | Bu durakta güzergaha dahil olan yolcular |
passengers[] — Passenger
| Alan | Tip | Açıklama |
|---|---|---|
id | string | Mevcut yolcu kimliği (GET yanıtındakiyle birebir aynı olmalı) — ZORUNLU |
name | string? | Yolcu adı (görüntüleme amaçlı) |
Entegrasyon API'si Örnekleri
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.