توثيق API

دليل تكامل API vitaRoute

البدء السريع

واجهة API vitaRoute قائمة على REST وتعمل مع JSON. يجب إرسال جميع الطلبات عبر HTTPS.

Base URL: https://api.vitaroute.ai
  1. أنشئ حساباً مجانياً
  2. أنشئ مفتاح API من لوحة التحكم
  3. أرسل أول طلب تحسين لك

المصادقة

تتطلب جميع طلبات API المصادقة عبر ترويسة X-Api-Key.

X-Api-Key: vtr_live_xxxxxxxxxxxxxxxxxxxx

⚠️ ملاحظة أمنية

لا تضمّن مفاتيح API الخاصة بك في الكود المصدري. استخدم متغيرات البيئة.

نقاط النهاية

POST/api/optimization/optimize

تحسين مسارات متقدم. تُحسب المسارات الأكثر كفاءة عبر تقييم 20+ معلمة باستخدام خوارزمية vitaRoute الخاصة القائمة على التعلم المعزز.

POST/api/route/calculate

حساب مسارات أساسي. خطة مسار بسيطة قائمة على التجميع.

POST/api/route/cluster-stops

يجمّع المحطات الحالية وفق سعة المركبة.

مخطط الطلب

الحقلالنوعالوصف
facilityLatfloatإحداثية خط عرض المنشأة/المستودع
facilityLngfloatإحداثية خط طول المنشأة/المستودع
totalCapacityintالحد الأقصى للسعة لكل مركبة (الافتراضي: 14)
vehicleCountintدائماً 0 — يتم تحديد عدد المركبات تلقائياً
maxWalkingint?أقصى مسافة مشي (بالأمتار، الافتراضي: 500)
maxDurationint?أقصى مدة للمسار (بالدقائق، الافتراضي: 90)
maxClusterDiameterKmfloatالحد الأقصى للقطر الجغرافي للمحطات في نفس المجموعة (كم، الافتراضي: 25)
minSavingsKmfloatالحد الأدنى لتوفير المسافة المطلوب لدمج محطة (كم، الافتراضي: 0.3)
maxDetourFactorfloatالحد الأقصى لنسبة الانحراف عند إضافة محطة إلى مسار موجود (الافتراضي: 0.6)
minDistrictPassengersintالحد الأدنى للركاب لإنشاء مسار خاص بالمنطقة (الافتراضي: 8)
tripDirectionstringاتجاه الرحلة: 'to_facility' (إلى المستودع) أو 'from_facility' (من المستودع)
arrivalTimeAtDepotstring?وقت وصول المركبات إلى المستودع (ISO 8601 UTC). عند توفيره يُحسب السرعة بناءً على ملف المرور؛ وإلا يُستخدم 28 كم/ساعة ثابتة.
useDistanceMatrixbooleanاستخدام Google Maps Distance Matrix API للمسافات الدقيقة على الطريق (الافتراضي: false)
nodesNodeInput[]قائمة الموظفين/المواقع المراد تحسينها

NodeInput

الحقلالنوعالوصف
idstringمعرّف فريد للموظف/الموقع
namestringاسم الموظف
latitudefloatإحداثية خط العرض
longitudefloatإحداثية خط الطول
districtstring?اسم الحي (اختياري، لقواعد الأحياء)

مخطط الاستجابة

