توثيق API
دليل تكامل API vitaRoute
البدء السريع
واجهة API vitaRoute قائمة على REST وتعمل مع JSON. يجب إرسال جميع الطلبات عبر HTTPS.
- أنشئ حساباً مجانياً
- أنشئ مفتاح API من لوحة التحكم
- أرسل أول طلب تحسين لك
المصادقة
تتطلب جميع طلبات API المصادقة عبر ترويسة X-Api-Key.
⚠️ ملاحظة أمنية
لا تضمّن مفاتيح API الخاصة بك في الكود المصدري. استخدم متغيرات البيئة.
نقاط النهاية
/api/optimization/optimizeتحسين مسارات متقدم. تُحسب المسارات الأكثر كفاءة عبر تقييم 20+ معلمة باستخدام خوارزمية vitaRoute الخاصة القائمة على التعلم المعزز.
/api/route/calculateحساب مسارات أساسي. خطة مسار بسيطة قائمة على التجميع.
/api/route/cluster-stopsيجمّع المحطات الحالية وفق سعة المركبة.
مخطط الطلب
| الحقل | النوع | الوصف |
|---|---|---|
facilityLat | float | إحداثية خط عرض المنشأة/المستودع |
facilityLng | float | إحداثية خط طول المنشأة/المستودع |
totalCapacity | int | الحد الأقصى للسعة لكل مركبة (الافتراضي: 14) |
vehicleCount | int | دائماً 0 — يتم تحديد عدد المركبات تلقائياً |
maxWalking | int? | أقصى مسافة مشي (بالأمتار، الافتراضي: 500) |
maxDuration | int? | أقصى مدة للمسار (بالدقائق، الافتراضي: 90) |
maxClusterDiameterKm | float | الحد الأقصى للقطر الجغرافي للمحطات في نفس المجموعة (كم، الافتراضي: 25) |
minSavingsKm | float | الحد الأدنى لتوفير المسافة المطلوب لدمج محطة (كم، الافتراضي: 0.3) |
maxDetourFactor | float | الحد الأقصى لنسبة الانحراف عند إضافة محطة إلى مسار موجود (الافتراضي: 0.6) |
minDistrictPassengers | int | الحد الأدنى للركاب لإنشاء مسار خاص بالمنطقة (الافتراضي: 8) |
tripDirection | string | اتجاه الرحلة: 'to_facility' (إلى المستودع) أو 'from_facility' (من المستودع) |
arrivalTimeAtDepot | string? | وقت وصول المركبات إلى المستودع (ISO 8601 UTC). عند توفيره يُحسب السرعة بناءً على ملف المرور؛ وإلا يُستخدم 28 كم/ساعة ثابتة. |
useDistanceMatrix | boolean | استخدام Google Maps Distance Matrix API للمسافات الدقيقة على الطريق (الافتراضي: false) |
nodes | NodeInput[] | قائمة الموظفين/المواقع المراد تحسينها |
NodeInput
| الحقل | النوع | الوصف |
|---|---|---|
id | string | معرّف فريد للموظف/الموقع |
name | string | اسم الموظف |
latitude | float | إحداثية خط العرض |
longitude | float | إحداثية خط الطول |
district | string? | اسم الحي (اختياري، لقواعد الأحياء) |
مخطط الاستجابة
{
"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
}
}
]
}حدود الطلبات
| Plan | الطلبات/شهر | أقصى عقد | متزامن |
|---|---|---|---|
| Free | 50 | 1 | |
| Starter | 1,000 | 100 | 5 |
| Growth | 5,000 | 500 | 20 |
| Enterprise | غير محدود | غير محدود | مخصص |
عند تجاوز حد المعدل، تُعاد استجابة 429 Too Many Requests. ترويسة Retry-After تحدد وقت الانتظار.
رموز الأخطاء
Bad Request
JSON غير صالح أو حقل مطلوب مفقود
Unauthorized
مفتاح API مفقود أو غير صالح
Forbidden
تم تجاوز حد خطتك
Too Many Requests
تم تجاوز حد المعدل
Internal Server Error
خطأ في الخادم، يرجى التواصل مع الدعم
أمثلة على الكود
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>();واجهة برمجة التكامل (تكامل ERP)
واجهة برمجية مصممة لإدارة vitaRoute من طرف إلى طرف من واجهتك الخاصة (مثل نظام ERP). أنشئ وحدّث سجلات المشاريع والورديات والركاب، واقرأ خطط المسارات النهائية، واكتب تعديلاتك مرة أخرى — كل ذلك دون الدخول إلى واجهة extranet.
يستخدم نفس المصادقة (X-Api-Key)؛ جميع نقاط النهاية موجودة ضمن https://api.vitaroute.ai/api/integration.
جميع طلبات PUT (التحديث) جزئية — تتغير فقط الحقول المُرسلة في الجسم، وتحتفظ الحقول المحذوفة بقيمتها الحالية.
عند تحديث خطة، لا ترسل هندسة المسار (savedPolyline) أو المسافة/المدة (savedStats) — يقوم vitaRoute بحسابها بنفسه من ترتيب المحطات عبر Google Directions، بحيث تعرض الخريطة دائمًا مسارًا حقيقيًا وصالحًا.
المشاريع
إنشاء المشاريع وعرضها وتحديثها وحذفها. يجب على نظام ERP تخزين معرّف مشروع vitaRoute المطابق لسجل العميل الخاص به هنا.
/api/integration/projectsيسرد جميع المشاريع التي يملكها مفتاح API.
/api/integration/projectsينشئ مشروعًا جديدًا (موقع المنشأة، نموذج التحسين، معلومات الرحلات).
/api/integration/projects/{projectId}يحدّث مشروعًا جزئيًا — تتغير فقط الحقول المُقدَّمة.
/api/integration/projects/{projectId}يحذف مشروعًا وكل بياناته (الركاب، الورديات، التشغيلات، الخطط) نهائيًا. لا يمكن التراجع.
| الحقل | النوع | الوصف |
|---|---|---|
name | string | اسم المشروع |
facilityLat | float | خط عرض المنشأة |
facilityLng | float | خط طول المنشأة |
description | string? | الوصف (اختياري) |
countryCode | string? | رمز الدولة، مثل "TR" (اختياري) |
icon | string? | مفتاح أيقونة المنشأة (اختياري) |
optimizationModel | string | "personnel" (نقل الموظفين) | "school" (النقل المدرسي) |
passengerMode | string | "fixed" (رحلات ثابتة) | "shift" (قائم على الورديات) — ذو معنى فقط في نموذج personnel |
trips | Trip[] | قائمة الرحلات (الوقت+الاتجاه). مطلوبة رحلة واحدة على الأقل في وضع fixed؛ تُتجاهل في وضع shift. |
الورديات
عمليات CRUD كاملة لسجلات الورديات التي تحدد أوقات الدخول/الخروج من المنشأة في المشاريع القائمة على الورديات.
/api/integration/shifts?projectId=يسرد جميع ورديات المشروع.
/api/integration/shiftsيضيف وردية جديدة (مطلوب وقت دخول أو خروج واحد على الأقل).
/api/integration/shifts/{shiftId}يحدّث وردية جزئيًا.
/api/integration/shifts/{shiftId}يحذف وردية.
| الحقل | النوع | الوصف |
|---|---|---|
projectId | string | معرّف المشروع الذي تُضاف إليه الوردية |
name | string | اسم الوردية، مثل "الصباح" |
entryTime | string? | وقت الدخول، "HH:mm" (اختياري) |
exitTime | string? | وقت الخروج، "HH:mm" (اختياري) |
nextDayExit | boolean | true = الخروج في اليوم التالي (ذو معنى فقط عند تقديم exitTime) |
الركاب
عمليات CRUD كاملة لسجلات الركاب/الطلاب/الموظفين. حقل employee_no مفتاح طبيعي اختياري لمطابقة السجلات برقم القيد/الطالب الخاص بنظام ERP.
/api/integration/passengers?projectId=يسرد جميع ركاب المشروع.
/api/integration/passengersيضيف راكبًا جديدًا (الاسم والموقع مطلوبان).
/api/integration/passengers/{nodeId}يحدّث راكبًا جزئيًا.
/api/integration/passengers/{nodeId}يحذف راكبًا.
| الحقل | النوع | الوصف |
|---|---|---|
projectId | string | معرّف المشروع الذي يُضاف إليه الراكب |
name | string | اسم الراكب |
latitude | float | خط العرض |
longitude | float | خط الطول |
employeeNo | string? | رقم القيد/الطالب — مفتاح طبيعي لمطابقة سجلاتك الخاصة (اختياري) |
department | string? | القسم (اختياري) |
gender | string? | "male" | "female" (اختياري) |
specialNeeds | boolean | احتياجات خاصة (الافتراضي: false) |
address | string? | نص العنوان (اختياري) |
city | string? | المدينة (اختياري) |
district | string? | الحي (اختياري) |
نقل الخطة
قراءة خطط المسارات النهائية مُصفّاة حسب المشروع/التاريخ/الوردية/الاتجاه؛ كتابة ترتيب المحطات وتخصيص الركاب الذي عدّلته.
/api/integration/plan?projectId=&dateFrom=&dateTo=&shiftName=&direction=يعيد خطة/خطط المسار النهائية المطابقة لمرشحات المشروع/نطاق التاريخ/الوردية/الاتجاه — بما في ذلك المسارات والمحطات والركاب والمسافة والمدة — بالكامل.
/api/integration/plan/{runId}يستبدل بيانات المسار/المحطة/الراكب لتشغيل ما بالتعديلات التي تمت من جانب ERP. تُعاد حساب هندسة المسار بواسطة vitaRoute.
result[] — Route
| الحقل | النوع | الوصف |
|---|---|---|
routeName | string? | اسم المسار، مثل "الخط 1" |
color | string? | لون العرض على الخريطة، هيكس (اختياري) |
stops | Stop[] | المحطات، بترتيب المسار |
stops[] — Stop
| الحقل | النوع | الوصف |
|---|---|---|
lat | float | خط عرض المحطة |
lng | float | خط طول المحطة |
stopName | string? | اسم المحطة (اختياري) |
passengers | Passenger[] | الركاب المخصصون لهذه المحطة |
passengers[] — Passenger
| الحقل | النوع | الوصف |
|---|---|---|
id | string | معرّف راكب موجود (يجب أن يطابق تمامًا المعرّف من استجابة GET) — إلزامي |
name | string? | اسم الراكب (للعرض فقط) |
أمثلة واجهة برمجة التكامل
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.