---
title: "Get campaign performance"
method: GET
path: "/reports/campaigns/{campaign_id}"
tags: ["Reports"]
---

# Get campaign performance

`GET /reports/campaigns/{campaign_id}`

## Request

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

One message campaign's engagement funnel — sends, deliveries, opens,
clicks, attribution, and the derived rates — plus its most-clicked
links. Resolves newsletters and flow campaigns alike (flow campaigns
carry no `sent_date`, and instead name the flow that sends them in
`flow`). SMS campaigns return the SMS stat set (`opted_out`,
`failed`) and no links.

Without period parameters the funnel covers the campaign's **whole
life**. Pass `period` (or `period=custom` with `start_date`/`end_date`)
to scope it to a reporting window — the same window vocabulary as
every other report read, so its numbers line up with
`/v1/reports/campaigns` rows for the same period. The response echoes
the window in `period`; `null` means lifetime. `top_links` is always
lifetime — link clicks are not stored by day.

The campaign's configuration is `/v1/campaigns/{id}`.

**Required scope:** `reports_read`

## Path parameters

- `campaign_id` string, required

## 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

## Headers

- `Privy-Account-Id` string

## Response `200`

The campaign's engagement funnel — lifetime, or scoped to the requested period.

- object
  - `data` CampaignReportDetail
    - `campaign_id` string: The campaign's unique identifier. 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'
    - `ab_test` CampaignReportAbTest: Results of the newsletter's A/B test: the winner and each version's figures. `null` when the campaign is not a test. Each version carries two blocks. `decision` is the winning metric over the decision window, the figures the winner was chosen on. `stats` is the version's lifetime performance in the campaign-level shape, including revenue and deliverability. `results_source` and `measured_at` describe `decision` only. A decided test serves the snapshot frozen at `decision_due_at`, so it does not move as late opens arrive. Any other test counts `decision` within the last 10 minutes, bounded by `decision_due_at` once it is set. A test decided before the current snapshot format has no readable snapshot, so it reports `live` figures recounted within its decision window even though a winner is set; those can differ slightly from the figures the winner was actually chosen on.
      - `state` 'draft' | 'scheduled' | 'preparing' | 'awaiting_winner' | 'sending' | 'sent' | 'partially_sent' | 'canceled' | 'unsent': The campaign's send lifecycle, the same value as `status` on `/v1/campaigns`. `preparing`, `awaiting_winner` and `sending` mean the test is still running.
      - `winning_metric` 'open_rate' | 'click_rate' | 'order_rate' | 'null', nullable: The metric the winner is chosen on, reported in each version's `decision`.
      - `results_source` 'snapshot' | 'live': `snapshot` — frozen figures the winner was decided on. `live` — counted within the last 10 minutes; the numbers can still move. A decided test with no readable snapshot also reports `live`, bounded by `decision_due_at`.
      - `measured_at` string, date-time: When the `decision` figures were taken: the snapshot's cutoff, or for live figures `decision_due_at` once it has passed, and otherwise the time they were counted, up to 10 minutes before this request.
      - `decision_due_at` string, date-time, nullable: When the decision window closes. `null` until the test audience has finished sending, including while an `awaiting_winner` test is still sending to it, and for a test that ended before then.
      - `winner_selected_at` string, date-time, nullable: When a winner was committed. `null` until then.
      - `completed_at` string, date-time, nullable: When the winning version finished sending to the remainder. `null` until then, and for a canceled or failed test.
      - `winner_version_id` string, nullable: The `id` of the winning version. `null` until a winner is committed.
      - `selection_reason` 'highest_metric' | 'tie_control' | 'tie_random' | 'no_data_control' | 'null', nullable: Why the winning version was chosen. `null` until a winner is committed. - `highest_metric` — one version led on the metric. - `tie_control` — versions tied and the control was among them, so the control was kept. - `tie_random` — versions tied with no control among them, so one was picked at random. - `no_data_control` — nothing was delivered for any version, so the control was kept by default.
      - `audience` object: The audience split, populated when generation runs — every count is `null` on a test that has not launched.
        - `eligible_count` integer, nullable: Contacts matching the campaign's audience.
        - `test_count` integer, nullable: Contacts in the test cohort, across all versions.
        - `remainder_count` integer, nullable: Contacts held back to receive the winning version after the decision. Zero when the versions' shares consume the whole audience — a legitimate setup that leaves nobody for the winner to be sent to.
      - `versions` CampaignReportAbTestVersion[]: The versions in labelled order (A, B, C…); the control is first.
        - `id` string: Opaque, stable version identifier, prefixed `cpv_`. The same id as the version on `GET /v1/campaigns/{id}`.
        - `name` string
        - `is_control` boolean
        - `is_winner` boolean: Whether this version won. `false` on every version until a winner is committed.
        - `audience_share` number, nullable: Share of the eligible audience (0–1) this version was sent to during the test.
        - `subject` string, nullable: This version's human-readable label: its subject line, or its message body for SMS.
        - `decision` CampaignReportAbTestVersionDecision: The winning metric for one version over the decision window — the figures the winner is chosen on. Frozen once a winner is committed; before that, counted within the last 10 minutes and bounded by `decision_due_at` once it is set.
          - `metric_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.
          - `numerator` 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.
          - `denominator` 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.
        - `stats` CampaignReportAbTestVersionStats: 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.
          - `assigned` 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.
          - `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.
        - `top_links` CampaignReportLink[]: This version's most-clicked links, best first, deduped by URL — at most 100 links are reported. Lifetime clicks, like `stats`. Email tests only; absent for SMS.
          - `url` string
          - `name` string, nullable: The link's display name from the email content, when one was set.
          - `clicks` integer
    - `sent_date` string, date, nullable: Newsletters only — flow campaigns send continuously, so their detail omits this field.
    - `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
    - `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
    - `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.
    - `top_links` CampaignReportLink[]: The campaign's most-clicked links, best first, deduped by URL — at most 100 links are reported. For an A/B test these are the control version's links; every version's own are on `ab_test.versions[].top_links`. Email campaigns only; absent for SMS campaigns.
      - `url` string
      - `name` string, nullable: The link's display name from the email content, when one was set.
      - `clicks` integer

## Other responses

- `401`: Missing or invalid bearer token.
- `403`: `insufficient_scope` when the token lacks the required scope for this endpoint.
- `404`: The requested resource does not exist or does not belong to your account.
- `422`: One or more fields failed validation.
- `429`: Rate limit exceeded. Retry after the specified time.

## Changes

- **2026-11-05** `cf0885e90d5a`: 10 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 `404`
  - added the new `forbidden` enum value to the `error/code` response property for the response status `422`
  - …6 more
- **2026-11-03** `fe500ab59b3b`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/privy/apis/privy-api/changes/reports/campaigns/:campaign_id/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)
