---
title: "Unified events feed"
method: GET
path: "/v1/analytics/events"
tags: ["Analytics"]
---

# Unified events feed

`GET /v1/analytics/events`

Read-only window over the brand’s analytics events across domains (email, automation, trigger, inbound). Defaults to the last 7 days. Equality filters: `recipientEmail`, `eventType`, `automationId`, `sendId` (join back to `/v1/analytics/sends?sendId=`). Send-object facets — `source` (csv of send sources), `audienceId` (csv, ≤20), `emailId` (design), `domain` (sending domain), `triggerEventId` (csv, ≤10 — integration trigger-events resolved to their wired automations): when ANY facet is present the feed narrows to EMAIL events only and each row is enriched with `sendSource` + `sendContext` (plus `triggerProvider`/`triggerTitle` on integration/custom-triggered rows). Machine/bot-classified `clicked` rows are EXCLUDED by default (matching `/v1/analytics/overview`); pass `includeMachineClicks=true` to include the raw rows (audit/debug only). Cursor pagination — pass `pagination.cursor` back as `?cursor=`; loop `while (cursor !== null)`. Requires the `emails` scope.

## Query parameters

- `from` string, date-time
- `to` string, date-time
- `recipientEmail` string, email
- `eventType` string
- `automationId` string
- `sendId` string
- `source` string
- `audienceId` string
- `emailId` string
- `domain` string
- `triggerEventId` string
- `includeMachineClicks` boolean
- `limit` integer
- `cursor` string

## Response `200`

A page of unified analytics events.

- EventsAnalyticsResponse
  - `data` object[], required
    - `id` string, required
    - `occurredAt` string, date-time, required
    - `domain` 'email' | 'automation' | 'trigger' | 'inbound', required
    - `eventType` string, required
    - `recipientEmail` string
    - `sendId` string
    - `emailId` string
    - `emailName` string
    - `automationId` string
    - `automationName` string
    - `nodeId` string
    - `triggerEventId` string
    - `provider` string
    - `mode` 'live' | 'test'
    - `summary` string
    - `sendSource` 'audience' | 'api' | 'automation_manual' | 'automation_integration' | 'automation_custom'
    - `sendContext` string
    - `triggerProvider` string
    - `triggerTitle` string
  - `pagination` object, required
    - `limit` integer, required
    - `cursor` string, nullable, required
    - `hasMore` boolean, required
  - `range` object, required
    - `from` string, date-time, required
    - `to` string, date-time, 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.
- `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)
