تخطَّ إلى المحتوى

واجهة البرمجة العامة

تتيح واجهة البرمجة العامة لبرامجك الخاصة أن تتحدّث مع Service Suite: برنامج محاسبة يسحب الفواتير، بوابة عملاء تُنشئ تدخّلًا، لوحة متابعة ترصد حالة أصولك.

إنها واجهة منتج: تتعامل مع العملاء والمواقع والأصول وأوامر الخدمة والعقود والمخزون والفواتير. ولست بحاجة أبدًا لمعرفة كيف بُني Service Suite داخليًا.

مفاتيح الواجهة البرمجية شاشة المفاتيح. يعمل كل مفتاح دائمًا بصفة مستخدم محدّد.

  • إبقاء العملاء والمواقع متوافقة مع نظام إدارتك الحالي.
  • السماح لنظام آخر بإنشاء أوامر خدمة — أداة مراقبة، نموذج ويب، بوابة عملاء.
  • قراءة الفواتير ومستويات المخزون لأغراض التقارير.
  • إشعار نظام خارجي فور انتهاء تدخّل.
الدورما يفعله
المسؤولينشئ المفاتيح ويمنح الصلاحيات ويلغي المفاتيح
مطوّرك أو مورّدكيستخدم المفتاح للربط

المتطلبات: صلاحية مسؤول في Service Suite، وشخص قادر على بناء الربط. لا حاجة إلى ترخيص أو وحدة إضافية.

العنوان الأساسيhttps://<عنوان-خدمتك>/api/v1/
المواصفة/api/v1/openapi.json — OpenAPI 3.1
صفحة التوثيق/api/docs
Terminal window
curl https://<عنوان-خدمتك>/api/v1/me \
-H "Authorization: Bearer <API_KEY>"

/me هو فحص السلامة: يثبت أن المفتاح يعمل ويُظهر بالضبط ما يُسمح له به.

{
"data": {
"credential": {
"name": "المحاسبة — مزامنة ليلية",
"prefix": "a1b2c3d4",
"scopes": ["customers:read", "invoices:read"],
"expires_at": null
},
"acting_as": { "id": 42, "name": "ربط المحاسبة" },
"api_version": "v1"
}
}
  1. اذهب إلى الإعدادات ← واجهة البرمجة العامة ← مفتاح API جديد.

  2. أعطِ المفتاح اسمًا يوضّح الغرض منه. يظهر هذا الاسم في سجل الوصول.

  3. اختر باسم أي مستخدم يعمل المفتاح. هذا هو حدّ الصلاحيات الحقيقي — انظر أدناه.

  4. حدِّد الصلاحيات (scopes) التي يحتاجها الربط، ولا شيء أكثر.

  5. اضبط عند الحاجة تاريخ انتهاء ونطاقات IP مسموحًا بها.

  6. احفظ. يُعرض السر مرة واحدة. انسخه فورًا إلى خزنة كلمات المرور لديك.

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

لذا لا تستطيع صلاحيات المفتاح إلا أن تُضيِّق، لا أن تُوسِّع أبدًا. أنشئ مستخدمًا مخصّصًا للربط بالصلاحيات المطلوبة بالضبط.

الصلاحيةما تفتحه
customers:read / customers:writeالعملاء
locations:read / locations:writeالمواقع
assets:read / assets:writeالأصول والمعدات
service_orders:read / service_orders:writeأوامر الخدمة
contracts:readعقود الصيانة
stock:readالمخزون
invoices:readالفواتير
reports:readبيانات التقارير
webhooks:manageإدارة الـ Webhooks

المخزون والفواتير للقراءة فقط في الإصدار v1. أما القيود المحاسبية وحركات المخزون فتتم داخل Service Suite نفسه، لا عبر الواجهة.

ما يمكنك قراءته وتعديله

Section titled “ما يمكنك قراءته وتعديله”
الموردقراءةإنشاءتعديلأرشفة
customers✅✅✅✅
locations✅—✅—
assets✅✅✅✅
service-orders✅✅✅—
contracts✅———
stock✅———
invoices✅———
GET /api/v1/<المورد> قائمة
GET /api/v1/<المورد>/<id> سجل واحد
POST /api/v1/<المورد> إنشاء
PATCH /api/v1/<المورد>/<id> تعديل
DELETE /api/v1/<المورد>/<id> أرشفة (وليس حذفًا نهائيًا أبدًا)

DELETE يؤرشف. لا يُحذف شيء نهائيًا عبر الواجهة أبدًا.

الترقيم والتصفية والترتيب

Section titled “الترقيم والتصفية والترتيب”
Terminal window
curl "https://<عنوان-خدمتك>/api/v1/assets?customer_id=57&page=2&page_size=100&sort=-write_date" \
-H "Authorization: Bearer <API_KEY>"
المعاملالافتراضيالأقصى
page1—
page_size50200

إن طلبت أكثر من 200 حصلت على 200 — لا على رسالة خطأ.

الترتيب عبر sort، بعدة حقول مفصولة بفواصل، مع - في المقدّمة للترتيب التنازلي. والتصفية بأسماء مرشِّحات المورد؛ ويوجد updated_since على كل مورد وهو ما تحتاجه للمزامنة التدريجية.

