MailLandDocs
وب‌هوک‌ها

رویدادهای Webhook

مرجع کامل تمام انواع رویدادهای webhook و payloadهای آن‌ها

کاتالوگ رویدادهای MailLand، ۲۱ نوع رویداد در ۶ دسته را تعریف می‌کند (۲ مورد از این ۲۱ مورد، اعلان‌های پلتفرم هستند که نمی‌توانید در آن‌ها مشترک شوید). هر رویداد به‌صورت یک درخواست HTTP POST امضاشده به endpoint وب‌هوک شما تحویل داده می‌شود.

هنوز همهٔ رویدادهای فهرست‌شده در کاتالوگ فعال نشده‌اند. امروز نه رویداد فعال و قابل اشتراک هستند: message.delivered، message.deferred، message.bounced، message.failed، message.complained، message.outcome_unknown، message.retried، message.unsubscribed و inbound.received. بقیه مستند و رزرو شده‌اند و امروز در هیچ اشتراکی پذیرفته نمی‌شوند: اگر یکی از آن‌ها را بگنجانید، API پاسخ 400 برمی‌گرداند. endpoint کاتالوگ این وضعیت را برای هر رویداد با availableNow و customerSelectable گزارش می‌کند؛ به‌جای نوشتن یک فهرست ثابت، همین فیلدها را بخوانید.

کاتالوگ رویداد

کاتالوگ کامل رویدادها را به‌صورت برنامه‌نویسی‌شده دریافت کنید:

GET https://api.mail.land/v1/webhooks/catalog
Get event catalog
curl -X GET https://api.mail.land/v1/webhooks/catalog
Catalog response (abbreviated)
{
  "version": 1,
  "products": [
    { "id": "transactional", "name": "Transactional Email", "isActive": true, "comingSoon": false },
    { "id": "marketing", "name": "Marketing Email", "isActive": true, "comingSoon": false },
    { "id": "inbound", "name": "Inbound Email", "isActive": true, "comingSoon": false },
    { "id": "system", "name": "System Events", "isActive": true, "comingSoon": false },
    { "id": "validation", "name": "Email Validation", "isActive": false, "comingSoon": true }
  ],
  "categories": [
    {
      "id": "message",
      "name": "Message Events",
      "events": [
        { "id": "message.sent", "name": "Message Sent", "products": ["transactional", "marketing"] },
        { "id": "message.delivered", "name": "Message Delivered", "products": ["transactional", "marketing"] }
      ]
    }
  ]
}

این endpoint عمومی است (نیازی به احراز هویت ندارد) و همیشه آخرین نسخهٔ کاتالوگ را برمی‌گرداند.

ساختار استاندارد Payload

هر تحویل وب‌هوک یک ساختار بیرونی یکسان دارد:

Standard payload
{
  "event": "message.delivered",
  "event_id": "evt_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5",
  "timestamp": "2026-02-17T12:34:56.789Z",
  "occurred_at": "2026-02-17T12:34:56.120Z",
  "schema_version": 1,
  "data": {
    // Event-specific fields
  }
}
فیلدنوعتوضیحات
eventstringشناسهٔ نوع رویداد
event_idstringشناسهٔ یکتای رویداد برای حذف تکرار (قالب: evt_{32chars})
timestampdatetimeلحظه‌ای که وب‌هوک در صف قرار گرفت (UTC)؛ نه لحظه‌ای که خودِ رویداد رخ داده. برای آن به data.timestamp نگاه کنید.
occurred_atdatetimeلحظهٔ رخ‌دادن خودِ رویداد (UTC)؛ در رویدادهای پیام همان لحظهٔ data.timestamp
schema_versionintegerنسخهٔ طرح‌وارهٔ این نوع رویداد (امروز 1)؛ در X-MLND-Event-Version هم می‌آید. نسخه‌بندی را ببینید
dataobjectدادهٔ اختصاصی هر رویداد

بخش data هر رویداد پیام همچنین status_version، status، previous_status، complaint_status و reason را دارد، بخش نسخه‌های وضعیت را ببینید.

نسخه‌های وضعیت

