تخطَّ إلى المحتوى
المحتويات
بيانات مساحة العمل

الفرق والدعوات

من في مساحة العمل، وماذا يجوز له، وأي القنوات يراها. والفرق حدّ وصول لا هيكل تنظيمي: سلطتها الحقيقية الوحيدة هي حصر مجموعة من القنوات.

ما الموجود هنا

يحمل الأعضاء دورًا يُحلّ إلى تصاريح. وتجمع الفرق الأعضاء وقد تُحصر في قنوات. والدعوات هي طريق المرء ليصير عضوًا. وكل ذلك يتفرع عن مساحة عمل.

رموز الجلسة فقط

كل مسار في هذا القسم معلن لـ sessionToken وحده. فبيانات الاعتماد الآلية لا عضوية فريق لها ولا شخص لتدعوه، ولذلك لا شيء منها متاح بمفتاح API. ومعظم عمليات الكتابة تأخذ team.manage، بينما تأخذ القراءات workspace.read.

الأعضاء والأدوار

GET/v1/workspaces/{workspaceId}/membersPATCH/v1/workspaces/{workspaceId}/members/{memberId}DELETE/v1/workspaces/{workspaceId}/members/{memberId}
القيمةالوصف
ownerكل شيء، بما فيه ما لا يجوز إلا للمالك.
adminكل شيء عدا إجراءات المالك.
managerيدير صندوق الوارد وشؤون مساحة العمل اليومية، والتحليلات.
agentيعمل على المحادثات. يقرأ ويستخدم ولا يدير.
developerالمفاتيح وخطافات الويب والقوالب وسطح الواجهة البرمجية.
billingشاشات الفوترة ولا شيء غيرها.
read_onlyيقرأ. ولا يغيّر شيئًا.

معرّف العضوية بصيغة mem_…، وهو ليس معرّف المستخدم الذي تعرضه بقية الواجهة للشخص نفسه — فإسناد محادثة يأخذ معرّف العضوية، والجلسة لا تحمله، ولذلك يتطلب الاستحواذ على محادثة البحث عن نفسك في قائمة الأعضاء أولًا. أما تصاريح المتصل المحلولة فتوجد على مساحة العمل نفسها، انظر المصادقة.

الدعوات

GET/v1/workspaces/{workspaceId}/invitationsPOST/v1/workspaces/{workspaceId}/invitationsDELETE/v1/workspaces/{workspaceId}/invitations/{invitationId}POST/v1/invitations/accept
curl
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 في الساعة لكل شخص.

الفرق

GET/v1/workspaces/{workspaceId}/teamsPOST/v1/workspaces/{workspaceId}/teamsGET/v1/workspaces/{workspaceId}/teams/{teamId}PATCH/v1/workspaces/{workspaceId}/teams/{teamId}DELETE/v1/workspaces/{workspaceId}/teams/{teamId}GET/v1/workspaces/{workspaceId}/teams/{teamId}/membersPOST/v1/workspaces/{workspaceId}/teams/{teamId}/membersDELETE/v1/workspaces/{workspaceId}/teams/{teamId}/members/{memberId}
  • المسار POST …/teams عديم الأثر الجانبي على زوج مساحة العمل والاسم: يعيد الفريق الموجود بدل الرفض، فلا يوجد خطأ «الاسم مستخدم» لتعرضه.
  • حذف فريق وإزالة عضو وإزالة عضو فريق، كلها تجيب بـ removed — لا deleted.
  • المسار GET …/teams مُرقَّم بالمؤشر. أما …/teams/:id/members و…/teams/:id/channels فليسا كذلك — يجيبان بمصفوفة data بسيطة.
  • يحمل صف عضو الفريق member_id وuser_id معًا. وقد تكون member_id سلسلة فارغة حين يزول صف العضوية، فلا تجعلها مفتاح قائمة دون تحقّق.

الوصول إلى القنوات

GET/v1/workspaces/{workspaceId}/teams/{teamId}/channelsPUT/v1/workspaces/{workspaceId}/teams/{teamId}/channels

منح القناة يحصرها

القناة التي لم يمنحها أحد مرئية لكل من يملك messages.read. وأول منح يحصرها في الفرق التي تملكها. ولذلك فإن PUT …/channels بمصفوفة فارغة لا يخفي شيئًا — بل يزيل منح هذا الفريق، وتعود القناة عامة لمساحة العمل إن لم يملكها فريق آخر. ويُرشَّح الوصول إلى المحادثات بالقاعدة نفسها، في القراءة والكتابة سواء.

curl
# 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_FOUND404لا يوجد فريق بهذا المعرّف في مساحة العمل هذه.
MEMBER_NOT_FOUND404لا توجد عضوية بهذا المعرّف.
INVITATION_NOT_FOUND404لا توجد دعوة بهذا المعرّف، أو لم تعد معلّقة.
MEMBER_ALREADY_EXISTS409ذلك الشخص عضو في مساحة العمل هذه بالفعل.
OWNER_REQUIRED403لا يجوز ذلك إلا لمالك مساحة العمل.

كل رمز وحالته في صفحة الأخطاء.