{
  "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الطلبات/شهرأقصى عقدمتزامن
Free50 1
Starter1,0001005
Growth5,00050020
Enterpriseغير محدودغير محدودمخصص

عند تجاوز حد المعدل، تُعاد استجابة 429 Too Many Requests. ترويسة Retry-After تحدد وقت الانتظار.

رموز الأخطاء

400

Bad Request

JSON غير صالح أو حقل مطلوب مفقود

401

Unauthorized

مفتاح API مفقود أو غير صالح

403

Forbidden

تم تجاوز حد خطتك

429

Too Many Requests

تم تجاوز حد المعدل

500

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.

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

يستخدم نفس المصادقة (X-Api-Key)؛ جميع نقاط النهاية موجودة ضمن https://api.vitaroute.ai/api/integration.

جميع طلبات PUT (التحديث) جزئية — تتغير فقط الحقول المُرسلة في الجسم، وتحتفظ الحقول المحذوفة بقيمتها الحالية.

عند تحديث خطة، لا ترسل هندسة المسار (savedPolyline) أو المسافة/المدة (savedStats) — يقوم vitaRoute بحسابها بنفسه من ترتيب المحطات عبر Google Directions، بحيث تعرض الخريطة دائمًا مسارًا حقيقيًا وصالحًا.

المشاريع

إنشاء المشاريع وعرضها وتحديثها وحذفها. يجب على نظام ERP تخزين معرّف مشروع vitaRoute المطابق لسجل العميل الخاص به هنا.

GET/api/integration/projects

يسرد جميع المشاريع التي يملكها مفتاح API.

POST/api/integration/projects

ينشئ مشروعًا جديدًا (موقع المنشأة، نموذج التحسين، معلومات الرحلات).

PUT/api/integration/projects/{projectId}

يحدّث مشروعًا جزئيًا — تتغير فقط الحقول المُقدَّمة.

DELETE/api/integration/projects/{projectId}

يحذف مشروعًا وكل بياناته (الركاب، الورديات، التشغيلات، الخطط) نهائيًا. لا يمكن التراجع.

الحقلالنوعالوصف
namestringاسم المشروع
facilityLatfloatخط عرض المنشأة
facilityLngfloatخط طول المنشأة
descriptionstring?الوصف (اختياري)
countryCodestring?رمز الدولة، مثل "TR" (اختياري)
iconstring?مفتاح أيقونة المنشأة (اختياري)
optimizationModelstring"personnel" (نقل الموظفين) | "school" (النقل المدرسي)
passengerModestring"fixed" (رحلات ثابتة) | "shift" (قائم على الورديات) — ذو معنى فقط في نموذج personnel
tripsTrip[]قائمة الرحلات (الوقت+الاتجاه). مطلوبة رحلة واحدة على الأقل في وضع fixed؛ تُتجاهل في وضع shift.

الورديات

عمليات CRUD كاملة لسجلات الورديات التي تحدد أوقات الدخول/الخروج من المنشأة في المشاريع القائمة على الورديات.

GET/api/integration/shifts?projectId=

يسرد جميع ورديات المشروع.

POST/api/integration/shifts

يضيف وردية جديدة (مطلوب وقت دخول أو خروج واحد على الأقل).

PUT/api/integration/shifts/{shiftId}

يحدّث وردية جزئيًا.

DELETE/api/integration/shifts/{shiftId}

يحذف وردية.

الحقلالنوعالوصف
projectIdstringمعرّف المشروع الذي تُضاف إليه الوردية
namestringاسم الوردية، مثل "الصباح"
entryTimestring?وقت الدخول، "HH:mm" (اختياري)
exitTimestring?وقت الخروج، "HH:mm" (اختياري)
nextDayExitbooleantrue = الخروج في اليوم التالي (ذو معنى فقط عند تقديم exitTime)

الركاب

عمليات CRUD كاملة لسجلات الركاب/الطلاب/الموظفين. حقل employee_no مفتاح طبيعي اختياري لمطابقة السجلات برقم القيد/الطالب الخاص بنظام ERP.

GET/api/integration/passengers?projectId=

يسرد جميع ركاب المشروع.

POST/api/integration/passengers

يضيف راكبًا جديدًا (الاسم والموقع مطلوبان).

PUT/api/integration/passengers/{nodeId}

يحدّث راكبًا جزئيًا.

DELETE/api/integration/passengers/{nodeId}

يحذف راكبًا.

الحقلالنوعالوصف
projectIdstringمعرّف المشروع الذي يُضاف إليه الراكب
namestringاسم الراكب
latitudefloatخط العرض
longitudefloatخط الطول
employeeNostring?رقم القيد/الطالب — مفتاح طبيعي لمطابقة سجلاتك الخاصة (اختياري)
departmentstring?القسم (اختياري)
genderstring?"male" | "female" (اختياري)
specialNeedsbooleanاحتياجات خاصة (الافتراضي: false)
addressstring?نص العنوان (اختياري)
citystring?المدينة (اختياري)
districtstring?الحي (اختياري)

نقل الخطة

قراءة خطط المسارات النهائية مُصفّاة حسب المشروع/التاريخ/الوردية/الاتجاه؛ كتابة ترتيب المحطات وتخصيص الركاب الذي عدّلته.

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

يعيد خطة/خطط المسار النهائية المطابقة لمرشحات المشروع/نطاق التاريخ/الوردية/الاتجاه — بما في ذلك المسارات والمحطات والركاب والمسافة والمدة — بالكامل.

PUT/api/integration/plan/{runId}

يستبدل بيانات المسار/المحطة/الراكب لتشغيل ما بالتعديلات التي تمت من جانب ERP. تُعاد حساب هندسة المسار بواسطة vitaRoute.

result[] — Route

الحقلالنوعالوصف
routeNamestring?اسم المسار، مثل "الخط 1"
colorstring?لون العرض على الخريطة، هيكس (اختياري)
stopsStop[]المحطات، بترتيب المسار

stops[] — Stop

الحقلالنوعالوصف
latfloatخط عرض المحطة
lngfloatخط طول المحطة
stopNamestring?اسم المحطة (اختياري)
passengersPassenger[]الركاب المخصصون لهذه المحطة

passengers[] — Passenger

الحقلالنوعالوصف
idstringمعرّف راكب موجود (يجب أن يطابق تمامًا المعرّف من استجابة GET) — إلزامي
namestring?اسم الراكب (للعرض فقط)

أمثلة واجهة برمجة التكامل

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.