هر رویداد پیام فیلدهای data.status_version، data.status، data.previous_status، data.complaint_status و data.reason را دارد. هر بار که MailLand برای تغییری در وضعیت پیام، دلیل آن یا وضعیت شکایت آن رویدادی می‌فرستد، status_version یک واحد افزایش می‌یابد.

دو استثنا:

  • پیام تا وقتی queued یا sent است با status_version برابر 0 شروع می‌شود. گذر از queued به sent هیچ رویدادی نمی‌فرستد و نسخه را تغییر نمی‌دهد.
  • چند رویداد message.deferred می‌توانند یک status_version مشترک داشته باشند: تأخیر تکراری وضعیت را تغییر نمی‌دهد.

وب‌هوک‌ها ممکن است بی‌ترتیب برسند و دوباره ارسال شوند؛ پس آن‌ها را بر اساس status_version اعمال کنید، هرگز بر اساس ترتیب رسیدن.

وضعیت ممکن است پس از نهایی شدن تغییر کند. MailLand هر چه را می‌داند همان وقت که می‌داند گزارش می‌کند. اگر بعداً اطلاعات بیشتری به دست آورد، وضعیت جدید را با status_version بالاتر می‌فرستد:

  • پیامی که تحویل شده، ممکن است بعداً برگشت بخورد؛ وقتی سرور گیرنده آن را پس از پذیرش رد کند (برگشت خارج از جلسه)؛
  • پس از یک خرابی داخلی، یا پس از بازگشت سرور ایمیل MailLand به کار، ممکن است تحویل یا رد شدن پیام با تأخیر گزارش شود. در این حالت پیام failed می‌تواند bounced یا delivered شود، پیام bounced می‌تواند delivered شود و پیام unknown می‌تواند به هر وضعیت نهایی برسد.

هیچ پیامی از delivered به failed نمی‌رود. MailLand این اصلاح‌ها را شمارش می‌کند.

فیلدنوعتوضیحات
status_versionintegerنسخه‌ای از وضعیت پیام که این رویداد توصیف می‌کند.
statusstringوضعیت پیام در این نسخه: queued، sent، deferred، unknown، delivered، bounced یا failed.
previous_statusstring یا nullوضعیت پیش از این تغییر؛ پیش از نخستین تغییر null.
complaint_statusstringnone یا complained.
reasonstring یا nullدلیل برگشت یا شکست برای bounced، failed و unknown؛ در غیر این صورت null.

مهلت‌های تلاش دوباره

MailLand پیام به‌تأخیرافتاده را تا مهلت تلاش دوباره آن دوباره امتحان می‌کند: برای ایمیل تراکنشی حدود ۵ ساعت پس از نخستین تحویل آن به صف تحویل، و برای ایمیل بازاریابی حدود ۲۵ ساعت. پس از این مهلت، MailLand پیام را برای هیچ تلاش تحویل تازه‌ای در صف قرار نمی‌دهد. نسخه‌ای که هنگام رسیدن مهلت از قبل در انتظار اتصال بوده، ممکن است پس از آن هم امتحان شود. این‌ها مهلت‌های تلاش دوباره‌اند و وعده‌ای دربارهٔ زمان دریافت رویداد نهایی نیستند. هر رویداد را وقتی دریافت می‌کنید که نتیجه به MailLand برسد؛ این تأخیر هنوز اندازه‌گیری نشده و در زمان قطعی داخلی ممکن است طولانی‌تر باشد. پیامی که MailLand نتوانسته ظرف ۲۴ ساعت به صف تحویل خود بدهد، با expired پایان می‌یابد.

اگر وضعیت فعلی پیام را از وب‌هوک‌ها نگه می‌دارید (اقدام لازم است)

