إدارة الفريق
دعوة أعضاء الفريق وتعيين الأدوار وإدارة الأذونات داخل مساحة العمل
تعاون مع فريقك عن طريق دعوة الأعضاء إلى مساحة العمل. يُعيَّن لكل عضو دور يحدد صلاحياته.
الأدوار
| الدور | القيمة | الوصف |
|---|---|---|
Owner | 0 | وصول كامل، الفوترة، إمكانية نقل الملكية |
Admin | 1 | وصول كامل باستثناء الفوترة ونقل الملكية |
Member | 2 | إرسال رسائل البريد الإلكتروني، إدارة النطاقات، عرض التحليلات |
Viewer | 3 | وصول للقراءة فقط لجميع الموارد |
صلاحيات الأدوار
عضو (Member) ليس للقراءة فقط ولا مستبعداً من إدارة المفاتيح، يمكنه إنشاء وتعديل معظم الأشياء. فقط حذف مفاتيح API والنطاقات والويب هوك، بالإضافة إلى إدارة الفريق والملكية، مقصور على Admin.
| الصلاحية | Owner | Admin | Member | Viewer |
|---|---|---|---|---|
| إرسال رسائل البريد الإلكتروني | نعم | نعم | نعم | لا |
| إدارة النطاقات | نعم | نعم | نعم | لا |
| إدارة المشتركين | نعم | نعم | نعم | لا |
| عرض التحليلات | نعم | نعم | نعم | نعم |
| إنشاء/تدوير مفاتيح API | نعم | نعم | نعم | لا |
| حذف مفاتيح API / النطاقات / خطافات الويب | نعم | نعم | لا | لا |
| إنشاء/تعديل خطافات الويب | نعم | نعم | نعم | لا |
| تعديل الإعدادات (بما فيها التتبع) | نعم | نعم | نعم | لا |
| دعوة الأعضاء | نعم | نعم | لا | لا |
| إزالة الأعضاء | نعم | نعم | لا | لا |
| تحديث الأدوار | نعم | نعم | لا | لا |
| إدارة الفوترة | نعم | لا | لا | لا |
| نقل الملكية | نعم | لا | لا | لا |
| حذف مساحة العمل | نعم | لا | لا | لا |
نظرة عامة على الفريق
الحصول على أعضاء الفريق الحاليين والدعوات المعلقة:
GET https://api.mail.land/v1/account/teamcurl https://api.mail.land/v1/account/team \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"members": [
{
"publicId": "mbr_a1b2c3d4e5",
"email": "[email protected]",
"fullName": "John Doe",
"role": "owner",
"status": "active",
"joinedAt": "2026-01-15T08:00:00Z",
"invitedByEmail": null,
"isCurrentUser": true
},
{
"publicId": "mbr_f6g7h8i9j0",
"email": "[email protected]",
"fullName": "Jane Smith",
"role": "admin",
"status": "active",
"joinedAt": "2026-01-20T10:00:00Z",
"invitedByEmail": "[email protected]",
"isCurrentUser": false
}
],
"pendingInvitations": [
{
"publicId": "inv_k1l2m3n4o5",
"email": "[email protected]",
"role": "member",
"status": "pending",
"createdAt": "2026-02-17T08:00:00Z",
"expiresAt": "2026-02-24T08:00:00Z",
"invitedByEmail": "[email protected]",
"invitedByName": "John Doe",
"isExpired": false
}
],
"totalMembers": 2,
"totalPendingInvitations": 1,
"maxMembers": 10
}لا يوجد id أو userId أو firstName/lastName أو roleName/statusName أو invitedBy أو memberCount أو invitationCount في هذه الاستجابة: استخدم أسماء الحقول أعلاه بدلاً من ذلك. تعكس maxMembers خطة مساحة العمل: 10 في Free وPro، وغير محدودة في Max. المقعد هو عضو نشط (بما في ذلك المالك) أو دعوة معلقة لم تنتهِ صلاحيتها؛ الأعضاء الموقوفون والدعوات المنتهية أو الملغاة أو المقبولة لا تُحتسب. عند بلوغ الحد، تُعيد الدعوة أو القبول أو إعادة التفعيل أو أول تسجيل دخول عبر SSO الرمز 400 PLAN_LIMIT_REACHED. لا يؤدي خفض الخطة إلى إزالة أو إيقاف أي عضو، بل يمنع فقط قبول أعضاء جدد ما دامت مساحة العمل تتجاوز الحد الجديد.
حالات الأعضاء
| الحالة | الوصف |
|---|---|
active | عضو فريق نشط |
suspended | موقوف من قِبَل مسؤول |
حالات الدعوة
تُعاد كسلاسل نصية بحروف صغيرة:
| الحالة | الوصف |
|---|---|
pending | في انتظار القبول |
accepted | تم قبول الدعوة |
expired | انتهت صلاحية الدعوة (7 أيام) |
revoked | تم إلغاء الدعوة (ليس "cancelled") |
دعوة عضو في الفريق
POST https://api.mail.land/v1/account/team/invite{
"email": "[email protected]",
"role": 2
}| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
email | string | نعم | عنوان البريد الإلكتروني للدعوة |
role | int | نعم | الدور المُعيَّن (1–3، لا يمكن الدعوة بصفة Owner) |
curl -X POST https://api.mail.land/v1/account/team/invite \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{ "email": "[email protected]", "role": 2 }'يتلقى المستخدم المدعو بريداً إلكترونياً يحتوي على رابط لقبول الدعوة. تنتهي صلاحية الدعوات بعد 7 أيام.
قبول دعوة
يوجد مسار عام واحد لقبول الدعوة: وهو غير مُرقّم بالإصدار (/v1 ليست جزءاً من المسار)، ومُعرَّف بواسطة رمز الدعوة (token) وليس بمعرّف (id):
POST https://api.mail.land/invitations/{token}/acceptبالنسبة إلى مستخدم MailLand حالي، سجّل الدخول بعنوان البريد الإلكتروني المدعو أولاً، ثم استدعِ هذا المسار بجسم فارغ أو بحد أدنى، لا حاجة إلى firstName/lastName/password. أما بالنسبة إلى مستخدم جديد تماماً، أرسل fullName وpassword في نفس الاستدعاء لإنشاء الحساب والقبول في خطوة واحدة.
{
"fullName": "New Member",
"password": "SecureP@ssw0rd!"
}curl -X POST https://api.mail.land/invitations/invitation-token-from-email/accept \
-H "Content-Type: application/json" \
-d '{"fullName": "New Member", "password": "SecureP@ssw0rd!"}'لا يوجد POST /v1/account/team/invitations/{id}/accept، ولا مسار منفصل /accept-public، ولا GET /v1/team/invitations/{id}?token=. كلا مساري قبول "المستخدم الحالي" و"المستخدم الجديد" يمران عبر نفس المسار العام /invitations/{token}/accept (Controllers/Public/InvitationsController.cs).
الحصول على معلومات الدعوة
استرجع تفاصيل الدعوة قبل قبولها (عام، لا يتطلب مصادقة، ومُعرَّف بواسطة الرمز، وليس /v1):
GET https://api.mail.land/invitations/{token}curl "https://api.mail.land/invitations/invitation-token-from-email"{
"tenantName": "My Company",
"role": "member",
"invitedByName": "John Doe",
"expiresAt": "2026-02-24T08:00:00Z",
"isExpired": false,
"alreadyAccepted": false,
"existingUserEmail": "[email protected]"
}إدارة الدعوات
إلغاء دعوة
DELETE https://api.mail.land/v1/account/team/invitations/{id}curl -X DELETE https://api.mail.land/v1/account/team/invitations/{id} \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."تُعيد 204 No Content عند النجاح.
إعادة إرسال دعوة
POST https://api.mail.land/v1/account/team/invitations/{id}/resendcurl -X POST https://api.mail.land/v1/account/team/invitations/{id}/resend \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."تؤدي إعادة إرسال الدعوة إلى إعادة تعيين مهلة انتهاء الصلاحية البالغة 7 أيام.
تحديث دور عضو
PATCH https://api.mail.land/v1/account/team/members/{id}/role{
"role": 1
}curl -X PATCH https://api.mail.land/v1/account/team/members/{id}/role \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{ "role": 1 }'يمكن للمالكين والمسؤولين فقط تحديث الأدوار. لا يمكنك تغيير دورك الخاص أو ترقية شخص ما إلى مالك (استخدم نقل الملكية بدلاً من ذلك).
يمكن لمسؤولي Admin إدارة أدوار Member/Viewer فقط: لا يمكنهم ترقية عضو إلى Admin أو تغيير دور مسؤول Admin آخر. المالك (Owner) وحده يستطيع ذلك.
التعليق ورفع التعليق
تعليق وصول عضو مؤقتاً:
POST https://api.mail.land/v1/account/team/members/{id}/suspendجسم { reason?, credentialDecision?, transferToMemberId? } يتحكم في ما يحدث لمفاتيح API الخاصة بهذا العضو أثناء التعليق. credentialDecision إلزامي فقط عندما يمتلك العضو مفتاح API نشطاً واحداً على الأقل: عدم إرساله في هذه الحالة يُرجع 400 CREDENTIAL_DECISION_REQUIRED مع سرد المفاتيح المكشوفة في details. بخلاف ذلك يمكن حذف الجسم بالكامل.
| الحقل | القيم |
|---|---|
reason | offboarding, compromise, abuse, other |
credentialDecision | revoke, keep, transfer |
transferToMemberId | إلزامي عندما تكون credentialDecision هي transfer |
curl -X POST https://api.mail.land/v1/account/team/members/{id}/suspend \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."استعادة عضو موقوف:
POST https://api.mail.land/v1/account/team/members/{id}/reactivatecurl -X POST https://api.mail.land/v1/account/team/members/{id}/reactivate \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."لا يمكن للأعضاء الموقوفين تسجيل الدخول إلى مساحة العمل؛ مفاتيح API الخاصة بهم تتبع قرار بيانات الاعتماد الذي اتُّخذ عند التعليق: مع keep، تستمر مفاتيح العضو في العمل.
إزالة عضو
DELETE https://api.mail.land/v1/account/team/members/{id}تقبل الإزالة نفس قرار بيانات الاعتماد، كمعاملات استعلام:
DELETE https://api.mail.land/v1/account/team/members/{id}?reason=offboarding&credentialDecision=revoke&transferToMemberId=mbr_f6g7h8i9j0كما في التعليق، credentialDecision إلزامي عندما يمتلك العضو مفتاح API نشطاً، وإلا يُرجع الاستدعاء 400 CREDENTIAL_DECISION_REQUIRED.
curl -X DELETE https://api.mail.land/v1/account/team/members/{id} \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."يُزال العضو من مساحة العمل ويفقد الوصول إلى جميع موارد مساحة العمل فوراً.
نقل الملكية
نقل ملكية مساحة العمل إلى عضو آخر:
POST https://api.mail.land/v1/account/team/transfer-ownership{
"newOwnerMemberId": "mbr_f6g7h8i9j0"
}curl -X POST https://api.mail.land/v1/account/team/transfer-ownership \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{ "newOwnerMemberId": "mbr_f6g7h8i9j0" }'نقل الملكية لا رجعة فيه. يُخفَّض المالك الحالي إلى مسؤول، ويصبح العضو المستهدف المالك الجديد.
يجب أن يكون الهدف مسؤولاً (Admin) نشطاً (وليس Member أو Viewer).
استجابات الخطأ
| الحالة | الكود | الوصف |
|---|---|---|
400 | VALIDATION_FAILED | بريد إلكتروني أو دور غير صالح |
400 | INVALID_REQUEST | أكثر من 50 دعوة معلقة لهذه المساحة |
400 | CREDENTIAL_DECISION_REQUIRED | هدف التعليق/الإزالة يمتلك مفاتيح API نشطة ولم يُرسل credentialDecision |
400 | CREDENTIAL_TRANSFER_TARGET_INVALID | credentialDecision: transfer مع transferToMemberId مفقود أو غير صالح |
403 | FORBIDDEN | صلاحيات غير كافية لهذا الإجراء |
404 | RESOURCE_NOT_FOUND | العضو أو الدعوة غير موجود |
400 | PLAN_LIMIT_REACHED | بلغت مساحة العمل حد المقاعد في خطتها (الدعوة، القبول، إعادة التفعيل، أو أول تسجيل دخول عبر SSO) |
409 | CONFLICT | المستخدم عضو بالفعل، أو لديه دعوة معلقة بالفعل |
لا يوجد رمز MEMBER_ALREADY_EXISTS: كل من "عضو بالفعل" و"الدعوة موجودة مسبقاً" تُعيدان 409 CONFLICT.
يوجد أيضاً POST /v1/account/team/leave (لمغادرة المساحة بنفسك) وGET /v1/account/team/me (سجل عضويتك الخاص)، وهما غير موثّقين في مكان آخر من هذه الصفحة.
الخطوات التالية
- مساحات العمل: إدارة إعدادات مساحة العمل
- المصادقة: المصادقة والجلسات
- الفوترة: إدارة الاشتراك والدفع