---
title: "Email Delayed"
method: POST
path: "MessageDelayed"
tags: ["Email Events"]
---

# Email Delayed

`POST MessageDelayed` (webhook)

Triggered when an email delivery is temporarily delayed (soft fail).

This typically occurs due to temporary issues like:
- Recipient server temporarily unavailable
- Rate limiting by recipient server
- Greylisting
- Mailbox full (over quota)

Ark will automatically retry delivery. You'll receive a `MessageSent` or
`MessageDeliveryFailed` event when the final outcome is determined.

**Bounce Classification:** This event includes classification data to help you understand
why delivery was delayed. Use the `classification` field for the category and
`smtp_enhanced_code` for the standardized SMTP status code.

## Payload

- WebhookPayload — Webhook event payload sent to your configured endpoint. The payload structure varies by event type: - **Delivery events** (MessageSent, MessageDelayed, MessageDeliveryFailed, MessageHeld): Include `message`, `status`, `details`, `output`, `sent_with_ssl`, `timestamp`, `time` - **MessageBounced**: Includes `original_message` and `bounce` (both are message objects) - **Engagement events** (MessageLoaded, MessageLinkClicked): Include `message`, `ip_address`, `user_agent` - **DomainDNSError**: Includes `server`, `domain`, `uuid`, `dns_checked_at`, and DNS status fields - **SendLimit events**: Include `server`, `volume`, `limit` **Bounce Classification:** For `MessageDelayed` and `MessageDeliveryFailed` events, additional classification fields are included to help you understand why delivery failed: - `classification` - Category like `invalid_recipient`, `mailbox_full`, `spam_block` - `classification_code` - Numeric code (10-49, 99) for grouping related classifications - `smtp_enhanced_code` - RFC 3463 enhanced status code (e.g., "5.1.1") - `remote_host` - Hostname of the server that returned the error **Note:** The event type is determined by which webhook events you subscribe to, not by a field in the payload. Use the `status` field to identify delivery event types: `Sent`, `SoftFail`, `HardFail`, `Held`.
  - `message` WebhookMessageData — Email message information included in webhook payloads
    - `id` integer — Internal message ID
    - `token` string — Message token for identification
    - `direction` 'outgoing' | 'incoming' — Direction of the email
    - `message_id` string — RFC 5322 Message-ID header
    - `to` string, email — Recipient email address
    - `from` string, email — Sender email address
    - `subject` string — Email subject line
    - `timestamp` number, float — Unix timestamp when the message was created (with microsecond precision)
    - `spam_status` 'NotChecked' | 'Spam' | 'NotSpam' — Spam check status
    - `tag` string, nullable — Tag applied to the email (null if not set)
    - `metadata` object, nullable — Custom metadata attached when the email was sent. Use this to correlate webhook events with your internal systems. Returns null if no metadata was provided.
  - `original_message` WebhookMessageData — Email message information included in webhook payloads
    - `id` integer — Internal message ID
    - `token` string — Message token for identification
    - `direction` 'outgoing' | 'incoming' — Direction of the email
    - `message_id` string — RFC 5322 Message-ID header
    - `to` string, email — Recipient email address
    - `from` string, email — Sender email address
    - `subject` string — Email subject line
    - `timestamp` number, float — Unix timestamp when the message was created (with microsecond precision)
    - `spam_status` 'NotChecked' | 'Spam' | 'NotSpam' — Spam check status
    - `tag` string, nullable — Tag applied to the email (null if not set)
    - `metadata` object, nullable — Custom metadata attached when the email was sent. Use this to correlate webhook events with your internal systems. Returns null if no metadata was provided.
  - `bounce` WebhookMessageData — Email message information included in webhook payloads
    - `id` integer — Internal message ID
    - `token` string — Message token for identification
    - `direction` 'outgoing' | 'incoming' — Direction of the email
    - `message_id` string — RFC 5322 Message-ID header
    - `to` string, email — Recipient email address
    - `from` string, email — Sender email address
    - `subject` string — Email subject line
    - `timestamp` number, float — Unix timestamp when the message was created (with microsecond precision)
    - `spam_status` 'NotChecked' | 'Spam' | 'NotSpam' — Spam check status
    - `tag` string, nullable — Tag applied to the email (null if not set)
    - `metadata` object, nullable — Custom metadata attached when the email was sent. Use this to correlate webhook events with your internal systems. Returns null if no metadata was provided.
  - `status` 'Sent' | 'SoftFail' | 'HardFail' | 'Held' — Delivery status. Values correspond to event types: - `Sent` (MessageSent) - `SoftFail` (MessageDelayed) - `HardFail` (MessageDeliveryFailed) - `Held` (MessageHeld)
  - `details` string — Human-readable summary of the delivery attempt. Format varies by status: - **Sent**: `Message for {recipient} accepted by {ip}:{port} ({hostname})` - **SoftFail/HardFail**: `{code} {classification}: Delivery to {recipient} failed at {ip}:{port} ({hostname})` - **Connection errors**: `Connection error: Could not connect to any mail server for {domain}`
  - `output` string — Raw SMTP response from the receiving server. Contains the full error message for failures.
  - `sent_with_ssl` boolean — Whether the message was delivered over a TLS connection
  - `time` number, float — Time taken to deliver in seconds
  - `timestamp` number, float — Unix timestamp of the delivery attempt (with microsecond precision)
  - `classification` 'invalid_recipient' | 'inactive_mailbox' | 'mailbox_full' | 'invalid_domain' | 'dns_failure' | 'routing_error' | 'spam_block' | 'spam_content' | 'policy_rejection' | 'connection_error' | 'protocol_error' | 'transient_failure' | 'unclassified' — Bounce classification category explaining why delivery failed. Only present for `MessageDelayed` and `MessageDeliveryFailed` events. **Recipient Issues (10-19):** - `invalid_recipient` - Mailbox doesn't exist (5.1.1) - `inactive_mailbox` - Account disabled or suspended - `mailbox_full` - Over quota (5.2.2) **Domain Issues (20-29):** - `invalid_domain` - Domain doesn't exist - `dns_failure` - Temporary DNS resolution failure - `routing_error` - Relay denied or routing problems **Reputation/Policy (30-39):** - `spam_block` - IP or domain blocklisted - `spam_content` - Content flagged as spam - `policy_rejection` - Rejected by policy (DMARC, etc.) **Technical (40-49):** - `connection_error` - Connection timeout or refused - `protocol_error` - SMTP protocol issues - `transient_failure` - General temporary failure **Other:** - `unclassified` - Could not classify the bounce
  - `classification_code` 10 | 11 | 12 | 20 | 21 | 22 | 30 | 31 | 32 | 40 | 41 | 42 | 99 — Numeric code for the bounce classification. Useful for grouping related classifications: - 10-19: Recipient issues - 20-29: Domain issues - 30-39: Reputation/policy issues - 40-49: Technical issues - 99: Unclassified Only present when `classification` is present.
  - `smtp_enhanced_code` string, nullable — RFC 3463 enhanced SMTP status code from the receiving server (e.g., "5.1.1", "4.2.2"). Provides standardized bounce reason codes. Only present for delivery failures where the remote server provided an enhanced code.
  - `remote_host` string, nullable — Hostname of the remote SMTP server that returned the error. Only present for delivery failures.
  - `url` string — The URL that was clicked (for MessageLinkClicked events)
  - `token` string — Unique token for the clicked link (for MessageLinkClicked events)
  - `ip_address` string — IP address of the recipient (for MessageLoaded and MessageLinkClicked events)
  - `user_agent` string — User agent of the recipient's email client (for MessageLoaded and MessageLinkClicked events)
  - `server` WebhookServerData — Server information included in some webhook payloads
    - `uuid` string — Server UUID
    - `name` string — Server name
    - `permalink` string — Server permalink/slug
    - `organization` string — Organization permalink
  - `domain` string — Domain name with DNS issues (for DomainDNSError events)
  - `uuid` string — Unique identifier for the domain (for DomainDNSError events)
  - `dns_checked_at` number, float — Unix timestamp when DNS was checked (for DomainDNSError events)
  - `spf_status` 'OK' | 'Missing' | 'Invalid' — SPF record status (for DomainDNSError events)
  - `spf_error` string, nullable — SPF error message if status is not OK
  - `dkim_status` 'OK' | 'Missing' | 'Invalid' — DKIM record status (for DomainDNSError events)
  - `dkim_error` string, nullable — DKIM error message if status is not OK
  - `mx_status` 'OK' | 'Missing' | 'Invalid' — MX record status (for DomainDNSError events)
  - `mx_error` string, nullable — MX error message if status is not OK
  - `return_path_status` 'OK' | 'Missing' | 'Invalid' — Return path record status (for DomainDNSError events)
  - `return_path_error` string, nullable — Return path error message if status is not OK
  - `volume` integer — Current send volume in the last hour (for SendLimit events)
  - `limit` integer — Configured send limit per hour (for SendLimit events)

## Acknowledgement `200`

Webhook received successfully

---

[API](https://skmtc.net/arkhq-io/apis/ark-email-api.md) · [All operations](https://skmtc.net/arkhq-io/apis/ark-email-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/arkhq-io/ark-email-api/revisions/98a90852ffca/schema)