این یک تغییر رفتار برای یکپارچه‌سازی‌های موجود است. یکپارچه‌سازی‌ای که message.failed یا message.delivered را دائمی می‌داند و رویدادهای بعدی را نادیده می‌گیرد، ممکن است پس از یک اصلاح، وضعیت نادرستی را نگه دارد. نام رویدادهایی که از قبل وجود داشتند اکنون ترتیب‌های ممکن تازه‌ای دارند.

  • در همهٔ رویدادهای پیام مشترک شوید: message.delivered، message.deferred، message.bounced، message.failed، message.complained، message.outcome_unknown و message.retried. فقط در این صورت رویدادهایی که دریافت می‌کنید همهٔ تغییرهای وضعیت را در بر دارند.
  • status_version را همراه وضعیت ذخیره کنید. رویداد را فقط وقتی اعمال کنید که status_version آن از مقدار ذخیره‌شده بیشتر باشد؛ رویداد message.deferred با نسخهٔ برابر چیزی را تغییر نمی‌دهد.
  • پس از message.failed، message.bounced یا message.delivered هم پردازش رویدادها را ادامه دهید: رویداد بعدی با status_version بالاتر جای وضعیت قبلی را می‌گیرد.
  • وقتی همهٔ رویدادها را تا status_version اعلام‌شده در API دریافت کرده باشید، وضعیت شما با وضعیت API برابر است. ممکن است API از وب‌هوک‌هایی که تاکنون دریافت کرده‌اید جلوتر باشد و در status_version برابر 0 بدون هیچ رویدادی sent نشان دهد.

اگر فقط در برخی رویدادهای پیام مشترک هستید، بالاترین status_version دریافتی لزوماً وضعیت فعلی نیست: ممکن است نوع رویدادی که در آن مشترک نیستید وضعیت را تغییر داده باشد. وضعیت فعلی را از API بخوانید، برای مثال برای هر پیامی که آخرین رویداد دریافتی آن message.failed، message.bounced یا message.outcome_unknown است، و تطبیق دهید.

اگر نمی‌توانید یکپارچه‌سازی خود را تغییر دهید، وضعیت پیام‌هایی را که برایتان مهم است از API بپرسید. یکپارچه‌سازی‌هایی که فقط رویدادها را می‌شمارند یا فقط تاریخچه نشان می‌دهند به تغییری نیاز ندارند.

رویدادهای پیام

message.sent

نمایشی؛ هنوز صادر نمی‌شود. این رویداد در کاتالوگ ثبت شده اما امروز هیچ تولیدکننده‌ای ندارد.

message.sent (illustrative)
{
  "event": "message.sent",
  "event_id": "evt_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5",
  "timestamp": "2026-02-17T12:34:56.789Z",
  "data": {
    "message_id": "t_a1b2c3d4e5f6",
    "recipient": "[email protected]",
    "timestamp": "2026-02-17T12:34:56.789Z"
  }
}

message.delivered

وقتی ایمیل با موفقیت به سرور ایمیل گیرنده تحویل داده شود، صادر می‌شود.

این رویداد ممکن است به‌عنوان اصلاح، پس از یک وضعیت نهایی قبلی برای همان پیام هم برسد. بخش نسخه‌های وضعیت را ببینید.

message.delivered
{
  "event": "message.delivered",
  "event_id": "evt_b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
  "timestamp": "2026-02-17T12:34:58.123Z",
  "data": {
    "message_id": "t_a1b2c3d4e5f6",
    "recipient": "[email protected]",
    "timestamp": "2026-02-17T12:34:58.123Z",
    "smtp_response": "OK",
    "status_version": 1,
    "status": "delivered",
    "previous_status": "sent",
    "complaint_status": "none",
    "reason": null
  }
}

message.deferred

وقتی تحویل موقتاً به تأخیر بیفتد، صادر می‌شود. MailLand به‌طور خودکار دوباره تلاش می‌کند.

پیام ممکن است چند بار به تأخیر بیفتد. نخستین تأخیر status_version را افزایش می‌دهد؛ تأخیرهای تکراری همان status_version را دارند.

message.deferred
{
  "event": "message.deferred",
  "event_id": "evt_c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7",
  "timestamp": "2026-02-17T12:35:00.000Z",
  "data": {
    "message_id": "t_a1b2c3d4e5f6",
    "recipient": "[email protected]",
    "timestamp": "2026-02-17T12:35:00.000Z",
    "smtp_response": "Try again later",
    "bounce_reason": "TransientFailure"
  }
}

message.bounced

وقتی ایمیلی برگشت بخورد (برگشت سخت یا نرم)، صادر می‌شود.

این رویداد ممکن است به‌عنوان اصلاح، پس از یک وضعیت نهایی قبلی برای همان پیام هم برسد. بخش نسخه‌های وضعیت را ببینید.

