MailLandDocs
حساب کاربری

احراز هویت

احراز هویت در API Mail.Land با استفاده از توکن‌های Bearer یا کلیدهای API

MailLand از دو روش احراز هویت پشتیبانی می‌کند: توکن‌های Bearer (JWT) برای نشست‌های کاربری و کلیدهای API برای یکپارچه‌سازی سرور به سرور. تمام درخواست‌های API نیازمند احراز هویت از طریق هدر Authorization هستند.

روش‌های احراز هویت

روشهدرموارد استفاده
توکن BearerAuthorization: Bearer <token>نشست‌های کاربری، داشبورد
کلید APIX-API-Key: <key>سرور به سرور، اتوماسیون

ثبت‌نام

POST https://api.mail.land/v1/auth/register
Registration request
{
  "email": "[email protected]",
  "password": "SecureP@ssw0rd!",
  "fullName": "John Doe",
  "companyName": "My Company"
}
Register
curl -X POST https://api.mail.land/v1/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "password": "SecureP@ssw0rd!",
    "fullName": "John Doe",
    "companyName": "My Company"
  }'
فیلدنوعالزامیتوضیحات
emailstringبلهآدرس ایمیل
passwordstringبلهرمز عبور (۸ تا ۱۲۸ کاراکتر؛ باید شامل حرف بزرگ، حرف کوچک، رقم و کاراکتر خاص باشد)
fullNamestringخیرنام کامل
companyNamestringخیرنام شرکت/فضای کاری

فیلدهای ناشناخته (مثلاً tenantName که به اشتباه ارسال شود) بی‌سروصدا نادیده گرفته می‌شوند.

Registration response
{
  "requiresEmailVerification": true,
  "verificationTicket": "vt_abc123...",
  "maskedEmail": "u***@example.com"
}

کد وضعیت پاسخ ۲۰۱ است.

پس از ثبت‌نام، پیش از ورود به سیستم باید آدرس ایمیل را تأیید کنید.

تأیید ایمیل

ثبت‌نام یک کد ۶ رقمی را ایمیل می‌کند. با بدنه‌ی { "ticket": "<verificationTicket>", "code": "123456" } سراغ POST /v1/auth/verify-email-ticket بروید؛ در صورت موفقیت، پاسخ توکن‌های ورود بازگردانده می‌شود.

POST https://api.mail.land/v1/auth/verify-email-ticket
Verify email request
{
  "ticket": "vt_abc123...",
  "code": "123456"
}
Verify email
curl -X POST https://api.mail.land/v1/auth/verify-email-ticket \
  -H "Content-Type: application/json" \
  -d '{"ticket": "vt_abc123...", "code": "123456"}'

ارسال مجدد ایمیل تأیید: با بدنه‌ی { "ticket": "..." } سراغ POST /v1/auth/resend-verification-ticket بروید. این درخواست نرخ‌محدود است و یک ticket تازه برمی‌گرداند.

POST https://api.mail.land/v1/auth/resend-verification-ticket
Resend verification request
{
  "ticket": "vt_abc123..."
}
Resend verification
curl -X POST https://api.mail.land/v1/auth/resend-verification-ticket \
  -H "Content-Type: application/json" \
  -d '{"ticket": "vt_abc123..."}'

ورود به سیستم

POST https://api.mail.land/v1/auth/login
Login request
{
  "email": "[email protected]",
  "password": "SecureP@ssw0rd!"
}
Login
curl -X POST https://api.mail.land/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "password": "SecureP@ssw0rd!"
  }'

پاسخ

پاسخ ورود بر اساس وضعیت حساب کاربری متفاوت است:

ورود موفق:

