# get_site_email

Source: https://modulify.ai/docs/api/emails/get-site-email

Reads one email a site sent in full, with every recipient's own status, the delivery events, the stored body and the clicked links.

- Title: Read one email a site sent
- Scope: `config:read`
- Access: Read only
- Endpoint: `POST /v1/get_site_email`

It takes the id from `list_site_email_sends` and returns everything the list row carries, plus every recipient in `recipients` with their own delivery status (`pending`, `sent`, `delivered`, `delayed`, `bounced`, `complained`, `rejected`, `failed` or `suppressed`) and the provider's detail, such as a bounce reason. It also returns the delivery events with their times in `events`, the attachment names, types and sizes (never their content), the custom header names, the idempotency key, the bounce type, and the stored `html` and `text` bodies.

`bodyStored` is false for messages sent before bodies were kept, and `bodyTruncated` is true when a body over 200,000 characters was stored cut short. Rows are kept until the history is cleared.

A message sent with open and click tracking on (`tracked` true) also carries `lastOpenedAt` and `lastClickedAt` next to the counts and first times, and `links`, every clicked link with its own click count and first and last click, most clicked first, up to 50 different links. All of it covers the whole message and never says which recipient opened or clicked, and opens are approximate.

It answers whether a particular person received a message, why it bounced, what it said, or whether it was opened and which links were clicked. See [Open an email](https://modulify.ai/docs/automations/emails#open-an-email).

## Request

Call it with a `POST` to `https://api.modulify.ai/v1/get_site_email`, sending the inputs below as a JSON object. The token needs the `config:read` scope.

It only reads and changes nothing, so retrying it is safe.

```bash
curl -X POST https://api.modulify.ai/v1/get_site_email \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"projectId":"PROJECT_ID","id":"ID"}'
```

Over MCP, the same method is the [get_site_email tool](https://modulify.ai/docs/mcp/emails/get-site-email).

## Inputs

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `projectId` | string | Yes | The site id. |
| `id` | string | Yes | The id of the email, from `list_site_email_sends`. |

## Response

Every call answers with the [JSON envelope](https://modulify.ai/docs/api/requests-and-responses#the-response) of `success`, `message`, `data`, `code` and `version`. `data` holds the result described above, and on a method that returns a total, `count` carries it. The [response headers](https://modulify.ai/docs/api/requests-and-responses#headers-on-every-method-call) carry the call's `X-Request-Id` and what is left of your per-minute budget in `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`. [Errors](https://modulify.ai/docs/api/errors) explains every status code a call can answer with.