message.bounced
{
  "event": "message.bounced",
  "event_id": "evt_d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8",
  "timestamp": "2026-02-17T12:35:01.000Z",
  "data": {
    "message_id": "t_a1b2c3d4e5f6",
    "recipient": "[email protected]",
    "timestamp": "2026-02-17T12:35:01.000Z",
    "bounce_type": "hard",
    "bounce_reason": "InvalidRecipient",
    "smtp_response": "The email account that you tried to reach does not exist.",
    "status_version": 1,
    "status": "bounced",
    "previous_status": "sent",
    "complaint_status": "none",
    "reason": "InvalidRecipient"
  }
}

bounce_reason همان توکن طبقه‌بندی است که MailLand به بازگشت اختصاص می‌دهد (مانند InvalidRecipient، QuotaIssues، SpamBlock)، نه متن خام SMTP؛ برای آن از smtp_response استفاده کنید. bounce_type یکی از مقادیر hard، soft، blocked یا unknown است.

smtp_response متن پاسخ سرور گیرنده است، بدون کد عددی پاسخ و کد وضعیت تکمیلی. bounce_type نشان می‌دهد MailLand با این نشانی چه کرد: hard، برای همهٔ ایمیل‌ها مسدود شد؛ soft، برای ایمیل‌های بازاریابی به مدت ۳۰ روز مسدود شد؛ blocked، رد شدن دربارهٔ ارسال بود نه نشانی (مثلاً فیلتر اسپم، احراز هویت فرستنده، اعتبار یا سیاست گیرنده)، پس هیچ مسدودسازی‌ای ثبت نمی‌شود؛ unknown، طبقه‌بندی‌ای وجود ندارد و مانند soft با آن رفتار می‌شود.

message.failed

وقتی صادر می‌شود که MailLand پیامی را بر پایهٔ شواهد قطعی مبنی بر تحویل نشدن آن پایان دهد، به دلیلی از سمت MailLand و نه از سمت گیرنده. در حالت‌هایی که در بخش نسخه‌های وضعیت آمده، ممکن است پس از آن رویداد message.delivered یا message.bounced با status_version بالاتر برسد. وضعیت پیام Failed می‌شود، نه Bounced، و فیلد reason حالت را مشخص می‌کند:

دلیلچه اتفاقی افتاد
dkim_revokedپیام در صف تحویل MailLand منتظر بوده و با کلید DKIM امضا شده که MailLand بعداً آن را برای دامنهٔ فرستنده به‌صورت اضطراری ابطال کرده است (برای نمونه پس از احتمال افشای کلید). MailLand چنین پیامی را هرگز تحویل نمی‌دهد و دوباره امضا نمی‌کند. پیام در تلاش بعدی منقضی می‌شود: برای ایمیل تراکنشی حداکثر حدود ۳۰ دقیقه و برای ایمیل بازاریابی ۴ ساعت.
admin_bounceیکی از اپراتورهای MailLand پیام را از صف تحویل MailLand حذف کرده است.
dkim_key_revokedدامنهٔ فرستنده زیر توقف اضطراری DKIM است، پس MailLand پیام را پیش از ورود به صف تحویل رد کرده است.
inject_failedصف تحویل MailLand پیام را به‌طور قطعی نپذیرفته و پیام هیچ‌وقت برای تحویل در صف قرار نگرفته است.
expiredMailLand پیام را پذیرفته اما ظرف ۲۴ ساعت آن را به صف تحویل خود نداده، پس بدون ارسال، پیام را پایان داده است.
template_variable_missingپیام یک جایگزین {{name}} داشت که برای این گیرنده مقداری نداشت، پس MailLand آن را با همان جایگزین خام نفرستاد.
  • گیرنده مسدود نمی‌شود و این شکست در نرخ برگشت شما حساب نمی‌شود.
  • هر پیام حداکثر یک رویداد message.failed تولید می‌کند. این آخرین رویداد آن پیام است، مگر آنکه MailLand بعداً تحویل یا رد شدن پیام را دریافت کند؛ در آن صورت message.delivered یا message.bounced با status_version بالاتر می‌رسد.

