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

# List Per-Email Metrics

> Compare every campaign and sequence email step in one call, with totals across all matching emails.

Returns one row per email - each campaign and each individual sequence email
step - with its own delivery funnel, attributed conversions, and revenue. Where
[Get Sequence Metrics](/api-reference/analytics/sequence-metrics) answers "how
did this one sequence's steps perform", this endpoint answers cross-sequence
questions such as "how many step-4 emails went out across these sequences"
without one request per sequence.

Counts come from retained event storage, not the 14-day delivery history behind
[List Sent Emails](/api-reference/email-sends/list), so old sends stay
answerable. Sequence rows report the same numbers as the matching entry in the
sequence metrics `steps` array, because both use the same step ordering and the
same counting rules. Test sends are excluded, and detected scanner opens and
clicks are excluded unless you pass `includeMachineEngagement`.

## Query Parameters

<ParamField query="emailType" type="string">
  Restrict to `campaign` or `sequence`. Defaults to both. Implied as `sequence`
  when `sequenceId` or `step` is set, and as `campaign` when `campaignId` is
  set.
</ParamField>

<ParamField query="sequenceId" type="string">
  Comma-separated sequence IDs to restrict the breakdown to. Omit for every
  sequence in the account. Cannot be combined with `campaignId` or
  `emailType=campaign`.
</ParamField>

<ParamField query="campaignId" type="string">
  Comma-separated campaign IDs to restrict the breakdown to. Cannot be combined
  with `sequenceId`, `step`, or `emailType=sequence`.
</ParamField>

<ParamField query="step" type="number">
  Keep only sequence emails at this 1-based position, counted in graph order per
  sequence. `step=4` keeps the fourth email of every matching sequence. Cannot
  be combined with `emailType=campaign`.
</ParamField>

<ParamField query="period" type="string">
  Sliding time window. One of: `1h`, `24h`, `7d`, `30d`, `90d`. Ignored when
  `start` and `end` are provided. Omit both for all-time counts.
</ParamField>

<ParamField query="start" type="string">
  Start of custom time range (ISO 8601). Must be used with `end`.
</ParamField>

<ParamField query="end" type="string">
  End of custom time range (ISO 8601). Must be used with `start`. Max range: 90
  days.
</ParamField>

<ParamField query="sort" type="string" default="sent">
  Sort field: `sent`, `delivered`, `opened`, `clicked`, `openRate`, `clickRate`,
  `unsubscribed`, `conversions`, `revenue`, `step`, or `name`.
</ParamField>

<ParamField query="order" type="string" default="desc">
  Sort order: `asc` or `desc`.
</ParamField>

<ParamField query="page" type="number" default="1">
  Page number for pagination.
</ParamField>

<ParamField query="limit" type="number" default="50">
  Emails per page (max 500).
</ParamField>

<ParamField query="includeMachineEngagement" type="boolean" default="false">
  Set to `true` to include detected scanner, preview, and tracked asset
  open/click events in engagement metrics.
</ParamField>

## Response Fields

| Field        | Type     | Description                                                   |
| ------------ | -------- | ------------------------------------------------------------- |
| `emails`     | `array`  | One entry per matching email, ordered by `sort` and `order`   |
| `totals`     | `object` | Summed funnel across every matching email, not just this page |
| `pagination` | `object` | `page`, `limit`, `total`, and `totalPages` for the email list |

**Email object**:

| Field              | Type           | Description                                                                       |
| ------------------ | -------------- | --------------------------------------------------------------------------------- |
| `emailType`        | `string`       | `campaign` or `sequence`                                                          |
| `emailId`          | `string`       | Campaign ID for campaigns, automation node ID for sequence emails                 |
| `name`             | `string`       | Campaign name, or the step's subject line falling back to its node label          |
| `campaignId`       | `string\|null` | Campaign ID, or `null` for sequence emails                                        |
| `sequenceId`       | `string\|null` | Sequence ID, or `null` for campaigns                                              |
| `sequenceName`     | `string\|null` | Name of the sequence this step belongs to                                         |
| `automationNodeId` | `string\|null` | Node ID of this step; pass it to sequence events or sent emails to see recipients |
| `step`             | `number\|null` | 1-based position of this email in its sequence, or `null` for campaigns           |
| `stats`            | `object`       | Delivery funnel for this email alone                                              |
| `conversions`      | `number`       | Goal conversions attributed to this email                                         |
| `revenueCents`     | `number`       | Attributed revenue in cents                                                       |

