---
title: "List sent emails"
method: GET
path: "/email-sends"
tags: ["Email Sends"]
---

# List sent emails

`GET /email-sends`

Lists the recent 14-day delivery history with dashboard-equivalent subject, recipient, status, type, bounce, source, pagination, and sorting filters. Successful test sends and copied-recipient bookkeeping rows are hidden; a test send that failed, bounced, or was suppressed IS listed, flagged with an `isTestEmail` value of true, because it is the only record of a test that never arrived.

## Query parameters

- `search` string
- `q` string
- `subject` string
- `title` string
- `recipient` string
- `status` 'pending' | 'sent' | 'delivered' | 'opened' | 'clicked' | 'bounced' | 'complained' | 'failed' | 'suppressed'
- `emailType` 'campaign' | 'transactional' | 'sequence'
- `bounceType` 'Permanent' | 'Transient'
- `campaignId` string
- `transactionalEmailId` string
- `automationId` string
- `automationNodeId` string
- `days` integer
- `page` integer
- `limit` integer
- `sortField` 'recipientEmail' | 'subject' | 'status' | 'eventAt' | 'sentAt' | 'createdAt'
- `sortOrder` 'asc' | 'desc'

## Response `200`

Paginated sent-email history

- object
  - `success` boolean
  - `retentionDays` integer
  - `emailSends` object[]
    - `id` string
    - `companyId` string
    - `type` 'campaign' | 'transactional' | 'sequence', nullable — Send-source category. API/MCP sends use transactional here even when their delivery policy is marketing.
    - `emailType` 'marketing' | 'transactional', nullable — Delivery policy used for suppression and compliance behavior, or null when retained legacy data cannot prove it.
    - `isTransactional` boolean, nullable — Stored delivery-policy snapshot. Prefer emailType for a normalized value.
    - `isTestEmail` boolean — Whether this delivery was a test send hidden from normal sent-email history.
    - `campaignId` string, nullable
    - `transactionalEmailId` string, nullable
    - `automationNodeId` string, nullable
    - `automationTokenId` string, nullable
    - `abTestVariantId` string, nullable
    - `subscriberId` string, nullable
    - `subscriberExternalId` string, nullable — Customer-owned subscriber ID captured from a single-recipient transactional send.
    - `recipientEmail` string, email, nullable
    - `additionalRecipients` object, nullable — Full recipient envelope for multi-recipient transactional sends, as actually sent. Null for single-recipient sends.
      - `to` string[]
      - `cc` string[]
      - `bcc` string[]
    - `subject` string, nullable
    - `senderEmail` string, email, nullable
    - `senderName` string, nullable
    - `authenticatedDomainId` string, nullable
    - `originalReplyTo` string, nullable — Resolved reply destination, optionally including a display name. When reply tracking is disabled, this is the sent Reply-To header. When reply tracking is enabled, the sent header is a unique trackable address and this value is the forwarding destination.
    - `sendingIpAddress` string, nullable
    - `observedSendingIpAddress` string, nullable
    - `sesMessageId` string, nullable
    - `status` 'pending' | 'sent' | 'delivered' | 'opened' | 'clicked' | 'bounced' | 'complained' | 'failed' | 'suppressed'
    - `bounceType` string, nullable
    - `bounceSubType` string, nullable
    - `complaintType` string, nullable
    - `suppressionReason` 'bounced' | 'complaint' | 'unsubscribed', nullable
    - `errorMessage` string, nullable
    - `internalFailureCode` 'transport_exhausted' | 'admin_bounce' | 'crash_orphaned_claim', nullable — Why a send reached status "failed". Present only for terminal delivery failures. "transport_exhausted" means every available delivery route was refused by the recipient provider; "admin_bounce" means an operator removed the message from the delivery queue; "crash_orphaned_claim" means the sending worker stopped between claiming the send and recording a transport outcome, so the message was never confirmed as reaching the provider. None of them is a bounce: the address is still valid, stays subscribed, and is not suppressed. New codes can be added over time, so treat an unrecognized value as a generic failure rather than rejecting the response.
    - `emailBody` string, nullable — Stored HTML body. Null when the email send row has been cleaned up.
    - `isCopiedRecipient` boolean — Whether this is an auxiliary CC/BCC delivery record whose content and engagement belong to a primary email send.
    - `primaryEmailSendId` string, nullable — Primary email send ID for a copied-recipient delivery, or null for ordinary sends and when the primary record is unavailable.
    - `sentAt` string, date-time, nullable
    - `deliveredAt` string, date-time, nullable
    - `bouncedAt` string, date-time, nullable
    - `complainedAt` string, date-time, nullable
    - `openedAt` string, date-time, nullable
    - `clickedAt` string, date-time, nullable
    - `unsubscribedAt` string, date-time, nullable
    - `suppressedAt` string, date-time, nullable
    - `createdAt` string, date-time
    - `subscriber` object, nullable
      - `id` string
      - `email` string, email
      - `firstName` string, nullable
      - `lastName` string, nullable
    - `campaign` object, nullable
      - `id` string
      - `name` string
    - `automation` object, nullable
      - `id` string
      - `name` string
    - `eventAt` string, date-time
    - `opened` boolean
    - `clicked` boolean
  - `pagination` Pagination
    - `page` integer
    - `limit` integer
    - `total` integer
    - `totalPages` integer

## Other responses

- `400` — Invalid filter or pagination value
- `401` — Unauthorized
- `403` — No company selected
- `503` — The database was temporarily unavailable. The request may be retried after the delay in Retry-After.

## Changes

> 121 revisions in range; 12 could not be searched.

- **2026-08-18** `8fbabe82a04d` — 1 info
  - added the non-success response with the status `503`
- **2026-08-06** `e5f6099ca35e` — 1 info
  - added the new optional `query` request parameter `automationNodeId`
- **2026-08-02** `36f92fc0caa2` — 3 breaking
  - the response property `success` became optional for the status `400`
  - the response property `success` became optional for the status `401`
  - the response property `success` became optional for the status `403`
- **2026-07-25** `b58891ac1cde` — 1 info
  - added the optional property `emailSends/items/allOf[#/components/schemas/EmailSend]/internalFailureCode` to the response with the `200` status
- **2026-07-22** `06219e920c39` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/sequenzy/apis/sequenzy-api/changes/email-sends/get.md)

---

[API](https://skmtc.dev/sequenzy/apis/sequenzy-api.md) · [All operations](https://skmtc.dev/sequenzy/apis/sequenzy-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/sequenzy/sequenzy-api/revisions/73f826277d9a/schema)
