MailLandDocs
الحساب

إدارة الفريق

دعوة أعضاء الفريق وتعيين الأدوار وإدارة الأذونات داخل مساحة العمل

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

الأدوار

الدورالقيمةالوصف
Owner0وصول كامل، الفوترة، إمكانية نقل الملكية
Admin1وصول كامل باستثناء الفوترة ونقل الملكية
Member2إرسال رسائل البريد الإلكتروني، إدارة النطاقات، عرض التحليلات
Viewer3وصول للقراءة فقط لجميع الموارد

صلاحيات الأدوار

عضو (Member) ليس للقراءة فقط ولا مستبعداً من إدارة المفاتيح، يمكنه إنشاء وتعديل معظم الأشياء. فقط حذف مفاتيح API والنطاقات والويب هوك، بالإضافة إلى إدارة الفريق والملكية، مقصور على Admin.

الصلاحيةOwnerAdminMemberViewer
إرسال رسائل البريد الإلكترونينعمنعمنعملا
إدارة النطاقاتنعمنعمنعملا
إدارة المشتركيننعمنعمنعملا
عرض التحليلاتنعمنعمنعمنعم
إنشاء/تدوير مفاتيح APIنعمنعمنعملا
حذف مفاتيح API / النطاقات / خطافات الويبنعمنعملالا
إنشاء/تعديل خطافات الويبنعمنعمنعملا
تعديل الإعدادات (بما فيها التتبع)نعمنعمنعملا
دعوة الأعضاءنعمنعملالا
إزالة الأعضاءنعمنعملالا
تحديث الأدوارنعمنعملالا
إدارة الفوترةنعملالالا
نقل الملكيةنعملالالا
حذف مساحة العملنعملالالا

نظرة عامة على الفريق

الحصول على أعضاء الفريق الحاليين والدعوات المعلقة:

GET https://api.mail.land/v1/account/team
List team members
curl https://api.mail.land/v1/account/team \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Team overview response
{
  "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
Invite request
{
  "email": "[email protected]",
  "role": 2
}
الحقلالنوعمطلوبالوصف
emailstringنعمعنوان البريد الإلكتروني للدعوة
roleintنعمالدور المُعيَّن (1–3، لا يمكن الدعوة بصفة Owner)
Invite a team member
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"
Invitation info response
{
  "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}
Cancel an invitation
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}/resend
Resend an invitation
curl -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
Update role request
{
  "role": 1
}
Update member role
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. بخلاف ذلك يمكن حذف الجسم بالكامل.

الحقلالقيم
reasonoffboarding, compromise, abuse, other
credentialDecisionrevoke, keep, transfer
transferToMemberIdإلزامي عندما تكون credentialDecision هي transfer
Suspend a member
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}/reactivate
Unsuspend a member
curl -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.

Remove a member
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
Transfer ownership request
{
  "newOwnerMemberId": "mbr_f6g7h8i9j0"
}
Transfer ownership
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).

استجابات الخطأ

الحالةالكودالوصف
400VALIDATION_FAILEDبريد إلكتروني أو دور غير صالح
400INVALID_REQUESTأكثر من 50 دعوة معلقة لهذه المساحة
400CREDENTIAL_DECISION_REQUIREDهدف التعليق/الإزالة يمتلك مفاتيح API نشطة ولم يُرسل credentialDecision
400CREDENTIAL_TRANSFER_TARGET_INVALIDcredentialDecision: transfer مع transferToMemberId مفقود أو غير صالح
403FORBIDDENصلاحيات غير كافية لهذا الإجراء
404RESOURCE_NOT_FOUNDالعضو أو الدعوة غير موجود
400PLAN_LIMIT_REACHEDبلغت مساحة العمل حد المقاعد في خطتها (الدعوة، القبول، إعادة التفعيل، أو أول تسجيل دخول عبر SSO)
409CONFLICTالمستخدم عضو بالفعل، أو لديه دعوة معلقة بالفعل

لا يوجد رمز MEMBER_ALREADY_EXISTS: كل من "عضو بالفعل" و"الدعوة موجودة مسبقاً" تُعيدان 409 CONFLICT.

يوجد أيضاً POST /v1/account/team/leave (لمغادرة المساحة بنفسك) وGET /v1/account/team/me (سجل عضويتك الخاص)، وهما غير موثّقين في مكان آخر من هذه الصفحة.

الخطوات التالية

في هذه الصفحة