Modulify

Read one email a site sent

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.

POST /v1/get_site_emailScopeconfig:readRead only

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.

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.

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.

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 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 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 explains every status code a call can answer with.