أسماء الترتيب والتصفية ثابتة لكل مورد. والاسم غير الموجود يُرفض بدل تجاهله بصمت — فتكتشف الخطأ المطبعي فورًا، بدل اكتشافك بعد أشهر أن مرشِّحك لم يعمل قط.

أرسل Idempotency-Key خاصًا بك مع كل POST:

Terminal window
curl -X POST https://<عنوان-خدمتك>/api/v1/service-orders \
-H "Authorization: Bearer <API_KEY>" \
-H "Idempotency-Key: <قيمة_فريدة_لكل_طلب>" \
-H "Content-Type: application/json" \
-d '{"customer_id": 57, "location_id": 112, "description": "صيانة سنوية"}'

إن انقطع الاتصال وأعدت المحاولة بالقيمة نفسها، حصلت على النتيجة الأصلية بدل أمر خدمة ثانٍ. وبدون هذه الترويسة يكون الطلب المكرَّر طلبًا ثانيًا حقيقيًا.

يعيد كل طلب أيضًا X-Request-Id. اذكره عند الإبلاغ عن مشكلة — به يُعثر على طلبك في السجل.

النوعفي الدقيقة
قراءة600
كتابة120
إدارة الـ Webhooks60
محاولات دخول فاشلة20

يعمل العدّاد لكل مفتاح على حدة، فلا يستهلك ربط مزدحم رصيد ربط آخر. وعند التجاوز تحصل على 429 مع ترويسة Retry-After. احترمها وأعد المحاولة بمهلة متصاعدة.

الرمزالمعنىما تفعله
400معامل أو حقل غير صالحصحّح الطلب؛ تذكر الاستجابة اسم الحقل
401المفتاح مفقود أو خاطئ أو منتهٍ أو ملغىتحقّق من المفتاح
403المفتاح تنقصه الصلاحية، أو المستخدم تنقصه الأحقّيةامنح الصلاحية، أو عدّل صلاحيات المستخدم
404غير موجود، أو خارج نطاق المستخدمتحقّق من المعرّف ومن الصلاحيات
409تعارض — مثل إعادة استخدام Idempotency-Key بمحتوى مختلفاستخدم قيمة جديدة
429طلبات كثيرة جدًاانتظر وأعد المحاولة

الرمز 403 الناتج عن نقص صلاحية والرمز 403 الناتج عن نقص أحقّية المستخدم يستدعيان حلَّين مختلفين. وتذكر الاستجابة أيّهما.

بدل الاستعلام المتكرّر، دع Service Suite يُشعرك.

الحدثمتى
service_order.createdأُنشئ أمر خدمة
service_order.updatedعُدِّل أمر خدمة
service_order.status_changedتغيّرت الحالة
service_order.completedانتهى التدخّل
asset.created / asset.updatedأُنشئ أصل أو عُدِّل
contract.createdأُنشئ عقد صيانة
invoice.postedرُحِّلت فاتورة

يحمل كل تسليم توقيع HMAC-SHA256. تحقّق منه قبل استخدام المحتوى — به تعرف أن الإشعار جاء فعلًا من بيئتك. تتم عمليات التسليم في الخلفية وتُعاد المحاولة بمهلة متصاعدة عند الفشل.

يجب أن يكون عنوان الاستقبال لديك متاحًا للعموم. أما العناوين على شبكة خاصة فتُرفض.

يعمل كل عميل في بيئته المعزولة. وتحدّد الواجهة تلك البيئة من العنوان الذي تستدعيها به؛ ولا يوجد معامل لتبديل البيئة، وأي محاولة كهذه تُرفض. وفوق ذلك، كل مفتاح مرتبط بالبيئة التي أصدرته، فلا يمكن أبدًا الوصول إلى نسخة من بيئة بمفاتيح الأصل.

يُسجَّل كل طلب: الوقت والمفتاح والأسلوب والمورد ورمز الاستجابة والمدة ومؤشّر للمصدر. ولا يُسجَّل أبدًا محتوى الطلبات ولا المفاتيح ولا الترويسات. بهذا يبقى السجل مفيدًا لتحليل مشكلة دون أن يصبح هو نفسه نسخة ثانية من بياناتك.

مذكورة لا مسكوت عنها.

  • المخزون والفواتير للقراءة فقط في الإصدار v1. لا يمكن إنشاؤها أو تعديلها عبر الواجهة البرمجية.
  • الفنّيون والفرق والمشاريع والساعات ليس لها مورد خاص في v1.
  • للواجهة إصدار واحد هو v1. أي تغيير قد يكسر التكاملات القائمة يذهب إلى إصدار لاحق لا إلى هذا الإصدار.
  • مفتاح واحد لكل ربط، لا مفتاح مشترك أبدًا. بهذا تلغي واحدًا دون كسر البقية.
  • امنح الصلاحيات التي يستخدمها الربط فقط. ابدأ بالقراءة وحدها.
  • استخدم Idempotency-Key دائمًا عند الإنشاء.
  • زامِن تدريجيًا عبر updated_since بدل جلب كل شيء في كل مرة.
  • احفظ السر في خزنة، لا في الشيفرة المصدرية ولا في ملف إعداد يدخل نظام إصدارات.
  • اضبط تاريخ انتهاء لمفاتيح الأطراف الخارجية.