---
title: "Audience Readout"
method: GET
path: "/v2/campaigns/{id}/audiences/{audience_id}/readout"
tags: ["Campaigns V2"]
---

# Audience Readout

`GET /v2/campaigns/{id}/audiences/{audience_id}/readout`

Returns per-variant (or per-placement) conversion metrics for the audience's experiment — users, views, transaction completes and rates, proceeds, trial starts/conversions and confidence intervals — computed from the revenue analytics UDF. Requires campaigns:read scope.

## Path parameters

- `id` string, required
- `audience_id` string, required

## Query parameters

- `environment` 'PRODUCTION' | 'SANDBOX'
- `breakdown` 'variantId' | 'placement' — Breakdown dimension for readout rows
- `variant_ids` union — Restrict the readout to these variant ids (comma-joined or repeated). When omitted, all of the audience's variants are included. Lets the placement breakdown honor the paywall selection.
  - string
  - string[]
- `refresh` 'true' | 'false' — Bypass the cached snapshot and force a fresh computation

## Response `200`

Audience readout (variant/placement conversion metrics)

- object — Audience readout (variant/placement conversion metrics)
  - `object` 'audience_readout', required — Object type, always `audience_readout`
  - `columns` string[], required — Metric column keys present on each row
  - `rows` object[], required — One row per breakdown value, plus a totals row (`is_totals = 1`)
    - `breakdown` unknown, required
    - `product_id` string[], nullable, required
    - `is_totals` number, nullable, required — 1 for the totals row, 0 otherwise
    - `users` number, nullable, required
    - `views` number, nullable, required
    - `views_per_user` number, nullable, required
    - `transaction_complete` number, nullable, required
    - `transaction_complete_rate` number[], nullable, required — Confidence interval [lower, point, upper]
    - `trial_start` number, nullable, required
    - `trial_start_percent` number, nullable, required
    - `trial_start_rate` number[], nullable, required — Confidence interval [lower, point, upper]
    - `trial_pending` number, nullable, required — Started trials with no expiration or paid renewal yet, excluding trials whose latest store event is a billing issue
    - `trial_billing_issue` number, nullable — Started trials whose latest store event is a billing issue. Not counted as pending and excluded from projections
    - `trial_billing_issue_rate` number[], nullable — trial_billing_issue / trial_start as [lower, point, upper]
    - `trial_conversion` number, nullable, required
    - `trial_expiration` number, nullable, required
    - `trial_conversion_rate` number[], nullable, required — Confidence interval [lower, point, upper]
    - `trial_cancellation` number, nullable, required
    - `trial_cancellation_rate` number[], nullable, required — Confidence interval [lower, point, upper]
    - `resubscribe` number, nullable, required
    - `resubscribe_rate` number[], nullable, required — Confidence interval [lower, point, upper]
    - `product_change` number, nullable, required
    - `product_change_conversion` number, nullable, required
    - `direct_sub` number, nullable, required
    - `direct_sub_percent` number, nullable, required
    - `direct_sub_rate` number[], nullable, required — Confidence interval [lower, point, upper]
    - `non_renewing_purchase` number, nullable, required
    - `non_renewing_purchase_rate` number[], nullable, required — Confidence interval [lower, point, upper]
    - `renewals` number, nullable, required
    - `subscription_cancellation` number, nullable, required
    - `subscription_cancellation_rate` number[], nullable, required — Confidence interval [lower, point, upper]
    - `paid` number, nullable, required
    - `new_paid_subscription` number, nullable, required
    - `renewing_paid_subscription` number, nullable, required
    - `cancelled_paid_subscription` number, nullable, required
    - `expired_paid_subscription` number, nullable, required
    - `proceeds` number, nullable, required
    - `trial_conversion_proceeds` number, nullable, required
    - `proceeds_per_trial_conversion` number, nullable, required
    - `direct_sub_proceeds` number, nullable, required
    - `proceeds_per_direct_sub` number, nullable, required
    - `new_paid_subscription_proceeds` number, nullable, required
    - `proceeds_per_new_paid_subscription` number, nullable, required
    - `non_renewing_purchase_proceeds` number, nullable, required
    - `proceeds_per_non_renewing_purchase` number, nullable, required
    - `revenue` number, nullable, required
    - `refunds` number, nullable, required
    - `refund_rate` number, nullable, required
    - `missing_integration_events` number, nullable, required
    - `transaction_health_check` number, nullable, required
    - `subscription_health_check` number, nullable, required
    - `trial_health_check` number, nullable, required
    - `proj_pending_trial_conversions` number[], nullable, required — Confidence interval [lower, point, upper]
    - `proj_pending_trial_conversion_proceeds` number[], nullable, required — Confidence interval [lower, point, upper]
    - `proj_proceeds` number[], nullable, required — Confidence interval [lower, point, upper]
    - `proj_proceeds_per_user` number[], nullable, required — Confidence interval [lower, point, upper]
  - `computed_at` number, required — Epoch milliseconds when the returned snapshot was produced. Served from a shared, edge-cached snapshot; re-request with `refresh=true` to force a fresh computation.
  - `revalidating` boolean — True when the returned snapshot is stale and the server is recomputing it in the background; a later request returns the refreshed snapshot.

## Other responses

- `400` — The request did not match the expected schema | The request was invalid or malformed
- `401` — No API key was provided in the request | The API key does not have a valid format | The API key is invalid or has been revoked | An error occurred while validating the API key | The session cookie is invalid or expired
- `403` — The API key does not have permission to perform this action
- `404` — The requested resource was not found
- `429` — Too many requests have been made in a short period
- `500` — An unexpected error occurred on the server

## Changes

- **2026-09-30** `bfb85c07a3d3` — 1 info
  - added the optional property `revalidating` to the response with the `200` status
- **2026-09-17** `17f24eb0ac1a` — 2 info
  - added the optional property `rows/items/trial_billing_issue` to the response with the `200` status
  - added the optional property `rows/items/trial_billing_issue_rate` to the response with the `200` status
- **2026-09-09** `217c96dc9a29` — 36 breaking, 138 info
  - removed the enum value `PRODUCTION` from the `query` request parameter `environment`
  - removed the enum value `SANDBOX` from the `query` request parameter `environment`
  - removed the enum value `false` from the `query` request parameter `refresh`
  - removed the enum value `placement` from the `query` request parameter `breakdown`
  - …170 more
  - …this revision’s changelog is incomplete

[Change history](https://skmtc.dev/superwall/apis/superwall-api-v2/changes/v2/campaigns/:id/audiences/:audience_id/readout/get.md)

---

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