الجديد: الإصدار الثاني من تطبيق السائق — مهام ومراسلة ونداء استغاثة
سرب
الحلول
التتبع المباشرسلامة السائقينالتقارير والتحليلاتالصيانة الوقائيةاللوجستيات والنقلالإنشاءات والمقاولاتكل القطاعاتوصل — النقل التجاريفوترة زاتكاحماية البيانات PDPLمركز الامتثال
المنتجات
لوحة القيادةتطبيق السائقبوابة نفاذالتكامل وواجهات الربطدخول العملاءبوابة المشغّل
الأسعارعرض حي
الامتثال
وصل — النقل التجاريفوترة زاتكاحماية البيانات PDPLالأسئلة الشائعة
القطاعات
اللوجستيات والنقلالإنشاءات والمقاولاتبقية القطاعاتحلول حسب الحاجة
الشركة
من نحنتواصل معناسياسة الخصوصيةالشروط والأحكام
الدعم
مركز التواصلالأسئلة الشائعةتطبيق السائقدخول العملاء
اطلب عرضاً توضيحياً جرّب المنصة English

واجهة ربطٍ موثّقةٌ ومنشورة.

ما يحتاجه فريقك التقني ليقرأ الأسطول ويكتب فيه من أنظمتكم: المواصفة الكاملة منشورةٌ ومقروءةٌ الآن، والعقد ثابتٌ ومُصدَّرٌ بصيغةٍ قياسية.

٠١ — الواجهة

واجهة REST واحدة، موصوفةٌ بالكامل.

المنصة تنشر واجهة REST API واحدة تحت المسار /api/v1، وكل عملياتها موصوفةٌ في ملف OpenAPI منشورٍ على الإنترنت — لا وثيقةَ مقتطفاتٍ يدوية تتخلّف عن الكود.

  • المسارات المنشورة — 609 مسار
  • العمليات الموصوفة — 759 عملية، لكلٍّ منها مُعرِّفٌ ثابت
  • إصدار الواجهة — v1 — يظهر في كل مسار
  • الصيغة — OpenAPI 3 · الطلبات والردود بترميز JSON
الأرقام أعلاه مقروءةٌ من المواصفة المنشورة نفسها، لا من تقديرٍ تحريري.
٠٢ — المصادقة

مفتاحٌ واحد في ترويسة الطلب.

كل نداءٍ برمجي يحمل مفتاح منشأتك في ترويسة X-API-Key. المفتاح مرتبطٌ بالمنشأة وبصلاحياتها، ولا يرى غير بياناتها.

  • الترويسة: X-API-Key — على كل طلبٍ محمي.
  • المفتاح يُصدَر من داخل المنصة، بحسابٍ يملك صلاحية إدارة المفاتيح.
  • قيمة المفتاح تُعرض مرةً واحدةً عند إنشائه، ولا تُسترجَع بعدها.
  • الإلغاء فوريٌّ من الشاشة نفسها، ولكل إصدارٍ وإلغاءٍ سجلُّ تدقيق.
  • الوصول البرمجي متاحٌ في خطّتي الاحترافية والمؤسسات.
لا يوجد مفتاح ذاتي الإصدار — هذه الصفحة لا تصرف مفاتيح، ولا يوجد مفتاح ذاتي الإصدار من الموقع. طلب الوصول يمرّ بنا: تواصل معنا، فنُصدر لفريقك مفتاحاً على منشأتكم، وتديرونه بعدها من داخل المنصة.

اطلب وصولاً برمجياً

٠٣ — التصفيح والترتيب

كل قائمةٍ مُصفَّحة، وبسقفٍ معلن.

قوائم الواجهة كلها تقبل المعاملات نفسها، ويأتي مع كل ردٍّ عدّادُ الإجمالي والصفحة والحد — فلا حاجة لتخمين نهاية البيانات.

  • page — رقم الصفحة، يبدأ من 1
  • limit — عدد السجلات في الصفحة — الافتراضي 20، والأقصى 100
  • sort — حقل الترتيب، من قائمةٍ مسموحةٍ لكل مسار
  • order — asc أو desc
