مرجع الـ API
مرجع واجهة برمجة التطبيقات
مرحباً بك في مرجع واجهة برمجة تطبيقات منصّة أوكتا للشركاء. هذه الواجهة تمكّن تطبيقك — بعد الموافقة وتثبيته من قِبل المستأجر — من قراءة وكتابة بيانات أوكتا ضمن النطاقات التي مُنحت لك صراحةً.
واجهة الـ runtime تُستضاف على **okta-web** (التطبيق الأساسي للمنصّة)؛ كل طلب يصل إلى مسار `/apps` تحت الرابط الأساسي. منصّة الشركاء (okta-partners) هي حيث تُسجّل تطبيقك، تختار النطاقات، وتدير الإصدارات والـ webhooks.
الواجهة REST فوق HTTPS، تتبادل JSON (UTF-8)، وتستخدم رموز HTTP القياسية. كل القراءات والكتابات معزولة لكل مستأجر (tenant) ومحمية بنطاق مُسمّى.
نداء أول
curl https://getokta.io/api/apps/whoami \
-H "Authorization: Bearer $OKTA_PARTNER_TOKEN" \
-H "Accept: application/json"
الرابط الأساسي
واجهة الـ runtime تُستضاف على okta-web تحت المسار التالي:
https://getokta.io/api/apps
بيئة الاختبار (Sandbox):
https://dev.getokta.io/api/apps
المصادقة
كل طلب يُصادَق عليه عبر **installation token** على هيئة Bearer. الرمز يُصدَر تلقائياً عند تثبيت المستأجر لتطبيقك، وهو مرتبط بثنائية (المستأجر، التطبيق) ويحمل النطاقات الممنوحة.
Authorization: Bearer <installation_token>
- لا تُضمّن الرمز في كود الواجهة الأمامية ولا في مستودع عام — خزّنه كـ secret على الخادم (مثال: `OKTA_PARTNER_TOKEN`).
- الرمز قابل للتدوير من لوحة الشريك؛ التطبيقات الخارجية تستلم الرمز الجديد عبر الجسر دون إعادة نشر.
- الطلب بلا رمز أو برمز غير صالح يُردّ بـ `401 Unauthorized`. الرمز صالح لكن بلا النطاق المطلوب يُردّ بـ `403 Forbidden`.
تحقّق من الرمز
curl https://getokta.io/api/apps/whoami \
-H "Authorization: Bearer $OKTA_PARTNER_TOKEN"
# → { "tenant_id": 42, "module": "your-app", "scopes": [ ... ] }
النطاقات (Scopes)
كل قطعة بيانات محمية بنطاق بالصيغة `
| النطاق | الوصف |
|---|---|
education.students.read |
قراءة الطلاب |
education.students.write |
إنشاء/تعديل الطلاب |
education.guardians.read |
قراءة أولياء الأمور |
education.subjects.read |
قراءة المواد |
education.grades.read |
قراءة الصفوف |
education.sections.read |
قراءة الشُعب |
education.academic_years.read |
قراءة الأعوام الدراسية |
education.terms.read |
قراءة الفصول الدراسية |
employees.directory.read |
قراءة دليل الموظفين |
entity.hierarchy.read |
رؤية شجرة الجهة: مَن تحتها وملفّاتها ومَن فوقها — وشرطٌ لقراءة بيانات الجهات التابعة بـ`?entities=` |
reports.builder.read |
كتالوج/تنفيذ التقارير، وسرد قوالب المدرسة والطباعة عليها |
reports.builder.write |
اقتراح قالب من تأليف التطبيق (يصل مسودة) |
notifications.providers.send |
إرسال إشعار عبر مزوّد |
notifications.dispatch.send |
إرسال إشعار من كتالوج تطبيقك عبر HTTP (التطبيق Embedded ينادي الخدمة داخلياً بلا نطاق) |
notifications.logs.read |
قراءة سجلّ تسليم إشعارات تطبيقك (تثبيتك وحده) |
realtime.messages.write |
نشر رسالة فورية إلى أسطح تطبيقك (الاستماع بلا نطاق) |
نقاط النهاية
جميع المسارات نسبية للرابط الأساسي أعلاه. تتطلب نقاط الكتابة (POST/PATCH) النطاق المقابل.
الهوية
/whoami
بلا نطاق
معلومات الـ installation الحالي (المستأجر، التطبيق، النطاقات).
https://getokta.io/api/apps/whoami
معلومات الـ installation الحالي (المستأجر، التطبيق، النطاقات).
الجهة وشجرتها
/entity
بلا نطاق
أين أنا: نوع الجهة، هل هي حاوية، وأمّها.
https://getokta.io/api/apps/entity
أين أنا: نوع الجهة، هل هي حاوية، وأمّها.
/entity/children
entity.hierarchy.read
الجهات التابعة، ولكلٍّ `installed` و`access` (ما يُقرأ فيها)، ومعها `can_read_children` للشخص الحالي.
https://getokta.io/api/apps/entity/children
الجهات التابعة، ولكلٍّ `installed` و`access` (ما يُقرأ فيها)، ومعها `can_read_children` للشخص الحالي.
مُعطيات الاستعلام
كل المستويات بدل المستوى التالي وحده.
/entity/children/{id}
entity.hierarchy.read
ملفّ جهة تابعة: الشعار (مساراً)، التواصل، الدولة، المرحلة، الأحجام، و`access`.
https://getokta.io/api/apps/entity/children/{id}
ملفّ جهة تابعة: الشعار (مساراً)، التواصل، الدولة، المرحلة، الأحجام، و`access`.
مُعطيات المسار
ULID جهة تابعة لجهتك.
/entity/children/{id}/logo
entity.hierarchy.read
شعار الجهة التابعة ملفّاً — 404 حين لا شعار.
https://getokta.io/api/apps/entity/children/{id}/logo
شعار الجهة التابعة ملفّاً — 404 حين لا شعار.
مُعطيات المسار
ULID جهة تابعة لجهتك.
/entity/departments
entity.hierarchy.read
أقسام المجمّع ومدارس كلٍّ منها، و`viewer` مكان الشخص منها (`reach` ما يبلغه، أو null للشجرة كلّها). قراءات الشجرة كلّها محصورة في قسم الشخص أصلاً.
https://getokta.io/api/apps/entity/departments
أقسام المجمّع ومدارس كلٍّ منها، و`viewer` مكان الشخص منها (`reach` ما يبلغه، أو null للشجرة كلّها). قراءات الشجرة كلّها محصورة في قسم الشخص أصلاً.
/entity/ancestors
entity.hierarchy.read
الجهات فوقي، الأقرب أوّلاً.
https://getokta.io/api/apps/entity/ancestors
الجهات فوقي، الأقرب أوّلاً.
الطلاب
/education/students
education.students.read
قائمة الطلاب (مُرقّمة).
https://getokta.io/api/apps/education/students
قائمة الطلاب (مُرقّمة).
مُعطيات الاستعلام
رقم الصفحة (يبدأ من 1).
عدد العناصر لكل صفحة (حد أقصى 100).
بحث نصّي اختياري.
حتى 20 ULID لجهات تابعة مفصولة بفواصل: الردّ {"entities": {"<ulid>": ردّ هذه النقطة لتلك الجهة}}، والمرفوضة تحمل error وstatus تحت مفتاحها. تُقرأ المدرسة بمنحتها لتطبيقك أو بمنحة القراءة من جهتك نازلةً، ويلزم entity.hierarchy.read.
ULID جهة تابعة واحدة: الردّ ردّها هي كما هو. لشخص يحمل tenants.children.view_members، لا لتوكن التثبيت.
/education/students/{id}
education.students.read
طالب واحد.
https://getokta.io/api/apps/education/students/{id}
طالب واحد.
مُعطيات المسار
مُعرّف المورد في أوكتا.
مُعطيات الاستعلام
ULID جهة تابعة واحدة: الردّ ردّها هي كما هو. لشخص يحمل tenants.children.view_members، لا لتوكن التثبيت.
/education/students
education.students.write
إنشاء طالب.
https://getokta.io/api/apps/education/students
إنشاء طالب.
مُعطيات الجسم
الاسم الكامل للطالب.
رقم الهوية/الإقامة.
تاريخ الميلاد (YYYY-MM-DD).
male أو female.
مُعرّف الصف.
مُعرّف الشُعبة.
مُعرّف وليّ الأمر.
/education/students/{id}
education.students.write
تعديل طالب.
https://getokta.io/api/apps/education/students/{id}
تعديل طالب.
مُعطيات المسار
مُعرّف المورد في أوكتا.
مُعطيات الجسم
الاسم الكامل للطالب.
رقم الهوية/الإقامة.
تاريخ الميلاد (YYYY-MM-DD).
male أو female.
مُعرّف الصف.
مُعرّف الشُعبة.
مُعرّف وليّ الأمر.
أولياء الأمور
/education/guardians
education.guardians.read
قائمة أولياء الأمور.
https://getokta.io/api/apps/education/guardians
قائمة أولياء الأمور.
مُعطيات الاستعلام
رقم الصفحة (يبدأ من 1).
عدد العناصر لكل صفحة (حد أقصى 100).
بحث نصّي اختياري.
حتى 20 ULID لجهات تابعة مفصولة بفواصل: الردّ {"entities": {"<ulid>": ردّ هذه النقطة لتلك الجهة}}، والمرفوضة تحمل error وstatus تحت مفتاحها. تُقرأ المدرسة بمنحتها لتطبيقك أو بمنحة القراءة من جهتك نازلةً، ويلزم entity.hierarchy.read.
ULID جهة تابعة واحدة: الردّ ردّها هي كما هو. لشخص يحمل tenants.children.view_members، لا لتوكن التثبيت.
/education/guardians/{id}
education.guardians.read
وليّ أمر واحد.
https://getokta.io/api/apps/education/guardians/{id}
وليّ أمر واحد.
مُعطيات المسار
مُعرّف المورد في أوكتا.
مُعطيات الاستعلام
ULID جهة تابعة واحدة: الردّ ردّها هي كما هو. لشخص يحمل tenants.children.view_members، لا لتوكن التثبيت.
/education/guardians
education.guardians.write
إنشاء وليّ أمر.
https://getokta.io/api/apps/education/guardians
إنشاء وليّ أمر.
مُعطيات الجسم
الاسم الكامل لوليّ الأمر.
رقم الجوال بصيغة E.164.
البريد الإلكتروني.
father | mother | other.
/education/guardians/{id}
education.guardians.write
تعديل وليّ أمر.
https://getokta.io/api/apps/education/guardians/{id}
تعديل وليّ أمر.
مُعطيات المسار
مُعرّف المورد في أوكتا.
مُعطيات الجسم
الاسم الكامل لوليّ الأمر.
رقم الجوال بصيغة E.164.
البريد الإلكتروني.
father | mother | other.
المنهج الدراسي
/education/subjects
education.subjects.read
المواد.
https://getokta.io/api/apps/education/subjects
المواد.
مُعطيات الاستعلام
رقم الصفحة (يبدأ من 1).
عدد العناصر لكل صفحة (حد أقصى 100).
بحث نصّي اختياري.
حتى 20 ULID لجهات تابعة مفصولة بفواصل: الردّ {"entities": {"<ulid>": ردّ هذه النقطة لتلك الجهة}}، والمرفوضة تحمل error وstatus تحت مفتاحها. تُقرأ المدرسة بمنحتها لتطبيقك أو بمنحة القراءة من جهتك نازلةً، ويلزم entity.hierarchy.read.
ULID جهة تابعة واحدة: الردّ ردّها هي كما هو. لشخص يحمل tenants.children.view_members، لا لتوكن التثبيت.
/education/subjects
education.subjects.write
إنشاء مادة (idempotent).
https://getokta.io/api/apps/education/subjects
إنشاء مادة (idempotent).
مُعطيات الجسم
اسم المادة.
رمز المادة.
/education/grades
education.grades.read
الصفوف.
https://getokta.io/api/apps/education/grades
الصفوف.
مُعطيات الاستعلام
رقم الصفحة (يبدأ من 1).
عدد العناصر لكل صفحة (حد أقصى 100).
بحث نصّي اختياري.
حتى 20 ULID لجهات تابعة مفصولة بفواصل: الردّ {"entities": {"<ulid>": ردّ هذه النقطة لتلك الجهة}}، والمرفوضة تحمل error وstatus تحت مفتاحها. تُقرأ المدرسة بمنحتها لتطبيقك أو بمنحة القراءة من جهتك نازلةً، ويلزم entity.hierarchy.read.
ULID جهة تابعة واحدة: الردّ ردّها هي كما هو. لشخص يحمل tenants.children.view_members، لا لتوكن التثبيت.
/education/sections
education.sections.read
الشُعب.
https://getokta.io/api/apps/education/sections
الشُعب.
مُعطيات الاستعلام
رقم الصفحة (يبدأ من 1).
عدد العناصر لكل صفحة (حد أقصى 100).
بحث نصّي اختياري.
حتى 20 ULID لجهات تابعة مفصولة بفواصل: الردّ {"entities": {"<ulid>": ردّ هذه النقطة لتلك الجهة}}، والمرفوضة تحمل error وstatus تحت مفتاحها. تُقرأ المدرسة بمنحتها لتطبيقك أو بمنحة القراءة من جهتك نازلةً، ويلزم entity.hierarchy.read.
ULID جهة تابعة واحدة: الردّ ردّها هي كما هو. لشخص يحمل tenants.children.view_members، لا لتوكن التثبيت.
/education/academic-years
education.academic_years.read
الأعوام الدراسية.
https://getokta.io/api/apps/education/academic-years
الأعوام الدراسية.
مُعطيات الاستعلام
رقم الصفحة (يبدأ من 1).
عدد العناصر لكل صفحة (حد أقصى 100).
بحث نصّي اختياري.
حتى 20 ULID لجهات تابعة مفصولة بفواصل: الردّ {"entities": {"<ulid>": ردّ هذه النقطة لتلك الجهة}}، والمرفوضة تحمل error وstatus تحت مفتاحها. تُقرأ المدرسة بمنحتها لتطبيقك أو بمنحة القراءة من جهتك نازلةً، ويلزم entity.hierarchy.read.
ULID جهة تابعة واحدة: الردّ ردّها هي كما هو. لشخص يحمل tenants.children.view_members، لا لتوكن التثبيت.
/education/terms
education.terms.read
الفصول الدراسية.
https://getokta.io/api/apps/education/terms
الفصول الدراسية.
مُعطيات الاستعلام
رقم الصفحة (يبدأ من 1).
عدد العناصر لكل صفحة (حد أقصى 100).
بحث نصّي اختياري.
حتى 20 ULID لجهات تابعة مفصولة بفواصل: الردّ {"entities": {"<ulid>": ردّ هذه النقطة لتلك الجهة}}، والمرفوضة تحمل error وstatus تحت مفتاحها. تُقرأ المدرسة بمنحتها لتطبيقك أو بمنحة القراءة من جهتك نازلةً، ويلزم entity.hierarchy.read.
ULID جهة تابعة واحدة: الردّ ردّها هي كما هو. لشخص يحمل tenants.children.view_members، لا لتوكن التثبيت.
الموظفون
/employees/directory
employees.directory.read
دليل الموظفين.
https://getokta.io/api/apps/employees/directory
دليل الموظفين.
مُعطيات الاستعلام
رقم الصفحة (يبدأ من 1).
عدد العناصر لكل صفحة (حد أقصى 100).
بحث نصّي اختياري.
حتى 20 ULID لجهات تابعة مفصولة بفواصل: الردّ {"entities": {"<ulid>": ردّ هذه النقطة لتلك الجهة}}، والمرفوضة تحمل error وstatus تحت مفتاحها. تُقرأ المدرسة بمنحتها لتطبيقك أو بمنحة القراءة من جهتك نازلةً، ويلزم entity.hierarchy.read.
ULID جهة تابعة واحدة: الردّ ردّها هي كما هو. لشخص يحمل tenants.children.view_members، لا لتوكن التثبيت.
/employees/directory/{id}
employees.directory.read
موظف واحد.
https://getokta.io/api/apps/employees/directory/{id}
موظف واحد.
مُعطيات المسار
مُعرّف المورد في أوكتا.
مُعطيات الاستعلام
ULID جهة تابعة واحدة: الردّ ردّها هي كما هو. لشخص يحمل tenants.children.view_members، لا لتوكن التثبيت.
/employees/directory
employees.directory.write
إضافة موظف (idempotent).
https://getokta.io/api/apps/employees/directory
إضافة موظف (idempotent).
مُعطيات الجسم
الاسم الكامل للموظف.
المسمى الوظيفي.
البريد الإلكتروني.
التقارير
/reports/builder
reports.builder.read
كتالوج التقارير المتاحة.
https://getokta.io/api/apps/reports/builder
كتالوج التقارير المتاحة.
مُعطيات الاستعلام
حتى 20 ULID لجهات تابعة مفصولة بفواصل: الردّ {"entities": {"<ulid>": ردّ هذه النقطة لتلك الجهة}}، والمرفوضة تحمل error وstatus تحت مفتاحها. تُقرأ المدرسة بمنحتها لتطبيقك أو بمنحة القراءة من جهتك نازلةً، ويلزم entity.hierarchy.read.
ULID جهة تابعة واحدة: الردّ ردّها هي كما هو. لشخص يحمل tenants.children.view_members، لا لتوكن التثبيت.
/reports/builder/{key}/run
reports.builder.read
تنفيذ تقرير (idempotent).
https://getokta.io/api/apps/reports/builder/{key}/run
تنفيذ تقرير (idempotent).
مُعطيات المسار
مفتاح التقرير من الكتالوج.
مُعطيات الجسم
مُعطيات التقرير (تعتمد على نوعه).
/reports/templates
reports.builder.read
قوالب المدرسة المعتمدة (الترويسات).
https://getokta.io/api/apps/reports/templates
قوالب المدرسة المعتمدة (الترويسات).
مُعطيات الاستعلام
حتى 20 ULID لجهات تابعة مفصولة بفواصل: الردّ {"entities": {"<ulid>": ردّ هذه النقطة لتلك الجهة}}، والمرفوضة تحمل error وstatus تحت مفتاحها. تُقرأ المدرسة بمنحتها لتطبيقك أو بمنحة القراءة من جهتك نازلةً، ويلزم entity.hierarchy.read.
ULID جهة تابعة واحدة: الردّ ردّها هي كما هو. لشخص يحمل tenants.children.view_members، لا لتوكن التثبيت.
/reports/templates/{id}/render
reports.builder.read
طباعة محتواك على ترويسة — يعيد PDF.
https://getokta.io/api/apps/reports/templates/{id}/render
طباعة محتواك على ترويسة — يعيد PDF.
مُعطيات المسار
مُعرّف القالب المبهم كما وصلك من السرد — ليس رقماً.
مُعطيات الجسم
جسم المستند — كتل: heading, text, table, info-row, divider, spacer, image. النوع المجهول يُرفَض ولا يُتخطّى.
قيم متغيّرات القالب بمفاتيحها. المفتاح غير المُعلَن يُسقَط، ومتغيّرات المنصّة لا تُكتب فوقها.
/reports/templates
reports.builder.write
اقتراح قالب (يصل مسودة، idempotent).
https://getokta.io/api/apps/reports/templates
اقتراح قالب (يصل مسودة، idempotent).
مُعطيات الجسم
اسم القالب بالعربية.
اسم القالب بالإنجليزية.
وصف يراه من يختار القالب.
administrative | general.
portrait | landscape.
a4 | a3 | letter.
إظهار شريط الترويسة.
إظهار شريط التذييل.
محتوى خانة الترويسة اليمنى — نصّ يقبل {{المتغيّرات}}.
محتوى خانة الترويسة الوسطى.
محتوى خانة الترويسة اليسرى.
محتوى خانة التذييل اليمنى.
محتوى خانة التذييل الوسطى.
محتوى خانة التذييل اليسرى.
نص العلامة المائية.
شفافية العلامة المائية (0–100).
الهامش العلوي بالمليمتر (0–40).
الهامش الأيمن بالمليمتر (0–40).
الهامش السفلي بالمليمتر (0–40).
الهامش الأيسر بالمليمتر (0–40).
طباعة كتلة الاعتماد أسفل المستند.
عدد أعمدة كتلة الاعتماد (1–4).
عنوان كتلة الاعتماد.
الموقّعون: title_ar (مطلوب)، title_en، name، show_line. مصفوفة فارغة تحذفهم كلّهم؛ غياب المفتاح يتركهم كما هم.
حقول القالب: key (مطلوب)، label_ar (مطلوب)، label_en، type (text|date|number|currency)، required، default_value. مفتاح يظلّل متغيّراً جاهزاً يُسقَط بصمت.
/reports/templates/{id}
reports.builder.write
تعديل قالب ألّفه تطبيقك (يُسقط الاعتماد).
https://getokta.io/api/apps/reports/templates/{id}
تعديل قالب ألّفه تطبيقك (يُسقط الاعتماد).
مُعطيات المسار
مُعرّف القالب المبهم كما وصلك من السرد — ليس رقماً.
مُعطيات الجسم
اسم القالب بالعربية.
اسم القالب بالإنجليزية.
وصف يراه من يختار القالب.
administrative | general.
portrait | landscape.
a4 | a3 | letter.
إظهار شريط الترويسة.
إظهار شريط التذييل.
محتوى خانة الترويسة اليمنى — نصّ يقبل {{المتغيّرات}}.
محتوى خانة الترويسة الوسطى.
محتوى خانة الترويسة اليسرى.
محتوى خانة التذييل اليمنى.
محتوى خانة التذييل الوسطى.
محتوى خانة التذييل اليسرى.
نص العلامة المائية.
شفافية العلامة المائية (0–100).
الهامش العلوي بالمليمتر (0–40).
الهامش الأيمن بالمليمتر (0–40).
الهامش السفلي بالمليمتر (0–40).
الهامش الأيسر بالمليمتر (0–40).
طباعة كتلة الاعتماد أسفل المستند.
عدد أعمدة كتلة الاعتماد (1–4).
عنوان كتلة الاعتماد.
الموقّعون: title_ar (مطلوب)، title_en، name، show_line. مصفوفة فارغة تحذفهم كلّهم؛ غياب المفتاح يتركهم كما هم.
حقول القالب: key (مطلوب)، label_ar (مطلوب)، label_en، type (text|date|number|currency)، required، default_value. مفتاح يظلّل متغيّراً جاهزاً يُسقَط بصمت.
/reports/templates/{id}
reports.builder.write
حذف مسودة ألّفها تطبيقك.
https://getokta.io/api/apps/reports/templates/{id}
حذف مسودة ألّفها تطبيقك.
مُعطيات المسار
مُعرّف القالب المبهم كما وصلك من السرد — ليس رقماً.
الإشعارات
/notifications/capabilities
notifications.providers.send
قدرات قناة الإشعار.
https://getokta.io/api/apps/notifications/capabilities
قدرات قناة الإشعار.
/notifications/catalog
notifications.providers.send
للمزوّد: كتالوج إشعارات كل التطبيقات المثبَّتة على الجهة — المفاتيح ومتغيّراتها وحالة الجهة لكل مفتاح.
https://getokta.io/api/apps/notifications/catalog
لمزوّد القناة: كل مفتاح إشعار تعلنه التطبيقات المثبَّتة على هذه الجهة — بأسمائه ومتغيّراته (`variables`: اسم ← نوع) وقالب المطوّر الافتراضي وسقف قنواته — ومعه حالة الجهة للمفتاح إن ضبطته (`enabled`، `channels`، `template_id`). هذه هي المفاتيح التي ستصلك في `metadata.notification_key`، والمتغيّرات هي ما يملأ خانات قالبك. تطبيقات هذه الجهة وحدها، ولا مستلمين ولا حمولات. `installed_apps` تسرد كل تثبيت نشط بعدد إشعاراته كي يُقرأ ردٌّ فارغ: تثبيتات بلا إشعارات، أو توكن على جهة أخرى (`tenant_id`).
مُعطيات الاستعلام
اقتصر على المفاتيح التي ستخرج على هذه القناة هنا (اختيار الجهة إن وُجد، وإلا سقف المطوّر) — مثل `whatsapp`.
/notifications/send
notifications.providers.send
إرسال رسالة (idempotent).
https://getokta.io/api/apps/notifications/send
إرسال رسالة (idempotent).
مُعطيات الجسم
المُستلِم (رقم جوال أو مُعرّف مستخدم).
نص الرسالة.
قناة محدّدة (اختياري).
/notifications/dispatch
notifications.dispatch.send
إرسال إشعار من كتالوج تطبيقك إلى مستلمه — المنصّة تتولّى القنوات (idempotent).
https://getokta.io/api/apps/notifications/dispatch
يرسل مفتاحاً مُعلَناً في كتالوج تطبيقك إلى مستلمه، والمنصّة تختار القنوات من إعدادات المدرسة. التطبيق Embedded ينادي `App\Services\PartnerApi\Notifications\DispatchNotification` داخلياً بالحمولة نفسها.
مُعطيات الجسم
مفتاح مُعلَن في كتالوج تطبيقك (`<slug>.<resource>.<event>`). غير المُعلَن يُرفَض بـ422 يسمّيه.
`{type, id}` — من يخصّه الإشعار: `parent_of_student` (ulid الطالب)، `host_user` (مُعرّف مستخدم)، `school_admin` (الجهة). غيابه = مستلمو المدرسة المضبوطون. لا يُقرأ أي مفتاح `*_id` عنواناً.
ما تحلّه `{{ placeholders }}` القوالب. المفاتيح المسطّحة بجانب الحقول المحجوزة تُنقل إلى هنا تلقائياً.
عنوان يرسمه تطبيقك — يُستعمل حين لا ينطبق قالب.
نصّ يرسمه تطبيقك — ثالث ترتيب المصادر بعد قالب المدرسة ثم `default_template`.
رابط يفتحه الإشعار داخل التطبيق.
لغة النصّ الذي أرسلته (`ar`/`en`).
بيانات لك أنت؛ لا تُطبع.
/notifications/logs
notifications.logs.read
ما آل إليه ما أرسلته: حالة كل محاولة وخطؤها.
https://getokta.io/api/apps/notifications/logs
صفّ لكل (مفتاح، قناة) حاولته المنصّة لتثبيتك، بحالته والخطأ الذي تركته مهمّة القناة. `queued` لم يلتقطها العامل بعد؛ `sent` وصلت؛ `failed` تعذّرت (النصّ يقول لماذا)؛ `skipped_disabled` المدرسة لم تفعّل المفتاح؛ `skipped_no_transport` القناة بلا ناقل؛ `skipped_quiet` داخل ساعات الصمت؛ `skipped_plan_feature` خارج الباقة.
مُعطيات الاستعلام
رقم الصفحة (الافتراضي 1).
حجم الصفحة، الأقصى 100 (الافتراضي 50).
تصفية بالقناة: `in_app` `push` `whatsapp` `sms` `email` `webhook_out`.
تصفية بالحالة.
تصفية بمفتاح الإشعار.
من تاريخ (ISO 8601).
إلى تاريخ (ISO 8601).
الرسائل الفورية
/realtime/publish
realtime.messages.write
دفع رسالة فورية إلى أسطح تطبيقك في هذه الجهة (ليست idempotent).
https://getokta.io/api/apps/realtime/publish
يدفع رسالة إلى قناة تطبيقك في هذه الجهة وحدها. الاستماع لا يحتاج نطاقاً — التثبيت هو الإذن، ولا يوجد `realtime.messages.read`.
مُعطيات الجسم
اسم الحدث بمفرداتك أنت — `^[a-z][a-z0-9_.:-]{0,63}$`. لا يصير اسم حدث البثّ أبداً: ذاك هو الثابت `app.message`، واسمك يسافر داخل الحمولة.
حمولة الرسالة، بحد أقصى 8192 بايت من JSON. ما يحتاج بيانات يقرؤها السطح من الـ API بنطاقه المعتاد.
القائمة الكاملة دائماً في مواصفة OpenAPI 3.1 المحدّثة آلياً:/docs/openapi.json·/docs/postman_collection.json
الترقيم (Pagination)
نقاط النهاية التي ترجع قوائم مُرقّمة. استخدم `?page=2&per_page=50` (الحد الأقصى 100 لكل صفحة).
{
"data": [ ... ],
"total": 1242,
"per_page": 20,
"current_page": 1,
"last_page": 63
}
Idempotency
عمليات الكتابة (POST/PATCH) تقبل header اختياري. نفس المفتاح خلال 24 ساعة يعيد نفس الإجابة المخزّنة — فإن انقطع الاتصال على جانبك، إعادة المحاولة لن تُنشئ سجلاً مكرّراً.
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000
الأخطاء
الأخطاء تُعاد بجسم JSON موحّد مع رمز HTTP المناسب.
{
"message": "The given scope is not granted for this installation.",
"error": "scope_not_granted",
"scope": "education.students.write"
}
| الرمز | الاسم | الوصف |
|---|---|---|
400 |
Bad Request | جسم الطلب غير صالح أو ناقص. |
401 |
Unauthorized | رمز مفقود أو غير صالح. |
403 |
Forbidden | الرمز صالح لكن بلا النطاق المطلوب. |
404 |
Not Found | المورد غير موجود ضمن نطاق المستأجر. |
409 |
Conflict | تعارض idempotency أو حالة غير متّسقة. |
422 |
Unprocessable Entity | فشل التحقق من الحقول. |
429 |
Too Many Requests | تجاوزت حدّ المعدّل. |
5xx |
Server Error | خطأ مؤقّت — أعد المحاولة مع backoff. |
حدود المعدّل (Rate limits)
كل طلب يحمل ترويسات تُخبرك بالحدّ المتبقي. عند تجاوز الحدّ يُردّ `429` مع `Retry-After` (ثوانٍ). احترم backoff الأُسّي عند إعادة المحاولة.
| Header | الوصف |
|---|---|
X-RateLimit-Limit |
الحدّ الأقصى للنافذة. |
X-RateLimit-Remaining |
المتبقّي في النافذة الحالية. |
Retry-After |
ثوانٍ حتى السماح بطلب جديد (مع 429). |
Webhooks
التطبيقات الخارجية (External) تستقبل أحداث المنصّة عبر webhooks موقَّعة. كل webhook هو HTTP POST بجسم JSON موقَّع بـ HMAC-SHA256 على المظروف `
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"event": "education.students.created",
"tenant_id": 42,
"created_at": "2026-04-26T10:30:15+03:00",
"data": { "student": { "id": 123, "full_name": "..." } }
}
| Header | الوصف |
|---|---|
X-Okta-Event |
اسم الحدث. |
X-Okta-Delivery-Id |
UUID ثابت عبر إعادة المحاولات (للـ dedup). |
X-Okta-Timestamp |
Unix timestamp وقت التوقيع. |
X-Okta-Signature |
توقيع HMAC-SHA256 (hex). |
التحقق من التوقيع
$expected = hash_hmac(
'sha256',
$request->header('X-Okta-Timestamp').'.'.$request->getContent(),
$YOUR_WEBHOOK_SECRET,
);
if (! hash_equals($expected, $request->header('X-Okta-Signature'))) {
return response('invalid signature', 401);
}
- افحص أن `X-Okta-Timestamp` ضمن آخر 5 دقائق، وخزّن `X-Okta-Delivery-Id` لمدة 15 دقيقة على الأقل لرفض إعادة الإرسال.
- ردّك يجب أن يكون 2xx خلال 10 ثوانٍ. للمعالجة الطويلة اقبل بـ 202 فوراً وعالج خلفياً.
- backoff إعادة المحاولة: 30s → 2m → 10m → 1h → 6h، ثم يُعتبر التسليم فاشلاً ويظهر في صفحة تسليمات Webhook في لوحة الشريك.
مصادر ومراجع
هذا المرجع ملخّص عملي. للتفاصيل الكاملة (أنواع التكامل، دورة حياة التطبيق، الـ manifest، policy scanner) راجع دليل المطوّر.
- دليل المطوّر الكامل
- المصدر الخام (Markdown)
- llms.txt — فهرس صديق للذكاء الاصطناعي
- التقديم لتصبح شريكاً