---
title: "List campaign performance"
method: GET
path: "/reports/campaigns"
tags: ["Reports"]
---

# List campaign performance

`GET /reports/campaigns`

## Request

- Base URL: `https://api.privy.com/v1`
- URL: `https://api.privy.com/v1/reports/campaigns`
- Auth: HTTP bearer

Every message campaign **sent in the period**, ranked by attributed
revenue, each row carrying the full channel stat block (delivery,
engagement, unsubscribes, attribution) scoped to the same period — so
period comparisons need no per-campaign detail calls. Zero-revenue
sends are listed too, ranked after the revenue rows; at most 100
campaigns are ranked, and a send with no recorded activity at all in
the period does not appear.

By default the list serves your **newsletters** — email and SMS
one-time sends. Pass `type=flows` to instead rank the **flow
campaigns**: the email and SMS messages your automation flows send
(flow rows carry no `sent_date` or `audience`, and instead name the
flow that sends them in `flow`, so attributing a message to its flow
needs no follow-up request). Use
`/v1/reports/campaigns/{campaign_id}` for one campaign's
most-clicked links or its lifetime funnel.

**Required scope:** `reports_read`

## Query parameters

- `period` 'last_7_days' | 'last_30_days' | 'last_90_days' | 'this_month' | 'last_month' | 'custom'
- `start_date` string, date
- `end_date` string, date
- `type` 'flows'
- `channel` 'email' | 'sms'
- `page` integer
- `per_page` integer

## Headers

- `Privy-Account-Id` string

## Response `200`

Campaigns ranked by attributed revenue over the resolved period.

- object
  - `data` CampaignReportRow[]
    - `campaign_id` string: The campaign's unique identifier. Use this value in `/v1/reports/campaigns/{campaign_id}`; it matches `id` in `/v1/campaigns` responses.
    - `type` 'newsletter' | 'flow': Discriminates the two campaign families — `newsletter` (email and SMS one-time sends) and `flow` (the messages automation flows send).
    - `title` string, nullable
    - `channel` 'email' | 'sms'
    - `sent_date` string, date, nullable: Newsletter rows only — flow campaigns send continuously, so their rows omit this field.
    - `audience` CampaignReportAudience: Saved segment names the send targeted and excluded. Smart-segment audiences carry no saved name and are omitted.
      - `included_segments` string[]
      - `excluded_segments` string[]
    - `flow` CampaignFlowRef: The automation flow that sends this campaign. Pass `id` to `GET /v1/flows/{id}` for the flow's trigger, filters, and node graph.
      - `id` string: The flow's identifier, as returned by `GET /v1/flows`.
      - `title` string, nullable
    - `stats` CampaignReportFunnelStats: The campaign's engagement funnel over the window the response covers — the resolved report period on list rows and period-scoped detail reads, or the campaign's whole life on the default (no-period) detail read. Email campaigns carry `delivery_rate`, `opened_unique`, `open_rate`, `bounced`, `bounce_rate`, `spam_reports`, `unsubscribed`, `unsubscribe_rate`, and `average_order_value`; SMS campaigns carry `opted_out` and `failed`; both carry the rest. `attributed_orders` and `attributed_revenue` credit the campaign when one of its messages was the contact's most recent engagement — email open, email click, or SMS click — in the 7 days before the order was placed. `order_rate` is those orders over the messages the campaign got out: email deliveries for an email campaign, sends for an SMS one — so an SMS campaign's `order_rate` is not directly comparable with an email campaign's (undelivered messages still sit in the denominator). The rates do not share one denominator. `delivery_rate` and `bounce_rate` are over `sent`; `open_rate`, `click_rate` and `unsubscribe_rate` are over `delivered`. `unsubscribed`, `bounced` and `spam_reports` count every event, while `opened_unique` and `clicked_unique` de-duplicate — but only against the previous month, so on a campaign that has been sending for longer, which includes any long-running flow campaign, a contact who re-engages after that gap is counted again and these counters drift above the true number of distinct contacts. `average_order_value` is `attributed_revenue / attributed_orders`, reported as 0 when there are no attributed orders. SMS stat blocks carry no `average_order_value` — divide `attributed_revenue` by `attributed_orders` yourself.
      - `sent` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `delivered` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `delivery_rate` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `opened_unique` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `open_rate` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `clicked_unique` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `click_rate` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `bounced` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `bounce_rate` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `spam_reports` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `unsubscribed` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `unsubscribe_rate` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `opted_out` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `failed` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `attributed_orders` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `order_rate` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `attributed_revenue` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
      - `average_order_value` ReportMetric: A single report metric with its unit. `count` values are whole numbers, `percent` values are 0–100 with one decimal. Money metrics carry the account's lowercased ISO 4217 currency code as their unit (e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major units, two decimals. A rate whose denominator was zero reports 0, not null — so 0 does not distinguish "no activity" from "activity that never converted"; read the underlying counts to tell those apart.
        - `value` number
        - `unit` string: `count`, `percent`, or a lowercased ISO 4217 currency code.
  - `period` ReportPeriod: The resolved date range the report covers, inclusive, in the account's time zone. Every label except `last_month` ends today, so the last day of the range is still in progress: `last_7_days` is the six days before today plus today, `this_month` runs from the 1st through today, and `last_month` is the whole previous calendar month. Custom ranges cannot exceed 366 days.
    - `label` 'last_7_days' | 'last_30_days' | 'last_90_days' | 'this_month' | 'last_month' | 'custom'
    - `start_date` string, date
    - `end_date` string, date
  - `pagination` PaginationEnvelope
    - `page` integer
    - `per_page` integer
    - `total_count` integer
    - `total_pages` integer

## Other responses

- `401`: Missing or invalid bearer token.
- `403`: `insufficient_scope` when the token lacks the required scope for this endpoint.
- `422`: One or more fields failed validation.
- `429`: Rate limit exceeded. Retry after the specified time.

## Changes

- **2026-11-05** `cf0885e90d5a`: 8 warning
  - added the new `forbidden` enum value to the `error/code` response property for the response status `401`
  - added the new `forbidden` enum value to the `error/code` response property for the response status `403`
  - added the new `forbidden` enum value to the `error/code` response property for the response status `422`
  - added the new `forbidden` enum value to the `error/code` response property for the response status `429`
  - …4 more
- **2026-11-03** `fe500ab59b3b`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/privy/apis/privy-api/changes/reports/campaigns/get.md)

---

[API](https://skmtc.dev/privy/apis/privy-api.md) - [All operations](https://skmtc.dev/privy/apis/privy-api/llms.txt) - [OpenAPI document](https://skmtc.dev/privy/apis/privy-api/revisions/bc29b48dcdd2?raw)