Login response
{
  "userId": "v4j2x7n1m9k5p3",
  "email": "[email protected]",
  "fullName": "John Doe",
  "avatarUrl": null,
  "accessToken": "eyJhbGciOiJIUzI1NiIs...",
  "refreshToken": "rt_a1b2c3d4e5...",
  "expiresAt": "2026-09-25T13:00:00Z",
  "requiresTwoFactor": false,
  "twoFactorChallengeId": null,
  "tenantCount": 1,
  "activeTenantId": "k3m9x2p7qw4rtz",
  "activeTenantName": "My Company",
  "requiresEmailVerification": false,
  "verificationTicket": null,
  "maskedEmail": null
}

هیچ آبجکت user و هیچ فیلد role در پاسخ وجود ندارد. حساب تأییدنشده کد ۲۰۰ همراه با requiresEmailVerification: true و یک verificationTicket دریافت می‌کند، نه یک خطا.

نیاز به احراز هویت دو مرحله‌ای:

2FA required response
{
  "accessToken": null,
  "refreshToken": null,
  "requiresTwoFactor": true,
  "twoFactorChallengeId": "2fa_challenge_abc123"
}

هنگامی که requiresTwoFactor برابر true است، پیش از دریافت توکن‌ها، تأیید ۲FA را تکمیل کنید.

تجدید توکن

توکن‌های دسترسی پس از ۶۰ دقیقه منقضی می‌شوند. برای دریافت توکن دسترسی جدید از توکن تجدید استفاده کنید:

POST https://api.mail.land/v1/auth/refresh-token
Refresh token request
{
  "refreshToken": "rt_a1b2c3d4e5..."
}
Refresh token
curl -X POST https://api.mail.land/v1/auth/refresh-token \
  -H "Content-Type: application/json" \
  -d '{"refreshToken": "rt_a1b2c3d4e5..."}'

این پاسخ همان شکل پاسخ ورود بالا (شیء کامل AuthResponse) را دارد، نه فقط این سه فیلد:

Refresh response
{
  "accessToken": "eyJhbGciOiJIUzI1NiIs...",
  "refreshToken": "rt_new_token...",
  "expiresAt": "2026-09-25T14:00:00Z"
}

هر توکن تجدید تنها یک بار قابل استفاده است. پاسخ شامل یک توکن تجدید جدید برای چرخش بعدی می‌باشد.

خروج از سیستم

ابطال نشست جاری:

POST https://api.mail.land/v1/auth/logout

{ "refreshToken": "..." } را در بدنه‌ی درخواست ارسال کنید (یا کوکی refresh token). توکن تازه‌سازی باطل می‌شود؛ توکن دسترسی تا زمان انقضایش معتبر می‌ماند: هدر Bearer به‌تنهایی چیزی را باطل نمی‌کند.

Logout
curl -X POST https://api.mail.land/v1/auth/logout \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

ابطال تمام نشست‌های فعال:

POST https://api.mail.land/v1/auth/revoke-all-tokens
Revoke all sessions
curl -X POST https://api.mail.land/v1/auth/revoke-all-tokens \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

مدیریت رمز عبور

فراموشی رمز عبور

POST https://api.mail.land/v1/auth/forgot-password
Forgot password request
{
  "email": "[email protected]"
}
Forgot password
curl -X POST https://api.mail.land/v1/auth/forgot-password \
  -H "Content-Type: application/json" \
  -d '{"email": "[email protected]"}'

یک ایمیل بازنشانی رمز عبور با یک توکن محدود به زمان ارسال می‌کند.

بازنشانی رمز عبور

POST https://api.mail.land/v1/auth/reset-password

confirmPassword الزامی است و باید با newPassword یکسان باشد؛ همان قوانین پیچیدگی رمز عبور هنگام ثبت‌نام اینجا هم اعمال می‌شود.

Reset password request
{
  "token": "reset-token-from-email",
  "newPassword": "NewSecureP@ssw0rd!",
  "confirmPassword": "NewSecureP@ssw0rd!"
}
Reset password
curl -X POST https://api.mail.land/v1/auth/reset-password \
  -H "Content-Type: application/json" \
  -d '{
    "token": "reset-token-from-email",
    "newPassword": "NewSecureP@ssw0rd!",
    "confirmPassword": "NewSecureP@ssw0rd!"
  }'