طلبُ حدٍّ أكبر من 100 يُقلَّص إلى 100 بدل أن يُرفض، وحقلُ ترتيبٍ غير مسموحٍ يُرَدُّ بخطأٍ صريح لا بترتيبٍ صامت.
٠٤ — وصفة تكامل كاملة

أربع خطوات، بطلبٍ وردٍّ حقيقيَّين لكلٍّ منها.

لا حاجة لمراسلتنا لمعرفة شكل الرد. هذه أربعة نداءات حقيقية على المنصة الحيّة، بترتيبها الفعلي، بقيمٍ مُستبدَلة لحماية بيانات عملائنا لكن ببنيةٍ مطابقةٍ لما يصلك فعلاً.

١. المصادقة

الدخول يُعيد توكن دخولٍ مؤقتاً (JWT من نوع Bearer). رقم منشأتك محمولٌ داخل هذا التوكن نفسه، ويُقرأ منه فقط — لا من جسم الطلب ولا من الرابط ولا من أي ترويسة.

POST /api/v1/auth/login
Content-Type: application/json

{
  "email": "owner@example.com",
  "password": "••••••••"
}
{
  "success": true,
  "data": {
    "access_token": "eyJhbGciOi...",
    "refresh_token": "eyJhbGciOi..."
  }
}

٢. قراءة صفحة من المركبات

التوكن يُرسَل في ترويسة Authorization على كل طلبٍ لاحق. القيم أدناه مُستبدَلةٌ بالكامل؛ البنية فقط هي المطابقة لما يعيده الحساب الحقيقي.

GET /api/v1/vehicles?page=1&limit=2
Authorization: Bearer <access_token>
{
  "success": true,
  "data": [
    {
      "id": 1001,
      "tenant_id": 9001,
      "imei": "000000000000001",
      "name": "DEMO-001",
      "name_ar": "مثال-001",
      "saudi_plate": "0000  AAA",
      "vehicle_class": "van",
      "make": "Example",
      "model": "Model",
      "year": 2024,
      "fuel_type": "diesel"
    }
  ],
  "meta": { "total": 2, "page": 1, "limit": 2 }
}

٣. قراءة ترويسات حدود الاستخدام

نفسُ الردِّ أعلاه يحمل حالة عدّادك في اللحظة نفسها — بلا نداءٍ إضافي، وبلا رقمٍ نُعلنه هنا (السقف يُضبط على مستوى منشأتك، كما في القسم التالي).

— (على أي ردٍّ ناجح من القسم السابق)
X-RateLimit-Limit: <سقف منشأتك>
X-RateLimit-Remaining: <المتبقّي الآن>
X-RateLimit-Reset: <ختم زمني Unix>

# وعند التجاوز:
HTTP/1.1 429 Too Many Requests
Retry-After: <عدد الثواني>

٤. ما الذي يتحدّث معه العتاد

قدرات كل عائلة أجهزةٍ مُعلَنةٌ بالاسم — والحقيقة الكاملة معها: كل فعلٍ اليوم قيمته sendable: false، لأن البوابة ترفض ترميز أي أمرٍ لم يُختبَر فعلياً على عتادٍ حقيقي بعد. هذا موقفُ أمانٍ متعمَّد، لا نقاشه.

GET /api/v1/devices/capabilities
Authorization: Bearer <access_token>
{
  "success": true,
  "data": {
    "allow_unverified_commands": false,
    "families": [
      {
        "name": "family_1",
        "verbs": [
          { "verb": "get_info", "status": "documented", "sendable": false },
          { "verb": "immobilize", "status": "documented", "sendable": false }
        ]
      }
    ]
  }
}
القيم أعلاه كلها مُستبدَلة عمداً — لا بيانات منشأةٍ ولا رقم جهازٍ حقيقي يظهر على صفحةٍ عامة. والبنية والحقول مطابقةٌ لما يعيده الحساب الحقيقي، سطراً بسطر.
٠٥ — حدود الاستخدام

