> ## Documentation Index
> Fetch the complete documentation index at: https://docs.talario.eu/llms.txt
> Use this file to discover all available pages before exploring further.

# Payload version 2

> Parsed content in the webhook: subject, text, HTML, headers and attachment links.

Version 2 delivers the parsed message in the webhook. Your endpoint gets subject, text, HTML, headers and links to the attachments without downloading and parsing the original message. The original stays available as a download.

To use it, choose **Version 2: parsed content** under **Payload** when you add or edit the endpoint in the dashboard. The change applies to messages received afterwards; deliveries already created keep their version.

## Format

The payload is the [parsed content](/receiving/parsed-content#response) of the message for the recipient of the delivery, with two additional fields:

| Field | Content |
| - | - |
| `event` | Always `message.received` |
| `delivery_id` | Stable ID of the delivery, as in the `X-Talario-Delivery-Id` header |

```json theme={null}
{
  "schema_version": 2,
  "event": "message.received",
  "delivery_id": "019a0520-0000-7000-8000-000000000001",
  "id": "019a0520-0000-7000-8000-000000000002",
  "domain": "inbound.example.com",
  "received_at": "2026-10-21T16:00:00Z",
  "expires_at": "2026-10-28T16:00:00Z",
  "sender": "bounce@example.org",
  "from": "Erika Example <erika@example.org>",
  "recipient": "support@inbound.example.com",
  "to": "Support <support@inbound.example.com>",
  "cc": "",
  "reply-to": "erika@example.org",
  "subject": "Question about my booking",
  "message-id": "<external-id@example.org>",
  "in-reply-to": "",
  "references": [],
  "body-plain": "Hello, please find my booking attached.",
  "body-html": "<p>Hello, please find my booking attached.</p>",
  "message-headers": [
    ["From", "Erika Example <erika@example.org>"],
    ["Subject", "Question about my booking"]
  ],
  "attachment-count": 1,
  "attachments": [
    {
      "id": "part-2",
      "name": "booking.pdf",
      "content-type": "application/pdf",
      "size": 12345,
      "sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
      "disposition": "attachment",
      "content-id": null,
      "url": "https://…",
      "expires_at": "2026-10-21T17:00:00Z"
    }
  ],
  "content-id-map": {},
  "parse_status": "parsed",
  "parse_warnings": [],
  "content_omitted": false,
  "download": {
    "url": "https://…",
    "expires_at": "2026-10-21T17:00:00Z",
    "size_bytes": 14557,
    "sha256": "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"
  }
}
```

All fields are described under [Parsed content](/receiving/parsed-content#fields). Note the differences to version 1:

* The message fields are at the top level, not below `message`.
* The envelope sender is called `sender` (version 1: `envelope_from`), the `Message-ID` header `message-id` (version 1: `message_id`).
* Size and checksum of the original are in `download.size_bytes` and `download.sha256`.

Signature, headers, retries and deduplication are the same as for version 1. Talario does not imitate Mailgun's signature fields; [verify](/webhooks/signatures) the `X-Talario-Signature` header.

## Large messages

If the payload would exceed **1,000,000 bytes**, Talario delivers it with `content_omitted: true`:

* `body-plain` and `body-html` are `""`, and `message-headers` is `[]`.
* All other fields, the attachments with their links and the original download are included.

Read the full content with [`GET /receiving/messages/{id}/content`](/receiving/parsed-content) and the `recipient` of the delivery, or parse the original message. Omitted fields are never truncated: they are either complete or empty.

The limit keeps payloads below common default request size limits, such as `client_max_body_size 1m` in nginx. A payload can still exceed it, for example for a message with very many attachments. Allow request bodies of a few megabytes at your endpoint.

## Messages without parsed content

If the message could not be parsed, the payload has `parse_status: failed` and a [code](/receiving/parsed-content#parse-status-and-warnings) in `parse_warnings`. Body fields, headers and attachments are empty; process the message from the original in `download`.

If the parsed content could not be stored within 6 hours of receipt, Talario still delivers the webhook with `parse_status: failed` and the warning `content_unavailable`. This warning occurs only in webhooks; the original message is available as usual.

## Accepting version 2 webhooks

Store the verified payload durably before you answer `2xx`; downloading attachments can happen afterwards in a job. Links expire after at most an hour; request new ones through the API. See [Process webhooks reliably](/webhooks/processing#processing-payload-version-2).

Without an API key, your application must download the attachments and the original before the links expire, and when `content_omitted` is `true` only the original message is available to it.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.