اعتبارسنجی توکن بازنشانی

بررسی معتبر بودن توکن بازنشانی پیش از نمایش فرم بازنشانی:

GET https://api.mail.land/v1/auth/validate-reset-token?token=reset-token-from-email
اعتبارسنجی توکن بازنشانی
curl "https://api.mail.land/v1/auth/validate-reset-token?token=reset-token-from-email"
پاسخ اعتبارسنجی توکن
{
  "valid": true,
  "message": "Token is valid"
}

تغییر رمز عبور

تغییر رمز عبور کاربر احراز هویت شده جاری:

POST https://api.mail.land/v1/auth/change-password
Change password request
{
  "currentPassword": "OldP@ssw0rd!",
  "newPassword": "NewSecureP@ssw0rd!"
}
Change password
curl -X POST https://api.mail.land/v1/auth/change-password \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "currentPassword": "OldP@ssw0rd!",
    "newPassword": "NewSecureP@ssw0rd!"
  }'

مدیریت پروفایل

دریافت کاربر جاری

GET https://api.mail.land/v1/auth/me
Get current user
curl https://api.mail.land/v1/auth/me \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Current user response
{
  "id": "v4j2x7n1m9k5p3",
  "email": "[email protected]",
  "fullName": "John Doe",
  "companyName": "Acme",
  "avatarUrl": "https://cdn.mail.land/avatars/usr_a1b2c3d4e5.jpg",
  "status": "Active",
  "createdAt": "2026-01-15T08:00:00Z",
  "subscription": {
    "planName": "Pro",
    "monthlyEmailLimit": 50000,
    "rateLimitPerSecond": 10,
    "startDate": "2026-01-15T08:00:00Z",
    "endDate": "2026-10-15T08:00:00Z",
    "status": "Active"
  },
  "stats": {
    "credentialCount": 3,
    "domainCount": 2
  }
}

هیچ فیلد firstName، lastName، phone، tenantId، role یا twoFactorEnabled در این پاسخ وجود ندارد.

به‌روزرسانی پروفایل

PUT https://api.mail.land/v1/auth/profile

فیلد fullName الزامی است؛ نبودِ companyName باعث پاک‌شدن آن می‌شود. این به‌روزرسانی صرفاً بر اساس شناسهٔ کاربر با ردیف او مطابقت پیدا می‌کند، بنابراین از هر فضای کاری‌ای که کاربر در آن فعال باشد کار می‌کند، نه فقط فضایی که حساب در آن ساخته شده است.

Update profile request
{
  "fullName": "Jane Smith",
  "companyName": "Acme"
}
Update profile
curl -X PUT https://api.mail.land/v1/auth/profile \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{
    "fullName": "Jane Smith",
    "companyName": "Acme"
  }'

آپلود تصویر پروفایل

POST https://api.mail.land/v1/account/avatar

یک درخواست multipart/form-data با فایل تصویر پروفایل ارسال کنید. فرمت‌های پشتیبانی‌شده: JPEG، PNG، GIF یا WebP (محتوای فایل بررسی می‌شود، نه فقط پسوند آن). حداکثر اندازه: ۱ مگابایت.

Upload avatar
curl -X POST https://api.mail.land/v1/account/avatar \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -F "file=@/path/to/avatar.jpg"

احراز هویت اجتماعی

MailLand از ورود اجتماعی از طریق Google، GitHub و Microsoft پشتیبانی می‌کند:

هدایت به ارائه‌دهنده

GET https://api.mail.land/auth/social/{provider}

که {provider} می‌تواند google، github یا microsoft باشد. این endpoint کاربر را به صفحه رضایت OAuth ارائه‌دهنده هدایت می‌کند.

