رویدادهای 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/catalogcurl -X GET https://api.mail.land/v1/webhooks/catalog{
"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
هر تحویل وبهوک یک ساختار بیرونی یکسان دارد:
{
"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
}
}| فیلد | نوع | توضیحات |
|---|---|---|
event | string | شناسهٔ نوع رویداد |
event_id | string | شناسهٔ یکتای رویداد برای حذف تکرار (قالب: evt_{32chars}) |
timestamp | datetime | لحظهای که وبهوک در صف قرار گرفت (UTC)؛ نه لحظهای که خودِ رویداد رخ داده. برای آن به data.timestamp نگاه کنید. |
occurred_at | datetime | لحظهٔ رخدادن خودِ رویداد (UTC)؛ در رویدادهای پیام همان لحظهٔ data.timestamp |
schema_version | integer | نسخهٔ طرحوارهٔ این نوع رویداد (امروز 1)؛ در X-MLND-Event-Version هم میآید. نسخهبندی را ببینید |
data | object | دادهٔ اختصاصی هر رویداد |
بخش 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_version | integer | نسخهای از وضعیت پیام که این رویداد توصیف میکند. |
status | string | وضعیت پیام در این نسخه: queued، sent، deferred، unknown، delivered، bounced یا failed. |
previous_status | string یا null | وضعیت پیش از این تغییر؛ پیش از نخستین تغییر null. |
complaint_status | string | none یا complained. |
reason | string یا 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
نمایشی؛ هنوز صادر نمیشود. این رویداد در کاتالوگ ثبت شده اما امروز هیچ تولیدکنندهای ندارد.
{
"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
وقتی ایمیل با موفقیت به سرور ایمیل گیرنده تحویل داده شود، صادر میشود.
این رویداد ممکن است بهعنوان اصلاح، پس از یک وضعیت نهایی قبلی برای همان پیام هم برسد. بخش نسخههای وضعیت را ببینید.
{
"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 را دارند.
{
"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
وقتی ایمیلی برگشت بخورد (برگشت سخت یا نرم)، صادر میشود.
این رویداد ممکن است بهعنوان اصلاح، پس از یک وضعیت نهایی قبلی برای همان پیام هم برسد. بخش نسخههای وضعیت را ببینید.
{
"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 پیام را بهطور قطعی نپذیرفته و پیام هیچوقت برای تحویل در صف قرار نگرفته است. |
expired | MailLand پیام را پذیرفته اما ظرف ۲۴ ساعت آن را به صف تحویل خود نداده، پس بدون ارسال، پیام را پایان داده است. |
template_variable_missing | پیام یک جایگزین {{name}} داشت که برای این گیرنده مقداری نداشت، پس MailLand آن را با همان جایگزین خام نفرستاد. |
- گیرنده مسدود نمیشود و این شکست در نرخ برگشت شما حساب نمیشود.
- هر پیام حداکثر یک رویداد
message.failedتولید میکند. این آخرین رویداد آن پیام است، مگر آنکه MailLand بعداً تحویل یا رد شدن پیام را دریافت کند؛ در آن صورتmessage.deliveredیاmessage.bouncedباstatus_versionبالاتر میرسد.
رد شدن پیام از سوی سرور ایمیل گیرنده بهصورت message.bounced گزارش میشود، هرگز بهصورت 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 بالاتر دریافت میکنید.
{
"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 افزایش مییابد؛ رویدادهای نسخهٔ دوبارهارسالشده با
نسخههای بالاتر میآیند. این وضعیت نهایی نیست.
{
"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
نمایشی؛ در دسترس نیست.
{
"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
نمایشی؛ در دسترس نیست.
{
"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 فیلدهای
وضعیت فعلی پیام را هم دارد (بخش نسخههای وضعیت را ببینید).
{
"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)، صادر میشود.
{
"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
نمایشی؛ هنوز صادر نمیشود. این رویداد در کاتالوگ ثبت شده اما امروز هیچ تولیدکنندهای ندارد.
{
"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
نمایشی؛ هنوز صادر نمیشود. این رویداد در کاتالوگ ثبت شده اما امروز هیچ تولیدکنندهای ندارد.
{
"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 آن در هر
تلاش تازه است. مرجع فیلدها: وبهوکهای ورودی.
{
"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 وبهوک، ذاتاً غیرقابلاتکاست،
و بههرحال هیچ اشتراکی امروز نمیتواند این رویداد را در خود داشته باشد.
وقتی وبهوکی بهدلیل شکستهای پیاپی بهطور خودکار متوقف شود، صادر میشود.
{
"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
نمایشی؛ هنوز صادر نمیشود. این رویداد در کاتالوگ ثبت شده اما امروز هیچ تولیدکنندهای ندارد.
{
"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
نمایشی؛ هنوز صادر نمیشود. این رویداد در کاتالوگ ثبت شده اما امروز هیچ تولیدکنندهای ندارد.
{
"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
نمایشی؛ هنوز صادر نمیشود. این رویداد در کاتالوگ ثبت شده اما امروز هیچ تولیدکنندهای ندارد.
{
"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
نمایشی؛ هنوز صادر نمیشود. این رویداد در کاتالوگ ثبت شده اما امروز هیچ تولیدکنندهای ندارد.
{
"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 مستندشده در این صفحه در آن زمان تغییر نخواهد کرد.
مراحل بعدی
- تأیید امضا؛ تأیید کنید رویدادها واقعاً از MailLand میآیند
- منطق تلاش مجدد؛ رفتار تلاش مجدد را درک کنید
- نمای کلی وبهوکها؛ ایجاد و مدیریت وبهوکها