الفرق والدعوات
من في مساحة العمل، وماذا يجوز له، وأي القنوات يراها. والفرق حدّ وصول لا هيكل تنظيمي: سلطتها الحقيقية الوحيدة هي حصر مجموعة من القنوات.
ما الموجود هنا
يحمل الأعضاء دورًا يُحلّ إلى تصاريح. وتجمع الفرق الأعضاء وقد تُحصر في قنوات. والدعوات هي طريق المرء ليصير عضوًا. وكل ذلك يتفرع عن مساحة عمل.
رموز الجلسة فقط
كل مسار في هذا القسم معلن لـ sessionToken وحده. فبيانات الاعتماد الآلية لا عضوية فريق لها ولا شخص لتدعوه، ولذلك لا شيء منها متاح بمفتاح API. ومعظم عمليات الكتابة تأخذ team.manage، بينما تأخذ القراءات workspace.read.
الأعضاء والأدوار
| القيمة | الوصف |
|---|---|
| owner | كل شيء، بما فيه ما لا يجوز إلا للمالك. |
| admin | كل شيء عدا إجراءات المالك. |
| manager | يدير صندوق الوارد وشؤون مساحة العمل اليومية، والتحليلات. |
| agent | يعمل على المحادثات. يقرأ ويستخدم ولا يدير. |
| developer | المفاتيح وخطافات الويب والقوالب وسطح الواجهة البرمجية. |
| billing | شاشات الفوترة ولا شيء غيرها. |
| read_only | يقرأ. ولا يغيّر شيئًا. |
معرّف العضوية بصيغة mem_…، وهو ليس معرّف المستخدم الذي تعرضه بقية الواجهة للشخص نفسه — فإسناد محادثة يأخذ معرّف العضوية، والجلسة لا تحمله، ولذلك يتطلب الاستحواذ على محادثة البحث عن نفسك في قائمة الأعضاء أولًا. أما تصاريح المتصل المحلولة فتوجد على مساحة العمل نفسها، انظر المصادقة.
الدعوات
curl -X POST https://whats.azzamkh.sa/api/v1/workspaces/ws_.../invitations \
-H "Authorization: Bearer <access token>" \
-H "Content-Type: application/json" \
-d '{ "email": "agent@example.com", "role": "agent" }'
# 201 Created
# {
# "id": "inv_...",
# "email": "agent@example.com",
# "role": "agent",
# "status": "pending",
# "expires_at": "2026-08-21T09:00:00.000Z",
# "created_at": "2026-08-14T09:00:00.000Z"
# }
# The invitee accepts with the token from the email. This route names no
# workspace and takes no scope — the token carries both.
curl -X POST https://whats.azzamkh.sa/api/v1/invitations/accept \
-H "Authorization: Bearer <access token>" \
-H "Content-Type: application/json" \
-d '{ "token": "..." }'
# 200 OK
# { "workspace_id": "ws_...", "role": "agent", "already_member": false }- المسار
POST /v1/invitations/acceptلا يسمّي مساحة عمل ولا يأخذ نطاقًا — فالرمز يحمل الاثنين. ويجيب بـalready_memberبدل الفشل حين يكون الشخص عضوًا بالفعل، فالقبول مرتين آمن. - تحمل الدعوة
expires_atوstatus. والإلغاء حذف للدعوة، ويجيب بالمعرّف والحالة الجديدة. - الدعوة محدودة بـ 50 في الساعة لكل مساحة عمل، والقبول بـ 20 في الساعة لكل شخص.
الفرق
- المسار
POST …/teamsعديم الأثر الجانبي على زوج مساحة العمل والاسم: يعيد الفريق الموجود بدل الرفض، فلا يوجد خطأ «الاسم مستخدم» لتعرضه. - حذف فريق وإزالة عضو وإزالة عضو فريق، كلها تجيب بـ
removed— لاdeleted. - المسار
GET …/teamsمُرقَّم بالمؤشر. أما…/teams/:id/membersو…/teams/:id/channelsفليسا كذلك — يجيبان بمصفوفةdataبسيطة. - يحمل صف عضو الفريق
member_idوuser_idمعًا. وقد تكونmember_idسلسلة فارغة حين يزول صف العضوية، فلا تجعلها مفتاح قائمة دون تحقّق.
الوصول إلى القنوات
منح القناة يحصرها
القناة التي لم يمنحها أحد مرئية لكل من يملك messages.read. وأول منح يحصرها في الفرق التي تملكها. ولذلك فإن PUT …/channels بمصفوفة فارغة لا يخفي شيئًا — بل يزيل منح هذا الفريق، وتعود القناة عامة لمساحة العمل إن لم يملكها فريق آخر. ويُرشَّح الوصول إلى المحادثات بالقاعدة نفسها، في القراءة والكتابة سواء.
# Granting INVERTS the intuition: a channel nobody has confined is visible
# to everyone with messages.read, and the first grant confines it.
curl -X PUT https://whats.azzamkh.sa/api/v1/workspaces/ws_.../teams/tm_.../channels \
-H "Authorization: Bearer <access token>" \
-H "Content-Type: application/json" \
-d '{ "channel_ids": ["ch_..."] }'
# 200 OK
# { "team_id": "tm_...", "channel_ids": ["ch_..."] }
# Sending [] does not hide anything: it removes THIS team's grants, and
# the channel becomes workspace-wide again if no other team holds it.الأخطاء المهمة هنا
| الرمز | HTTP | متى يحدث |
|---|---|---|
| TEAM_NOT_FOUND | 404 | لا يوجد فريق بهذا المعرّف في مساحة العمل هذه. |
| MEMBER_NOT_FOUND | 404 | لا توجد عضوية بهذا المعرّف. |
| INVITATION_NOT_FOUND | 404 | لا توجد دعوة بهذا المعرّف، أو لم تعد معلّقة. |
| MEMBER_ALREADY_EXISTS | 409 | ذلك الشخص عضو في مساحة العمل هذه بالفعل. |
| OWNER_REQUIRED | 403 | لا يجوز ذلك إلا لمالك مساحة العمل. |
كل رمز وحالته في صفحة الأخطاء.