رد شدن پیام از سوی سرور ایمیل گیرنده به‌صورت message.bounced گزارش می‌شود، هرگز به‌صورت message.failed.

message.failed
{
  "event": "message.failed",
  "event_id": "evt_e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0",
  "timestamp": "2026-09-28T02:00:19.1047332Z",
  "data": {
    "message_id": "t_a1b2c3d4e5f6",
    "recipient": "[email protected]",
    "timestamp": "2026-09-28T02:00:18.2522997Z",
    "reason": "dkim_revoked",
    "smtp_response": "Next delivery time PT3.028008S > PT1S",
    "status_version": 1,
    "status": "failed",
    "previous_status": "sent",
    "complaint_status": "none"
  }
}
فیلدتوضیح
reasonدلیلی که MailLand پیام را پایان داد: یکی از مقدارهای بالا. هر مقدار دیگری را دلیل تازه‌ای از سمت MailLand در نظر بگیرید.
smtp_responseمتنی از صف تحویل خود MailLand، اگر وجود داشته باشد (dkim_revoked، admin_bounce، inject_failed)؛ در غیر این صورت null. فقط جنبهٔ اطلاعاتی دارد و هیچ‌وقت پاسخ سرور گیرنده نیست.

message.outcome_unknown

وقتی صادر می‌شود که MailLand نتواند تعیین کند پیامی به صف تحویل آن رسیده است یا نه؛ برای مثال چون تحویل پیام به صف قطع شده و پس از آن قابل احراز نبوده است. این رویداد مدتی پس از مهلت تلاش دوبارهٔ پیام، در حال حاضر ۷ روز، فرستاده می‌شود، اگر تا آن زمان هیچ شاهدی نرسیده باشد. این وضعیت نهایی نیست. وضعیت unknown می‌شود. اگر MailLand بعداً نتیجه را بداند، message.delivered، message.bounced یا message.failed را با status_version بالاتر دریافت می‌کنید.

message.outcome_unknown
{
  "event": "message.outcome_unknown",
  "event_id": "evt_0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d",
  "timestamp": "2026-10-08T17:05:00.000Z",
  "data": {
    "message_id": "t_a1b2c3d4e5f6",
    "recipient": "[email protected]",
    "timestamp": "2026-10-08T17:05:00.000Z",
    "status_version": 1,
    "status": "unknown",
    "previous_status": "queued",
    "complaint_status": "none",
    "reason": "handoff_undetermined"
  }
}

message.retried

وقتی صادر می‌شود که پیامی را که برگشت خورده یا ناموفق بوده دوباره ارسال کنید و MailLand آن را دوباره در صف قرار دهد. وضعیت queued می‌شود و status_version افزایش می‌یابد؛ رویدادهای نسخهٔ دوباره‌ارسال‌شده با نسخه‌های بالاتر می‌آیند. این وضعیت نهایی نیست.

message.retried
{
  "event": "message.retried",
  "event_id": "evt_1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e",
  "timestamp": "2026-10-01T18:00:00.000Z",
  "data": {
    "message_id": "t_a1b2c3d4e5f6",
    "recipient": "[email protected]",
    "timestamp": "2026-10-01T18:00:00.000Z",
    "attempt": 1,
    "status_version": 2,
    "status": "queued",
    "previous_status": "bounced",
    "complaint_status": "none",
    "reason": null
  }
}

رویدادهای تعامل

message.opened و message.clicked در کاتالوگ ثبت شده‌اند، اما نه توسط مشتری قابل‌انتخاب‌اند و نه امروز صادر می‌شوند. نمی‌توانید در آن‌ها مشترک شوید؛ تلاش برای انتخابشان هنگام ایجاد یا به‌روزرسانی، با خطای 400 "One or more invalid events selected" رد می‌شود. مثال‌های زیر فقط جنبهٔ نمایشی دارند.

message.opened

نمایشی؛ در دسترس نیست.

message.opened (illustrative)
{
  "event": "message.opened",
  "event_id": "evt_f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0",
  "timestamp": "2026-02-17T13:15:00.000Z",
  "data": {
    "message_id": "t_a1b2c3d4e5f6",
    "recipient": "[email protected]",
    "timestamp": "2026-02-17T13:15:00.000Z"
  }
}

message.clicked

