---
title: "Get display performance"
method: GET
path: "/reports/displays/{display_id}"
tags: ["Reports"]
---

# Get display performance

`GET /reports/displays/{display_id}`

## Request

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

The full performance stat set for one display over a period, including
average order value and, when the display has run an A/B test, per-variation
participants, conversions, and conversion rates.

Ask this per display rather than hunting the leaderboard: unlike
`/v1/reports/displays` it reports zeroed stats for a quiet display instead
of leaving it out. The display's own configuration — triggers, schedule,
status — is `/v1/displays/{id}`, keyed on the same identifier.

**Required scope:** `reports_read`

## Path parameters

- `display_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 display's performance over the resolved period.

- object
  - `data` DisplayReportDetail: One display's report: its identity, the period-scoped `stats` block, and A/B test results when the display has ever had a test.
    - `display_id` string: The display's unique identifier. Use this value in `/v1/displays/{id}`.
    - `title` string, nullable: The display's name. `null` when the merchant never named it.
    - `display_type` string, nullable: The display's on-site shape (e.g. `popup`, `flyout`, `banner`, `bar`, `embedded_form`, `landing_page`).
    - `status` string: The display's lifecycle status (e.g. `draft`, `scheduled`, `live`, `paused`, `ended`, `archived`).
    - `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` object: Performance metrics for one display over the report period. `views` counts impressions — one per time the display loaded on a visitor's screen, so a visitor who saw it on three pages counts three times — and `signups` counts form submissions, not distinct contacts. `signup_rate` is `signups` over `views`. `attributed_orders` and `attributed_revenue` credit the display under the same last-touch rule as the rest of Privy's reporting: an order counts when the contact's most recent engagement in the 7 days before it was an open or click on a message this display sends, such as its follow-up email or SMS. They are not a count of visitors who signed up here and later bought, which is the figure Privy's own display reporting shows — expect the two to differ, and expect a display that sends no follow-up message to report zero.
      - `views` 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.
      - `signups` 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.
      - `signup_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_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.
      - `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.
    - `ab_test` DisplayReportAbTest: Results of the display's A/B test. `null` when the display has never had one; otherwise the display's currently running test, or its most recently created test once none is running. Figures cover the test's whole life and ignore the report period, so they will not line up with the surrounding `stats` block.
      - `name` string: The merchant's name for the test.
      - `state` string, nullable: The test's lifecycle state (e.g. `draft`, `active`, `finished`).
      - `goal` string, nullable: The event the test optimizes for.
      - `total_participants` integer: Visitors assigned across every variation — the sum of the variations' `participants`.
      - `winner_variation_id` string, nullable: Currently always `null` — a merged test winner is not persisted. When populated it matches a variation's `id` in `variations`.
      - `variations` DisplayReportAbTestVariation[]: One entry per arm of the test. The order is not significant — use `is_control` to find the original and `id` to key rows.
        - `id` string: Opaque, stable identifier for this variation row, prefixed `abv_`. Use it to key the `variations` array. No `/v1` resource resolves it — the prefix marks it as a report-local handle, not a lookup id. Unlike `display_id` it is always present, including for legacy variations with no display attached.
        - `display_id` string, nullable: Public id of the display this variation renders, resolvable at `GET /v1/displays/{id}`. For the control variation this is the display the report is about; each challenger is its own display. `null` only for legacy variations with no display attached — use `id` when a value is always required.
        - `name` string, nullable: Merchant-assigned label for this variation. `null` when the variation was never named.
        - `is_control` boolean: Whether this variation is the original (control) version.
        - `traffic_ratio` number: Fraction of traffic (0–1) assigned to this variation.
        - `participants` integer: Distinct visitors assigned to this variation over the test's life.
        - `conversions` integer: Goal events recorded for this variation — every occurrence, not distinct converters, so one visitor converting twice counts twice.
        - `conversion_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.

## 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/displays/:display_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)