Redirect to social provider
curl https://api.mail.land/auth/social/google

مدیریت callback

پس از تأیید توسط کاربر، ارائه‌دهنده با یک کد مجوز به MailLand بازمی‌گردد:

GET https://api.mail.land/auth/social/{provider}/callback?code=...
Social callback
curl "https://api.mail.land/auth/social/google/callback?code=authorization-code-from-provider"

callback توسط MailLand مدیریت می‌شود که مرورگر را به {frontend}/{locale}/auth/callback?code=<کد یک‌بارمصرف>&provider=... هدایت می‌کند. این code همان کد یک‌بارمصرف خود MailLand است، نه کد مجوز ارائه‌دهنده: آن را بدون تغییر به مرحله‌ی تبادل زیر بدهید.

تبادل برای دریافت توکن

POST https://api.mail.land/v1/auth/social/exchange
Social exchange request
{
  "code": "one-time-code-from-callback-redirect"
}
Exchange social code for tokens
curl -X POST https://api.mail.land/v1/auth/social/exchange \
  -H "Content-Type: application/json" \
  -d '{"code": "one-time-code-from-callback-redirect"}'

همان AuthResponse ورود معمولی را برمی‌گرداند.

حذف حساب کاربری

حذف در سطح فضای کاری انجام می‌شود، نه در سطح حساب کاربر، و فقط یک Owner فضای کاری می‌تواند آن را آغاز کند. این عملیات به‌جای حذف فوری، حذف را پس از یک دوره‌ی مهلت زمان‌بندی می‌کند:

POST https://api.mail.land/v1/account/lifecycle/schedule-deletion
درخواست زمان‌بندی حذف
{
  "gracePeriodDays": 30
}
زمان‌بندی حذف
curl -X POST https://api.mail.land/v1/account/lifecycle/schedule-deletion \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
  -H "Content-Type: application/json" \
  -d '{"gracePeriodDays": 30}'

مقدار gracePeriodDays بین ۷ تا ۹۰ پذیرفته می‌شود (پیش‌فرض ۳۰)؛ مقادیر خارج از این بازه رد نمی‌شوند، بلکه به نزدیک‌ترین حد محدود می‌شوند. حذف زمان‌بندی‌شده را می‌توان هر زمان پیش از پایان دوره‌ی مهلت لغو کرد:

POST https://api.mail.land/v1/account/lifecycle/cancel-deletion

مالکان فضای کاری با POST /v1/account/lifecycle/schedule-deletion (مقدار gracePeriodDays بین ۷ تا ۹۰، پیش‌فرض ۳۰، مقادیر خارج از بازه محدود می‌شوند) حذف را زمان‌بندی می‌کنند و می‌توانند تا پیش از آن با POST /v1/account/lifecycle/cancel-deletion آن را لغو کنند. هیچ endpoint به نام DELETE /v1/auth/delete-account وجود ندارد، و این عملیات به‌ازای هر کاربر نیست، بلکه کل فضای کاری را پس از پایان دوره‌ی مهلت حذف می‌کند.

پاسخ‌های خطا

وضعیتکدتوضیحات
400VALIDATION_FAILEDدرخواست ثبت‌نام اعتبارسنجی را رد کرد، همراه با آرایه‌ی errors[]
401UNAUTHORIZEDایمیل یا رمز عبور اشتباه
403FORBIDDENحساب غیرفعال است
409CONFLICTاین ایمیل قبلاً ثبت شده است
429TOO_MANY_LOGIN_ATTEMPTSتلاش‌های ناموفق ورود بیش از حد؛ پاسخ شامل هدر Retry-After است

ایمیل تأییدنشده خطایی برنمی‌گرداند: ورود با کد ۲۰۰ همراه با requiresEmailVerification: true و یک verificationTicket تازه پاسخ می‌دهد.

مراحل بعدی

در این صفحه