نمایشی؛ در دسترس نیست.

message.clicked (illustrative)
{
  "event": "message.clicked",
  "event_id": "evt_g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1",
  "timestamp": "2026-02-17T13:16:00.000Z",
  "data": {
    "message_id": "t_a1b2c3d4e5f6",
    "recipient": "[email protected]",
    "timestamp": "2026-02-17T13:16:00.000Z"
  }
}

message.unsubscribed

زمانی ارسال می‌شود که گیرنده از پیامی که فرستاده‌اید لغو اشتراک کند: از طریق سرایند List-Unsubscribe یا نشانی mailto: آن، درخواست POST تک‌کلیکی، پیوند لغو اشتراک یا صفحهٔ ترجیحات. برای لغو اشتراکی که خودتان از طریق API یا داشبورد انجام می‌دهید و برای شکایت اسپم (message.complained) ارسال نمی‌شود. این رویداد برای هر پیام یک‌بار و در همان لحظه‌ای که گیرنده از دریافت خارج می‌شود، به هر نقطهٔ پایانی مشترک آن ارسال می‌شود. مانند هر رویداد پیام، data فیلدهای وضعیت فعلی پیام را هم دارد (بخش نسخه‌های وضعیت را ببینید).

message.unsubscribed
{
  "event": "message.unsubscribed",
  "event_id": "evt_h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2",
  "timestamp": "2026-02-17T14:00:00.000Z",
  "data": {
    "message_id": "m_a1b2c3d4e5f6",
    "recipient": "[email protected]",
    "timestamp": "2026-02-17T14:00:00.000Z",
    "status_version": 3,
    "status": "delivered",
    "previous_status": "queued",
    "complaint_status": "none",
    "reason": null
  }
}

رویدادهای سرکوب

message.complained

وقتی گیرنده ایمیل را به‌عنوان اسپم علامت‌گذاری کند (از طریق حلقهٔ بازخورد ISP)، صادر می‌شود.

message.complained
{
  "event": "message.complained",
  "event_id": "evt_i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3",
  "timestamp": "2026-02-17T15:00:00.000Z",
  "data": {
    "message_id": "m_a1b2c3d4e5f6",
    "recipient": "[email protected]",
    "timestamp": "2026-02-17T15:00:00.000Z",
    "feedback_type": "abuse"
  }
}

نرخ شکایتِ بالای ۰٫۱٪ می‌تواند به اعتبار فرستندهٔ شما آسیب بزند. رویدادهای message.complained را از نزدیک زیر نظر بگیرید و مطمئن شوید فقط برای گیرندگانی ایمیل می‌فرستید که رضایت داده‌اند.

suppression.added

نمایشی؛ هنوز صادر نمی‌شود. این رویداد در کاتالوگ ثبت شده اما امروز هیچ تولیدکننده‌ای ندارد.

suppression.added (illustrative)
{
  "event": "suppression.added",
  "event_id": "evt_j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4",
  "timestamp": "2026-02-17T15:00:01.000Z",
  "data": {
    "email": "[email protected]",
    "type": "complaint",
    "scope": "global",
    "reason": "Spam complaint via ISP feedback loop"
  }
}

suppression.removed

نمایشی؛ هنوز صادر نمی‌شود. این رویداد در کاتالوگ ثبت شده اما امروز هیچ تولیدکننده‌ای ندارد.

suppression.removed (illustrative)
{
  "event": "suppression.removed",
  "event_id": "evt_k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5",
  "timestamp": "2026-02-17T16:00:00.000Z",
  "data": {
    "email": "[email protected]",
    "type": "manual",
    "scope": "global"
  }
}

رویدادهای ورودی

inbound.received

وقتی ایمیل ورودی روی یکی از دامنه‌های شما دریافت شود، صادر می‌شود.

این رویداد مانند همهٔ رویدادهای دیگر این صفحه از پاکت استاندارد استفاده می‌کند: event_id با X-MLND-Event-Id برابر است و در تلاش‌های مجدد ثابت می‌ماند، occurred_at زمان دریافت ایمیل است و فیلدهای ورودی زیر data قرار دارند. id هر پیوست در تلاش‌های مجدد ثابت است؛ download_url آن در هر تلاش تازه است. مرجع فیلدها: وب‌هوک‌های ورودی.