`totals` carries the same funnel fields plus `emails` (the number of matching
emails), `conversions`, and `revenueCents`. Totals always cover the full
filtered set, so paging never changes the answer to "how many went out".

## Common Queries

### How many step-4 emails have we sent across all sequences?

```bash theme={null}
curl "https://api.sequenzy.com/api/v1/metrics/emails?step=4" \
 -H "Authorization: Bearer YOUR_API_KEY"
```

Read `totals.sent`. The `emails` array breaks the same number down per sequence.

### Same question, but only for two specific sequences

```bash theme={null}
curl "https://api.sequenzy.com/api/v1/metrics/emails?sequenceId=seq_abc123,seq_def456&step=4" \
 -H "Authorization: Bearer YOUR_API_KEY"
```

### Which sequence emails have the best open rate?

```bash theme={null}
curl "https://api.sequenzy.com/api/v1/metrics/emails?emailType=sequence&sort=openRate&limit=20" \
 -H "Authorization: Bearer YOUR_API_KEY"
```

### Which emails drove the most revenue last quarter?

```bash theme={null}
curl "https://api.sequenzy.com/api/v1/metrics/emails?period=90d&sort=revenue" \
 -H "Authorization: Bearer YOUR_API_KEY"
```

### Who received one of these steps?

Take an `automationNodeId` from the response and pass it to
[List Sequence Events](/api-reference/analytics/sequence-events) for the full
retained event stream, or to
[List Sent Emails](/api-reference/email-sends/list) for the last 14 days of
per-recipient delivery rows.

## Responses

<ResponseExample>
  ```json 200 theme={null}
  {
    "success": true,
    "step": 4,
    "sort": "sent",
    "order": "desc",
    "emails": [
      {
        "emailType": "sequence",
        "emailId": "node_email_4_winback",
        "name": "Still thinking it over?",
        "campaignId": null,
        "sequenceId": "seq_def456",
        "sequenceName": "Winback",
        "automationNodeId": "node_email_4_winback",
        "step": 4,
        "stats": {
          "sent": 820,
          "delivered": 811,
          "bounced": 9,
          "opened": 402,
          "clicked": 76,
          "replies": 0,
          "unsubscribed": 3,
          "rateDenominator": 811,
          "rateDenominatorBasis": "delivered",
          "deliveryRate": 98.9,
          "bounceRate": 1.1,
          "openRate": 49.57,
          "clickRate": 9.37,
          "replyRate": 0,
          "unsubscribeRate": 0.37
        },
        "conversions": 14,
        "revenueCents": 128400
      },
      {
        "emailType": "sequence",
        "emailId": "node_email_4_onboarding",
        "name": "Your first week recap",
        "campaignId": null,
        "sequenceId": "seq_abc123",
        "sequenceName": "Onboarding",
        "automationNodeId": "node_email_4_onboarding",
        "step": 4,
        "stats": {
          "sent": 512,
          "delivered": 508,
          "bounced": 4,
          "opened": 289,
          "clicked": 41,
          "replies": 0,
          "unsubscribed": 1,
          "rateDenominator": 508,
          "rateDenominatorBasis": "delivered",
          "deliveryRate": 99.22,
          "bounceRate": 0.78,
          "openRate": 56.89,
          "clickRate": 8.07,
          "replyRate": 0,
          "unsubscribeRate": 0.2
        },
        "conversions": 6,
        "revenueCents": 43200
      }
    ],
    "totals": {
      "emails": 2,
      "sent": 1332,
      "delivered": 1319,
      "bounced": 13,
      "opened": 691,
      "clicked": 117,
      "replies": 0,
      "unsubscribed": 4,
      "rateDenominator": 1319,
      "rateDenominatorBasis": "delivered",
      "deliveryRate": 99.02,
      "bounceRate": 0.98,
      "openRate": 52.39,
      "clickRate": 8.87,
      "replyRate": 0,
      "unsubscribeRate": 0.3,
      "conversions": 20,
      "revenueCents": 171600
    },
    "pagination": {
      "page": 1,
      "limit": 50,
      "total": 2,
      "totalPages": 1
    }
  }
  ```

  ```json 400 theme={null}
  {
    "success": false,
    "error": "step filters sequence emails and cannot be combined with emailType=campaign"
  }
  ```

  ```json 401 theme={null}
  { "success": false, "error": "Unauthorized" }
  ```

  ```json 500 theme={null}
  { "success": false, "error": "Internal server error" }
  ```
</ResponseExample>
