---
title: "Get email details"
method: GET
path: "/emails/{emailId}"
tags: ["Emails"]
---

# Get email details

`GET /emails/{emailId}`

Retrieve detailed information about a specific email including
delivery status, timestamps, and optionally the email content.

Use the `expand` parameter to include additional data like the
HTML/text body, headers, or delivery attempts.

## Path parameters

- `emailId` string, required

## Query parameters

- `expand` string

## Response `200`

Email details

- EmailDetails
  - `success` true, required
  - `data` object, required
    - `id` string, required — Unique message identifier (token)
    - `scope` 'outgoing' | 'incoming', required — Message direction
    - `to` string, email, required — Recipient address
    - `from` string, required — Sender address
    - `subject` string, required — Email subject line
    - `messageId` string — SMTP Message-ID header
    - `status` 'pending' | 'sent' | 'softfail' | 'hardfail' | 'bounced' | 'held', required — Current delivery status: - `pending` - Email accepted, waiting to be processed - `sent` - Email transmitted to recipient's mail server - `softfail` - Temporary delivery failure, will retry - `hardfail` - Permanent delivery failure - `bounced` - Email bounced back - `held` - Held for manual review
    - `tag` string — Optional categorization tag
    - `timestamp` number, required — Unix timestamp when the email was sent
    - `timestampIso` string, date-time, required — ISO 8601 formatted timestamp
    - `spam` boolean — Whether the message was flagged as spam
    - `spamScore` number — Spam score (if applicable)
    - `htmlBody` string — HTML body content (included if expand=content)
    - `plainBody` string — Plain text body (included if expand=content)
    - `headers` object — Email headers (included if expand=headers)
    - `deliveries` Delivery[] — Delivery attempt history (included if expand=deliveries)
      - `id` string, required — Delivery attempt ID
      - `status` string, required — Delivery status (lowercase)
      - `details` string — Human-readable delivery summary. 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})`
      - `output` string — Raw SMTP response from the receiving mail server
      - `code` integer — SMTP response code
      - `sentWithSsl` boolean — Whether TLS was used
      - `timestamp` number, required — Unix timestamp
      - `timestampIso` string, date-time, required — ISO 8601 timestamp
      - `classification` 'invalid_recipient' | 'mailbox_full' | 'message_too_large' | 'spam_block' | 'policy_violation' | 'no_mailbox' | 'not_accepting_mail' | 'temporarily_unavailable' | 'protocol_error' | 'tls_required' | 'connection_error' | 'dns_error' | 'unclassified', nullable — Bounce classification category (present for failed deliveries). Helps understand why delivery failed for analytics and automated handling.
      - `classificationCode` integer, nullable — Numeric bounce classification code for programmatic handling. Codes: 10=invalid_recipient, 11=no_mailbox, 12=not_accepting_mail, 20=mailbox_full, 21=message_too_large, 30=spam_block, 31=policy_violation, 32=tls_required, 40=connection_error, 41=dns_error, 42=temporarily_unavailable, 50=protocol_error, 99=unclassified
      - `smtpEnhancedCode` string, nullable — RFC 3463 enhanced status code from SMTP response (e.g., "5.1.1", "4.2.2"). First digit: 2=success, 4=temporary, 5=permanent. Second digit: category (1=address, 2=mailbox, 7=security, etc.).
      - `remoteHost` string, nullable — Hostname of the remote mail server that processed the delivery. Present for all delivery attempts (successful and failed).
    - `activity` object — Opens and clicks tracking data (included if expand=activity)
      - `opens` object[] — List of email open events
        - `ipAddress` string — IP address of the opener
        - `userAgent` string — User agent of the email client
        - `timestamp` number — Unix timestamp of the open event
        - `timestampIso` string, date-time — ISO 8601 timestamp of the open event
      - `clicks` object[] — List of link click events
        - `url` string, uri — URL that was clicked
        - `ipAddress` string — IP address of the clicker
        - `userAgent` string — User agent of the email client
        - `timestamp` number — Unix timestamp of the click event
        - `timestampIso` string, date-time — ISO 8601 timestamp of the click event
    - `attachments` AttachmentDetails[] — File attachments (included if expand=attachments)
      - `filename` string, required — Original filename of the attachment
      - `contentType` string, required — MIME type of the attachment
      - `size` integer, required — Size of the attachment in bytes
      - `hash` string, required — SHA256 hash of the attachment content for verification
      - `data` string, required — Base64 encoded attachment content. Decode this to get the raw file bytes.
    - `rawMessage` string — Complete raw MIME message, base64 encoded (included if expand=raw). Decode this to get the original RFC 2822 formatted email.
  - `meta` ApiMeta, required
    - `requestId` string, required — Unique request identifier for debugging and support

## Other responses

- `401` — Invalid or missing API key
- `404` — Resource not found
- `500` — Internal server error

---

[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)
