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

# Audience Attribution Breakdown

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

## Request

- Base URL: `https://api.superwall.com`
- URL: `https://api.superwall.com/v2/campaigns/{id}/audiences/{audience_id}/attribution`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `accounts_superwall_token`
  - HTTP bearer

Per-variant paywall viewers, views, conversions, trial starts, paid users and proceeds grouped by install-attribution source (network, campaign, ad set, ad, or Apple Search Ads keyword) — the `acquisition_*` user attributes set by Superwall MMP, Apple Search Ads or another MMP. Each viewer counts toward their latest source within a variant; conversions and proceeds follow the converting user. Narrow to one network, campaign or ad set with the matching filter to drill down. Covers a trailing window of paywall views. Requires the private campaign_attribution feature flag and campaigns:read and charts:read scopes.

## Path parameters

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

## Query parameters

- `environment` 'PRODUCTION' | 'SANDBOX'
- `dimension` 'network' | 'campaign' | 'ad_set' | 'ad' | 'keyword': Attribution level to group the audience's paywall viewers by. `keyword` applies to Apple Search Ads.
- `window` 'last_7_days' | 'last_30_days' | 'last_90_days': Paywall-view window the breakdown covers
- `network` string: Only count paywall views attributed to this network: a row's `source_id` from a breakdown by network. Combine with `network` to drill down.
- `campaign` string: Only count paywall views attributed to this campaign: a row's `source_id` from a breakdown by campaign. Combine with `network` to drill down.
- `ad_set` string: Only count paywall views attributed to this ad set: a row's `source_id` from a breakdown by ad set. Combine with `network` to drill down.
- `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 results broken down by install-attribution source

- object: Audience results broken down by install-attribution source
  - `object` 'audience_attribution', required
  - `dimension` 'network' | 'campaign' | 'ad_set' | 'ad' | 'keyword', required: Attribution level to group the audience's paywall viewers by. `keyword` applies to Apple Search Ads.
  - `window` 'last_7_days' | 'last_30_days' | 'last_90_days', required: Paywall-view window the breakdown covers
  - `date_from` string, required: ISO start of the window
  - `date_to` string, required: ISO end of the window
  - `rows` object[], required
    - `variant_id` integer, required
    - `source_key` string, required: Opaque network-scoped source identity; empty for missing attribution
    - `network` string, nullable, required: The source's `acquisition_network` (e.g. `meta`); null when absent
    - `source_id` string, nullable, required: The source's ID at this level, or its name when no ID was recorded. Pass it, with `network`, as this level's filter to drill down. null for the unattributed bucket.
    - `value` string, nullable, required: Display name at this level (e.g. the ad set name). null is the unattributed bucket: this level was absent from the viewer’s paywall views.
    - `users` number, required: Unique paywall viewers in the window
    - `views` number, required: Paywall views in the window
    - `conversions` number, required: Viewers who started a subscription (including trials) in the window, on this variant
    - `trial_starts` number, required: Viewers among those who started a trial
    - `paid` number, required: Viewers among those who have paid so far
    - `proceeds` number, required: Lifetime proceeds (USD) of the subscriptions started in the window
  - `computed_at` number, required
  - `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-10-29** `778a11cd2c15`: 5 warning, 2 info
  - added the new `credentials_missing` enum value to the `anyOf[subschema #2]/code` response property for the response status `400`
  - added the new `credentials_missing` enum value to the `code/anyOf[subschema #1]/` response property for the response status `403`
  - added the new `credentials_missing` enum value to the `code/anyOf[subschema #1]/` response property for the response status `404`
  - added the new `credentials_missing` enum value to the `code/anyOf[subschema #1]/` response property for the response status `429`
  - …3 more
- **2026-10-24** `f9828dcdf341`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/superwall/apis/superwall-api-v2/changes/v2/campaigns/:id/audiences/:audience_id/attribution/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/523b4734dfab?raw)
