المقابلات

للمسؤولين

المقابلة مجموعة مواعيد تُعرض على مرشح في طلب، أو على شخص مباشرة (مثل موظف في مسار تطوير). يختار المرشح موعداً من الرابط في بريده، وتقيّم اللجنة المقابلة في التطبيق. استخدم هذه النقاط لجدولة المقابلات من نظام آخر، ولمتابعة حالتها، ولاقتراح مواعيد جديدة أو الإلغاء.

جميع النقاط تحت /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.
selectedSlotISO 8601 أو nullالموعد الذي اختاره المرشح.
durationMinutesعدد صحيحالافتراضي 45.
interviewerIdsمصفوفةاللجنة: معرّفات مستخدمين من الموظفين (انظر المستخدمون).
locationنص أو nullقاعة أو عنوان أو رابط اجتماع.
meetingProviderنص أو nullmanual أو google_meet.
reproposalRequestedAtISO 8601 أو nullطلب المرشح مواعيد جديدة؛ يُمسح عند اقتراحها.
notesمصفوفةملاحظات اللجنة ودرجاتها: [{ id, authorUserId, rating, body, createdAt }].
externalRefsمصفوفة[{ system, externalId }] روابط بأنظمتك.
createdAt، updatedAtISO 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 conflictinterview_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"
}