الهيكل الوظيفي هو الجزء الذي تستخدمه مساحة عملك من تصنيف الوظائف: قطاعها، والقطاعات الفرعية التي اخترتها، والمجموعات الوظيفية تحتها (للأوصاف الوظيفية صفحتها الخاصة). هذه النقاط للقراءة فقط: يُبنى الهيكل الوظيفي داخل التطبيق، ويقرؤه نظام تخطيط الموارد (ERP) أو نظام الموارد البشرية لديك ليطابق عليه دليل وظائفه.
جميع النقاط تحت /api/v1 وتتطلب مفتاح واجهة برمجية (Authorization: Bearer jdr_live_…) ينشئه مسؤول مساحة العمل من الإعدادات ← التكاملات.
النقاط
| الطريقة والمسار | الوظيفة | الصلاحية |
|---|---|---|
GET /api/v1/sectors | قائمة قطاعات مساحة عملك | structure.functional.view |
GET /api/v1/sub-sectors | قائمة القطاعات الفرعية المختارة في هيكلك الوظيفي | structure.functional.view |
GET /api/v1/job-families | قائمة المجموعات الوظيفية التي تستخدمها مساحة عملك | structure.functional.view |
GET /api/v1/job-families/{jobFamilyId} | جلب مجموعة وظيفية واحدة | structure.functional.view |
تقبل كل قائمة limit (من 1 إلى 100، والافتراضي 50) وcursor وتُرجع { data, nextCursor }. ويُرجع updatedSince (بصيغة ISO 8601) الصفوف التي تغيّرت منذ ذلك الوقت فقط، بما فيها المؤرشفة. ويبحث ?externalSystem=&externalId= (معاً) عن الصف المرتبط بمعرّفك الخاص.
محتوى كل قائمة
- القطاعات: القطاع الذي تعمل فيه مساحة عملك، وأي قطاع أنشأته مساحة عملك.
- القطاعات الفرعية: القطاعات الفرعية المختارة في هيكلك الوظيفي فقط.
- المجموعات الوظيفية: المجموعات التي أضافتها مساحة عملك فقط (من الدليل المشترك أو من إنشائك). لا تظهر أبداً مجموعات أنشأتها مساحات عمل أخرى، حتى لو كانت تحت القطاع الفرعي نفسه.
الصفوف المؤرشفة التي ما زالت مستخدمة تُرجَع مع قيمة archivedAt.
المطابقة بين البيئات: slug
صفوف الدليل المشترك (القطاعات والقطاعات الفرعية والمجموعات الوظيفية والمهارات من دليل جديرون) تُرجع slug، مثل healthcare-services. لا يتغيّر الـ slug أبداً وهو نفسه في كل بيئات جديرون، لذا طابِق صفوف الدليل بالـ slug. أما الصفوف التي أنشأتها مساحة عملك فتُرجع slug: null، فطابِقها عبر externalRefs.
تختلف المعرّفات بين بيئات جديرون وقد تتغيّر عند إعادة تهيئة البيانات النموذجية: لا تنسخ المعرّفات من بيئة إلى أخرى.
كائن القطاع
| الحقل | النوع | ملاحظات |
|---|---|---|
id | نص | معرّف جديرون. |
slug | نص أو null | المفتاح الثابت لقطاع من الدليل؛ null لقطاعك الخاص. |
name | { ar, en } | |
archivedAt | ISO 8601 أو null | |
externalRefs | مصفوفة | [{ system, externalId }]. |
createdAt, updatedAt | ISO 8601 |
كائن القطاع الفرعي
| الحقل | النوع | ملاحظات |
|---|---|---|
id | نص | معرّف جديرون. |
slug | نص أو null | المفتاح الثابت لقطاع فرعي من الدليل؛ null لقطاعك الفرعي الخاص. |
sectorId | نص | القطاع الذي ينتمي إليه. |
name | { ar, en } | |
sortOrder | عدد صحيح | ترتيب العرض لديك (الأصغر أولاً). |
archivedAt | ISO 8601 أو null | |
externalRefs | مصفوفة | [{ system, externalId }]. |
createdAt, updatedAt | ISO 8601 | يتغيّر updatedAt أيضاً عند اختيار القطاع الفرعي أو إعادة ترتيبه. |
كائن المجموعة الوظيفية
مفتاح المجموعة الوظيفية هو id المجموعة. يمكن أن تستخدم مساحة عملك المجموعة نفسها أكثر من مرة بصفات (mandate) مختلفة، وكل استخدام هو نسخة (instance).
| الحقل | النوع | ملاحظات |
|---|---|---|
id | نص | معرّف المجموعة الوظيفية. |
slug | نص أو null | المفتاح الثابت لمجموعة من الدليل؛ null لمجموعتك الخاصة. |
name | { ar, en } | |
archivedAt | ISO 8601 أو null | |
instances | مصفوفة | نسخ مساحة عملك، انظر أدناه. |
externalRefs | مصفوفة | [{ system, externalId }]. |
createdAt, updatedAt | ISO 8601 | updatedAt هو آخر تغيير على المجموعة أو أي من نسخها، بما في ذلك حذف إحدى نسخها. |
لكل نسخة:
| الحقل | النوع | ملاحظات |
|---|---|---|
id | نص | معرّف النسخة (تشير إليه الأوصاف الوظيفية باسم workspaceJobFamilyId). |
mandate | نص | REGULATORY أو EXECUTIVE أو INTERNAL. |
subSectors | مصفوفة | [{ id, sortOrder }]: قطاعاتك الفرعية المختارة التي تقع المجموعة تحتها، وموضع المجموعة في كل منها (null حتى يُعاد ترتيبها). |
skills | كائن | { technical: [...], general: [...] }، المهارات المختارة لهذه النسخة، كل منها { id, slug, name }. |
createdAt, updatedAt | ISO 8601 |
أحداث خطافات الويب
| الحدث | متى | data.object |
|---|---|---|
sector.created | تنشئ مساحة عملك قطاعها الخاص أثناء التهيئة | القطاع |
sector.updated | تنتقل مساحة عملك إلى قطاع | القطاع |
sector.deleted | تتوقف مساحة عملك عن استخدام قطاع من الدليل (انتقلت إلى قطاع آخر) | { id, externalRefs } |
sub_sector.created | تنشئ مساحة عملك قطاعها الفرعي الخاص | القطاع الفرعي |
sub_sector.updated | يُختار قطاع فرعي أو يُعاد ترتيبه | القطاع الفرعي |
sub_sector.deleted | يُلغى اختيار قطاع فرعي | { id, externalRefs } |
job_family.created | تُنشأ مجموعة، أو تُضاف إلى مساحة عملك لأول مرة | المجموعة الوظيفية |
job_family.updated | يتغيّر اسم مجموعة، أو صفة نسخة أو مهاراتها أو ترتيبها، أو تُضاف نسخة أو تُنسخ أو تُحذف، أو يُختار قطاع فرعي تندرج تحته المجموعة أو يُلغى اختياره (فتتغيّر subSectors)، أو يُعاد تسمية مهارة خاصة بمساحة عملك في نسخة أو تُحذف | المجموعة الوظيفية |
job_family.deleted | تتوقف مساحة عملك عن استخدام مجموعة (حُذفت آخر نسخة منها)، أو حُذفت مجموعتك الخاصة | { id, externalRefs } |
<resource>.bulk_changed | تغيّر عدد كبير من الصفوف دفعة واحدة يتعذّر سردها | { resource } |
نسخ نسخة مجموعة وظيفية إلى صفة أخرى يرسل job_family.updated، وعند نسخ أوصافها الوظيفية ووظائفها يرسل أيضاً job_description.created وposition.created لكل نسخة (أو <resource>.bulk_changed إذا تجاوزت 50).
يعني *.deleted هنا غالباً أن الصف خرج من هيكلك الوظيفي: فالقطاع أو القطاع الفرعي أو المجموعة من الدليل ما زال موجوداً في الدليل. وحدها المجموعة التي أنشأتها مساحة عملك تُحذف فعلاً، وتظهر حينها أيضاً في GET /api/v1/deleted?resource=job_family. أما إلغاء الاختيار فلا يظهر أبداً في /deleted: إن احتمل أن يفوتك حدث *.deleted فأعد قراءة القائمة كاملة (دون updatedSince) وقارنها بقائمتك؛ فكل ما غاب عنها خرج من هيكلك الوظيفي.
التغييرات على الدليل المشترك نفسه (التي تجريها جديرون) لا ترسل أحداثاً. أعِد قراءة هذه القوائم من حين لآخر، يومياً مثلاً مع updatedSince، لالتقاطها.
الأخطاء
| الحالة والرمز | المعنى |
|---|---|
403 forbidden | المفتاح لا يملك structure.functional.view. |
404 not_found | مساحة عملك لا تستخدم مجموعة وظيفية بهذا المعرّف. |
422 validation_failed | قيمة limit أو cursor أو updatedSince غير صالحة. |
422 validation_failed | أُرسل أحد externalSystem وexternalId دون الآخر. |
مثال
curl https://jadiroon.com/api/v1/job-families?limit=1 \
-H "Authorization: Bearer $JADIROON_KEY"
{
"data": [
{
"id": "cmvjx0h1t0001kn3o9c2a7def",
"slug": "nursing",
"name": { "ar": "التمريض", "en": "Nursing" },
"archivedAt": null,
"instances": [
{
"id": "cmvjx0h9k0003kn3oa1b2c3d4",
"mandate": "EXECUTIVE",
"subSectors": [{ "id": "cmvjx0g7r0000kn3o5e6f7a8b", "sortOrder": 0 }],
"skills": {
"technical": [{ "id": "cmvjx0f2a0007kn3o1a2b3c4d", "slug": "patient-assessment", "name": { "ar": "تقييم المرضى", "en": "Patient assessment" } }],
"general": [{ "id": "cmvjx0f3b0008kn3o5e6f7a8b", "slug": "teamwork", "name": { "ar": "العمل الجماعي", "en": "Teamwork" } }]
},
"createdAt": "2026-10-20T09:12:44.120Z",
"updatedAt": "2026-10-21T13:40:02.511Z"
}
],
"externalRefs": [],
"createdAt": "2026-09-01T00:00:00.000Z",
"updatedAt": "2026-10-21T13:40:02.511Z"
}
],
"nextCursor": "Y212angwaDF0MDAwMWtuM285YzJhN2RlZg"
}