المقابلة مجموعة مواعيد تُعرض على مرشح في طلب، أو على شخص مباشرة (مثل موظف في مسار تطوير). يختار المرشح موعداً من الرابط في بريده، وتقيّم اللجنة المقابلة في التطبيق. استخدم هذه النقاط لجدولة المقابلات من نظام آخر، ولمتابعة حالتها، ولاقتراح مواعيد جديدة أو الإلغاء.
جميع النقاط تحت /api/v1 وتتطلب مفتاح واجهة برمجية (Authorization: Bearer jdr_live_…) ينشئه مسؤول مساحة العمل من الإعدادات ← التكاملات.
النقاط
| الطريقة والمسار | ما تفعله | الصلاحية |
|---|---|---|
GET /api/v1/interviews | سرد المقابلات (ترقيم بالمؤشر، updatedSince، ?applicationId=&personId=&status=) | recruitment.view |
POST /api/v1/interviews | عرض مواعيد مقابلة | recruitment.act |
GET /api/v1/interviews/{id} | جلب مقابلة واحدة | recruitment.view |
PATCH /api/v1/interviews/{id} | اقتراح مواعيد جديدة أو الإلغاء | recruitment.act |
تشمل recruitment.act الصلاحية recruitment.view. ويعيد معرّف من مساحة عمل أخرى 404 not_found. ومقابلات وحدة التدريب (المتقدمون كمدربين) ليست ضمن هذه الواجهة.
كائن المقابلة
| الحقل | النوع | ملاحظات |
|---|---|---|
id | نص | |
status | نص | OFFERED (أُرسلت المواعيد)، CONFIRMED (اختار المرشح موعداً)، COMPLETED أو CANCELLED. |
applicationId | نص أو null | الطلب؛ null للمقابلة المستقلة مع شخص. |
personId | نص أو null | المرشح (أو الشخص) الذي تُجرى معه المقابلة. |
person | كائن أو null | { id, firstName, lastName, email, phone }. يُخفى email وphone دون recruitment.candidate.contact. |
offeredSlots | مصفوفة | أوقات البدء المعروضة بصيغة ISO 8601. |
selectedSlot | ISO 8601 أو null | الموعد الذي اختاره المرشح. |
durationMinutes | عدد صحيح | الافتراضي 45. |
interviewerIds | مصفوفة | اللجنة: معرّفات مستخدمين من الموظفين (انظر المستخدمون). |
location | نص أو null | قاعة أو عنوان أو رابط اجتماع. |
meetingProvider | نص أو null | manual أو google_meet. |
reproposalRequestedAt | ISO 8601 أو null | طلب المرشح مواعيد جديدة؛ يُمسح عند اقتراحها. |
notes | مصفوفة | ملاحظات اللجنة ودرجاتها: [{ id, authorUserId, rating, body, createdAt }]. |
externalRefs | مصفوفة | [{ system, externalId }] روابط بأنظمتك. |
createdAt، updatedAt | ISO 8601 |
لا يُعاد أبداً الرابط الخاص بالمرشح لاختيار الموعد.
الجدولة
يقبل POST /api/v1/interviews واحداً فقط من applicationId أو personId، إضافة إلى:
offeredSlots: تاريخان ووقتان على الأقل بصيغة ISO 8601 مع فرق التوقيت (2026-11-02T09:00:00Z).interviewerIds: مستخدم واحد على الأقل من موظفي مساحة عملك النشطين (وإلا422 unresolved_referenceمعdetails.ids).durationMinutesاختياري (15–480، الافتراضي 45) وlocation.
كما في التطبيق، يتلقى مرشح الطلب بريد المقابلة مع رابط اختيار الموعد، ويُرسل بريد لكل عضو في اللجنة مع السيرة الذاتية مرفقة؛ أما الشخص في المقابلة المستقلة فيُنبَّه داخل التطبيق. ولا تُجرى مقابلة لطلب مرفوض أو مُعيَّن (409 conflict، application_not_active). والاستجابة 201 Created مع المقابلة.
اقتراح مواعيد جديدة والإلغاء
- مواعيد جديدة:
PATCHبأي منofferedSlotsوdurationMinutesوinterviewerIdsوlocation. الحقول غير المرسلة تبقى كما هي. فقط ما دامت المقابلةOFFERED(409 conflict،interview_not_offered). يبقى رابط المرشح نفسه ويعرض المواعيد الجديدة، وتُرسل الدعوة وبريد اللجنة من جديد. - الإلغاء:
PATCHبالقيمة{ "status": "CANCELLED" }وحدها. يُرسل بريد للمرشح ويُزال أي حدث في التقويم. وإلغاء مقابلة ملغاة أصلاً (CANCELLED) يعيدها كما هي (200، دون بريد أو حدث)؛ ولا تُلغى مقابلة مكتملةCOMPLETED(409 conflictمعdetails.reasonبقيمةinterview_closed). - المقابلات المكتملة: المقابلة
COMPLETEDمغلقة أمام المواعيد الجديدة والإلغاء (409 conflictمعdetails.reasonبقيمةinterview_closed). ويستمر تقييم اللجنة في التطبيق.
أحداث خطافات الويب
| الحدث | متى | data.object |
|---|---|---|
interview.scheduled | عرض المواعيد (من التطبيق أو الواجهة) | المقابلة |
interview.updated | اختيار المرشح موعداً أو طلبه مواعيد جديدة، أو اقتراح مواعيد جديدة، أو أي إرسال لاحق لبطاقة تقييم أو تعديل لها بعد أن أصبحت المقابلة COMPLETED، بما في ذلك تعديل أول عضو في اللجنة لبطاقته (changedFields تسرد ما تغيّر؛ ["evaluation"] لبطاقة التقييم) | المقابلة |
interview.cancelled | إلغاء المقابلة | المقابلة |
interview.completed | إرسال أول عضو في اللجنة بطاقة تقييمه؛ تصبح المقابلة COMPLETED (يُرسل مرة واحدة لكل مقابلة) | المقابلة |
يقيّم كل عضو في اللجنة بشكل مستقل. أول بطاقة تقييم تجعل المقابلة COMPLETED؛ ويظل بإمكان بقية اللجنة إرسال بطاقاتهم، وأي إرسال لاحق لبطاقة تقييم أو تعديل لها (بما فيها بطاقة أول عضو) يُرسل interview.updated مع changedFields: ["evaluation"]. وكل بطاقة تقييم تُحدّث updatedAt للمقابلة، فتلتقط المزامنة بـ updatedSince الملاحظات notes الجديدة. تتبع الحمولات قاعدة الإخفاء: النقطة التي لا يملك تكاملها recruitment.candidate.contact تتلقى person.email وperson.phone مخفيين.
الأخطاء
| الحالة والرمز | المعنى |
|---|---|
403 forbidden | المفتاح لا يملك صلاحية من الجدول أعلاه. |
404 not_found | لا توجد مقابلة بهذا المعرّف في مساحة عملك. |
409 conflict | interview_not_offered أو interview_closed أو application_not_active. |
422 unresolved_reference | لم يُطابَق الطلب أو الشخص أو أحد أعضاء اللجنة. |
422 validation_failed | الطلب غير صالح (أقل من موعدين، أو بلا عضو لجنة، أو status مع حقول الجدولة…). |
مثال
curl -X POST https://jadiroon.com/api/v1/interviews \
-H "Authorization: Bearer $JADIROON_KEY" \
-H "Content-Type: application/json" \
-d '{ "applicationId": "cmvikf86m00g4knoqqorh7xj4", "offeredSlots": ["2026-11-02T09:00:00Z", "2026-11-03T10:00:00Z"], "interviewerIds": ["cmvikf7xk0003knoqj7x054vw"], "location": "HQ room 2" }'
الاستجابة 201 Created:
{
"id": "cmvm7rmyv0001kndlb0qdm315",
"status": "OFFERED",
"applicationId": "cmvikf86m00g4knoqqorh7xj4",
"personId": "cmvikf86l00g2knoqdek78fqh",
"person": { "id": "cmvikf86l00g2knoqdek78fqh", "firstName": "تركي", "lastName": "العنزي", "email": "t•••@example.com", "phone": null },
"offeredSlots": ["2026-11-02T09:00:00.000Z", "2026-11-03T10:00:00.000Z"],
"selectedSlot": null,
"durationMinutes": 45,
"interviewerIds": ["cmvikf7xk0003knoqj7x054vw"],
"location": "HQ room 2",
"meetingProvider": "manual",
"reproposalRequestedAt": null,
"notes": [],
"externalRefs": [],
"createdAt": "2026-10-24T09:46:05.191Z",
"updatedAt": "2026-10-24T09:46:05.191Z"
}