Custom Grouping
Generate a CSV with a combination of reporting dimensions. Supports the reporting filters and attribution settings used by other CSV reports.
publisher groups by the publisher assigned to the purchase, as in By Publisher, not the publisher received in a pixel.
For Show groupings, Publisher and Publisher ID identify publishers assigned to contributing purchases for that Show or Episode, including run-of-network delivery. When no purchase is resolved, Publisher falls back to the Show’s publisher.
app groups by the listener application. Missing App and Device values are exported as Unknown; delivery remains in its original group.
Selected dimensions add CSV columns: Campaign, Show, Episode, Publisher, Creative ID, App, Device, Country, Region, DMA and ZIP.
When Show is selected, Show ID is included by default at the end of the columns. An explicit fields list controls whether Show ID is included.
Campaign grouped with one location dimension uses the Geo column. The UI selects this column by default; an explicit fields list controls its inclusion.
Campaign and Publisher grouping combines delivery and spend in one row per selected campaign, publisher and time period. Summed spend is rounded to two decimal places.
Creative grouping also appends Creative Name to the CSV. It contains the saved creative name, or the Creative ID when no name is available.
Creative Name respects column selection through fields and renaming through fieldMapping, including Campaign + Creative reports.
Metrics retain their existing CSV names, including Spend, Podcast & Streaming Impressions and optional Delivered Contracted Impressions.
The response is a file-processing task. Poll its status and download the completed CSV.
Requests are subject to a report complexity limit based on the selected dimensions, date range and time grouping. Episode + ZIP combinations also account for the selected Campaign and Episode filters and the largest time period being calculated. Narrowing inclusion filters can reduce complexity; excluding campaigns does not reduce this estimate. Requesting Delivered Contracted Impressions can increase complexity.
If the limit is exceeded, the endpoint returns HTTP 400. Shorten the date range, select fewer Campaigns or Episodes, or remove some column groupings before retrying.
const url = 'https://backend.podscribe.ai/api/public/reports/custom-grouping';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"advertiser":["example"],"startDate":"2026-04-15","endDate":"2026-04-15","groupings":["campaign"],"timeGrouping":"all","aggregateEpisodicBuysPerShow":true}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}import requests
url = "https://backend.podscribe.ai/api/public/reports/custom-grouping"
payload = { "advertiser": ["example"], "startDate": "2026-04-15", "endDate": "2026-04-15", "groupings": ["campaign"], "timeGrouping": "all", "aggregateEpisodicBuysPerShow": True}headers = { "Authorization": "Bearer <token>", "Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.json())curl --request POST \ --url https://backend.podscribe.ai/api/public/reports/custom-grouping \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "advertiser": [ "example" ], "startDate": "2026-04-15", "endDate": "2026-04-15", "groupings": [ "campaign" ], "timeGrouping": "all", "aggregateEpisodicBuysPerShow": true }'Request Bodyrequired
Section titled “Request Bodyrequired”Combine episodic buys for the same campaign and show instead of separating episode rows.
Response Body
Section titled “Response Body”File-processing task created or reused.
{ "id": "example", "status": "example", "url": "example"}