inbound.received
{
  "event": "inbound.received",
  "event_id": "evt_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
  "timestamp": "2026-02-17T12:00:00.000Z",
  "occurred_at": "2026-02-17T12:00:00.000Z",
  "schema_version": 1,
  "data": {
    "idempotency_key": "r7n2k5x9m1p4w6_s5m3x8k1p7n4w2",
    "email": {
      "id": "r7n2k5x9m1p4w6",
      "received_at": "2026-02-17T12:00:00.000Z",
      "size_bytes": 4521,
      "envelope": {
        "from": "[email protected]",
        "to": ["[email protected]"]
      },
      "headers": {
        "from": { "address": "[email protected]", "name": "Jane Doe" },
        "to": [{ "address": "[email protected]" }],
        "subject": "Help with my order",
        "message_id": "<[email protected]>",
        "date": "2026-02-17T11:59:50.000Z"
      },
      "body": {
        "text_preview": "Hi, I need help with...",
        "has_text": true,
        "has_html": true
      },
      "attachments": [],
      "authentication": {
        "spf": { "result": "pass" },
        "dkim": { "result": "pass" },
        "dmarc": { "result": "pass" }
      },
      "spam": {
        "score": 0.1,
        "is_spam": false,
        "reason": null
      },
      "source": {
        "ip": "203.0.113.10",
        "hostname": "mail.external.com"
      }
    },
    "matched_route": {
      "id": "s5m3x8k1p7n4w2",
      "name": "Support inbox"
    }
  }
}

رویدادهای حساب

account.webhook_paused

صادر نمی‌شود. توقف خودکار واقعی است و همان‌طور که در منطق تلاش مجدد توضیح داده شده رخ می‌دهد، اما از طریق فیلدهای خودِ وب‌هوک یعنی pausedAt و pausedReason و یک اعلان درون‌برنامه‌ای اطلاع‌رسانی می‌شود؛ نه به‌شکل یک رویداد وب‌هوک. فرستادن پیام «endpoint شما دیگر کار نمی‌کند» به همان endpoint وب‌هوک، ذاتاً غیرقابل‌اتکاست، و به‌هرحال هیچ اشتراکی امروز نمی‌تواند این رویداد را در خود داشته باشد.

وقتی وب‌هوکی به‌دلیل شکست‌های پیاپی به‌طور خودکار متوقف شود، صادر می‌شود.

account.webhook_paused
{
  "event": "account.webhook_paused",
  "event_id": "evt_m3n4o5p6q7r8s9t0u1v2w3x4y5z6a7",
  "timestamp": "2026-02-17T18:00:00.000Z",
  "data": {
    "webhook_id": "z8m3p1k6x4w2n7",
    "webhook_name": "Production Events",
    "consecutive_failures": 10,
    "last_error": "Connection refused"
  }
}

account.domain_verified

نمایشی؛ هنوز صادر نمی‌شود. این رویداد در کاتالوگ ثبت شده اما امروز هیچ تولیدکننده‌ای ندارد.

account.domain_verified (illustrative)
{
  "event": "account.domain_verified",
  "event_id": "evt_n4o5p6q7r8s9t0u1v2w3x4y5z6a7b8",
  "timestamp": "2026-02-17T10:15:00.000Z",
  "data": {
    "domain_id": "q3z8v1k6m9p2x5",
    "domain": "yourdomain.com"
  }
}

account.domain_failed

نمایشی؛ هنوز صادر نمی‌شود. این رویداد در کاتالوگ ثبت شده اما امروز هیچ تولیدکننده‌ای ندارد.

account.domain_failed (illustrative)
{
  "event": "account.domain_failed",
  "event_id": "evt_o5p6q7r8s9t0u1v2w3x4y5z6a7b8c9",
  "timestamp": "2026-02-17T10:15:00.000Z",
  "data": {
    "domain_id": "q3z8v1k6m9p2x5",
    "domain": "yourdomain.com",
    "reason": "DKIM record not found for selector mlnd"
  }
}

account.quota_warning

نمایشی؛ هنوز صادر نمی‌شود. این رویداد در کاتالوگ ثبت شده اما امروز هیچ تولیدکننده‌ای ندارد.

