---
title: "Get email sends"
method: GET
path: "/v1/analytics/sends"
tags: ["Analytics"]
---

# Get email sends

`GET /v1/analytics/sends`

Unified send read. A send is the unit of delivery + analytics: one design delivered to a target (audience, inline list, or single address) via one domain. Omit `sendId` to LIST the brand’s sends, newest first, under `{ data, pagination }`; filter with `?status=` (scheduled | queued | sending | sent | failed | canceled), the `from`/`to` ISO-8601 window, or `?emailId=` (one design’s sends). Pass `?sendId=` to fetch ONE — returns `{ data: [row] }` (no `pagination`), `404 SEND_NOT_FOUND` on an unknown / cross-brand id; add `?include=events` (detail only) for a bounded first page of the send’s analytics events. `sendId` and `emailId` are mutually exclusive.

## Query parameters

- `sendId` string
- `emailId` string
- `include` 'events'
- `status` 'scheduled' | 'queued' | 'sending' | 'paused' | 'sent' | 'failed' | 'canceled'
- `from` string, date-time
- `to` string, date-time
- `limit` integer
- `cursor` string

## Response `200`

A page of sends (list mode), or `{ data: [row] }` (detail mode; `events[]` present when `?include=events`).

- SendsListResponse
  - `data` object[], required
    - `sendId` string, required
    - `kind` 'campaign' | 'automation', required
    - `messageClass` 'marketing' | 'transactional'
    - `emailId` string, required
    - `emailVersionId` string
    - `status` 'scheduled' | 'queued' | 'sending' | 'paused' | 'sent' | 'failed' | 'canceled', required
    - `subject` string
    - `previewText` string
    - `fromAddress` string
    - `senderName` string
    - `replyTo` string
    - `domainId` string
    - `audienceId` string
    - `audienceName` string
    - `recipientCount` integer
    - `runId` string
    - `scheduledAt` string, date-time
    - `startedAt` string, date-time
    - `completedAt` string, date-time
    - `failedAt` string, date-time
    - `error` string
    - `stats` object
      - `sent` integer, required
      - `delivered` integer, required
      - `opened` integer, required
      - `clicked` integer, required
      - `bounced` integer, required
      - `complained` integer, required
      - `unsubscribed` integer, required
    - `delivery` object
      - `accepted` integer, required
      - `pending` integer, required
      - `delayed` integer, required
      - `delivered` integer, required
      - `bounced` integer, required
      - `failed` integer, required
      - `providerSuppressed` integer, required
      - `preSendSkipped` integer, required
      - `updatedAt` string, date-time, required
    - `gradualSend` object
      - `startingPercentage` number, required
      - `incrementPercentage` number, required
      - `interval` union, required
        - object
          - `value` integer, required
          - `unit` 'hour', required
        - object
          - `value` integer, required
          - `unit` 'day', required
      - `timeZone` string, required — IANA timezone used to preserve local wall-clock time for day intervals.
      - `rampEndsAt` string, date-time
      - `currentTranche` integer
      - `sentSoFar` integer
      - `pausedAt` string, date-time
      - `pauseReason` 'manual'
      - `resumedAt` string, date-time
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `events` object[]
      - `eventType` 'sent' | 'delivered' | 'delivery_delayed' | 'opened' | 'clicked' | 'bounced' | 'complained' | 'failed' | 'provider_suppressed' | 'suppressed' | 'quota_skipped' | 'received' | 'unsubscribed', required
      - `occurredAt` string, date-time, required
      - `recipientEmail` string
      - `url` string
  - `pagination` object
    - `limit` integer, required
    - `cursor` string, nullable, required
    - `hasMore` boolean, required

## Other responses

- `400` — The request body or query string was invalid (unknown key, wrong type, or missing required field). Strict schemas reject unknown keys — including `brandId`, which is always resolved from the API key.
- `401` — The API key was missing, invalid, or revoked.
- `403` — The caller does not have the required `emails` permission.
- `404` — Send not found in the API-key brand. Cross-brand ids intentionally surface as 404 (never 403) so the API does not leak cross-brand existence.
- `429` — The request hit the rolling rate limit window.
- `500` — Unexpected internal error.

---

[API](https://skmtc.net/brew/apis/brew-public-api-v1.md) · [All operations](https://skmtc.net/brew/apis/brew-public-api-v1/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/brew/brew-public-api-v1/revisions/db96cfedc6c5/schema)