الحدود معلنةٌ في ترويسات الرد.

لا حاجة للتجربة والخطأ لمعرفة ما بقي لك: كل ردٍّ يحمل حالة عدّادك في اللحظة نفسها.

  • X-RateLimit-Limit — سقف النافذة الحالية
  • X-RateLimit-Remaining — المتبقّي داخلها
  • X-RateLimit-Reset — لحظة إعادة التصفير
الرقم نفسه يُضبط على مستوى منشأتك ويُتَّفق عليه عند التعاقد، ولذلك لا نُعلن سقفاً ثابتاً هنا. وعند تجاوزه يعود الرد بترويسة Retry-After تخبر متى تُعاد المحاولة.
٠٦ — إشعارات الأحداث

المنصة تنادي نظامك عند الحدث.

بدل أن يسأل نظامك المنصة كل دقيقة، تسجّلون عنواناً واحداً (webhook) فيصلكم الحدث لحظة وقوعه. وقائمة الأحداث المسموح الاشتراك بها يخدمها المنتج نفسه، فلا تتخلّف عن الكود:

  • trip.completed — اكتملت رحلةٌ وسُجِّلت
  • geofence.entered — مركبةٌ دخلت منطقةً جغرافية
  • geofence.exited — مركبةٌ خرجت من منطقةٍ جغرافية
  • alert.created — تنبيهٌ جديد من قاعدةٍ فعّالة
  • device.offline — جهاز مركبةٍ توقّف عن الإرسال
  • alert.escalation.<template_key> — عائلةُ تصعيد التنبيهات — واللاحقة هي مفتاح قالب الإشعار عندكم
الاشتراك بحدثٍ خارج هذه القائمة يُرفض عند التسجيل — لا يُقبل بصمتٍ ثم لا يصل شيء.
٠٧ — جرّبها

افتح المواصفة، وشغّلها.

صفحة المواصفة التفاعلية مفتوحةٌ للقراءة الآن، وتستعرض كل عملية بمعاملاتها وردودها. وعنوانُ ملف المواصفة يُستورد مباشرةً في أي أداةٍ لتجربة الواجهات، فتتكوّن عندكم مجموعة النداءات كاملةً دون كتابة سطرٍ واحد.

القراءة مفتوحة للجميع؛ أما تنفيذ النداءات على بيانات منشأتكم فيحتاج مفتاحاً.

٠٨ — أسئلة الفريق التقني
هل الواجهة للقراءة فقط، أم للكتابة كذلك؟
للقراءة والكتابة معاً — الإنشاء والتعديل والحذف متاحةٌ حيث تكون منطقيةً للمورد، وبالصلاحيات نفسها الممنوحة للحساب الذي صدر عنه المفتاح، لا أوسع منها.
هل توفّرون مكتبةً جاهزةً بلغة برمجتنا؟
لا. ما ننشره هو المواصفة القياسية، ومنها يولّد فريقكم عميلاً بلغته بأدواته المعتادة. لا نوزّع مكتباتٍ نتكفّل بصيانتها، ونقول ذلك صريحاً بدل أن نلوّح بما لا نملك.
كيف نتأكّد أن التوثيق يطابق ما يعمل فعلاً؟
المواصفة تُحدَّث في التغيير نفسه الذي يمسّ الواجهة، والصفحة التفاعلية تقرأ الملف المنشور من المنصة الحيّة مباشرةً — فما تقرؤونه هو ما يستجيب.
هل يمكن لمفتاحٍ أن يرى بيانات منشأةٍ أخرى؟
لا. كل استعلامٍ مقصورٌ على منشأة صاحب المفتاح، وهذا القصر مُطبَّقٌ في طبقة التطبيق وفي قاعدة البيانات معاً، لا في واحدةٍ منهما.

أسطولك يستحق هذا الوضوح.

ابدأ بعرضٍ توضيحي على بياناتٍ حقيقية من المنصة نفسها — نرد خلال يوم عمل واحد.