account.quota_warning (illustrative)
{
  "event": "account.quota_warning",
  "event_id": "evt_p6q7r8s9t0u1v2w3x4y5z6a7b8c9d0",
  "timestamp": "2026-02-17T20:00:00.000Z",
  "data": {
    "used": 45000,
    "limit": 50000,
    "percentage": 90
  }
}

account.quota_exceeded

نمایشی؛ هنوز صادر نمی‌شود. این رویداد در کاتالوگ ثبت شده اما امروز هیچ تولیدکننده‌ای ندارد.

account.quota_exceeded (illustrative)
{
  "event": "account.quota_exceeded",
  "event_id": "evt_q7r8s9t0u1v2w3x4y5z6a7b8c9d0e1",
  "timestamp": "2026-02-17T22:00:00.000Z",
  "data": {
    "used": 50000,
    "limit": 50000,
    "percentage": 100
  }
}

خلاصه رویدادها

«در دسترس» همان فلگ availableNow کاتالوگ است: این‌که آیا امروز چیزی واقعاً این رویداد را صادر می‌کند یا نه. فقط رویدادهای در دسترس را می‌توان در یک اشتراک گنجاند.

رویداددر دسترسمحصولاتمحدود به دامنهتوضیحات
message.deliveredبلهtransactional, marketingبلهبا موفقیت تحویل داده‌شده
message.deferredبلهtransactional, marketingبلهموقتاً به تأخیر افتاده
message.bouncedبلهtransactional, marketingبلهبرگشت سخت یا نرم
message.failedبلهtransactional, marketingبلهپایان‌یافته به دست MailLand بر پایهٔ شواهد قطعی، به دلیلی از سمت MailLand؛ ممکن است اصلاحی پس از آن بیاید (نسخه‌های وضعیت را ببینید)
message.outcome_unknownبلهtransactional, marketingبلهMailLand نتوانست تعیین کند پیام به صف تحویل رسیده است یا نه؛ نهایی نیست
message.retriedبلهtransactional, marketingبلهپیام برگشتی یا ناموفق دوباره ارسال شده و دوباره در صف است؛ نهایی نیست
message.complainedبلهtransactional, marketingبلهعلامت‌گذاری‌شده به‌عنوان اسپم
inbound.receivedبلهinboundبلهایمیل ورودی دریافت شد
message.sentهنوز نهtransactional, marketingبلهایمیل پذیرفته و صف‌بندی شد
message.openedهنوز نهtransactional, marketingبلهپیکسل ردیابی بارگذاری شد
message.clickedهنوز نهtransactional, marketingبلهروی لینک کلیک شد
message.unsubscribedبلهtransactional, marketingبلهگیرنده لغو اشتراک کرد
suppression.addedهنوز نهtransactional, marketingخیربه فهرست سرکوب افزوده شد
suppression.removedهنوز نهtransactional, marketingخیراز فهرست سرکوب حذف شد
account.webhook_pausedهنوز نهsystemخیروب‌هوک به‌طور خودکار متوقف شد
account.domain_verifiedهنوز نهsystemخیردامنه تأیید شد
account.domain_failedهنوز نهsystemخیرتأیید دامنه شکست خورد
account.quota_warningهنوز نهsystemخیرنزدیک شدن به سقف سهمیه
account.quota_exceededهنوز نهsystemخیرسهمیه تمام شد

رویدادهای آینده

وقتی includeFutureEvents مقدار true داشته باشد (مقدار پیش‌فرض)، وب‌هوک شما به‌طور خودکار نوع‌های جدید رویداد را همزمان با افزوده‌شدن به محصولات مشترک‌شده‌تان دریافت می‌کند. برای قفل‌کردن اشتراک خود روی مجموعهٔ فعلی رویدادها، آن را روی false تنظیم کنید.

رویدادهایی که در بالا با برچسب «هنوز نه» مشخص شده‌اند، هروقت تولیدکنندهٔ آن‌ها راه‌اندازی شود قابل‌اشتراک می‌شوند: نام رویدادها و ساختار payload مستندشده در این صفحه در آن زمان تغییر نخواهد کرد.

مراحل بعدی

در این صفحه