---
title: "Broadcast pivot table"
method: POST
path: "/measurement/campaigns/{campaign_id}/dashboard/radio"
tags: ["Queries"]
---

# Broadcast pivot table

`POST /measurement/campaigns/{campaign_id}/dashboard/radio`

## Request

- Base URL: `https://api.magellan.ai/v2`
- URL: `https://api.magellan.ai/v2/measurement/campaigns/{campaign_id}/dashboard/radio`
- Auth: API key in header `Authorization`

Delivers a pivot table in CSV format of campaign broadcast attribution data, broken out by line item order ID and date. (Note: if broadcast attribution is not configured for the specified campaign, this endpoint will return HTTP 401 Unauthorized.)

## Path parameters

- `campaign_id` string, required

## Request body

- object
  - `startDate` string, date, required: A start date in YYYY-MM-DD format.
  - `endDate` string, date, required: An end date in YYYY-MM-DD format.
  - `timezone` string: The timezone used to interpret the date range. Defaults to the campaign's configured time zone (or UTC).
  - `attributionMethodology` 'last_touch' | 'equal_credit' | 'equal_credit_adjusted_display_weight': Methodology option between last_touch, equal_credit, and equal_credit_adjusted_display_weight. If blank or broadcast, defaults to campaign setting (or last_touch).
  - `dateFilterSource` 'exposure' | 'event': Export filter option by exposure date or event date. Defaults to campaign setting (or exposure).
  - `callbackUrl` string, uri: HTTPS URL to receive completion/failure events.
  - `attributionWindow` 1 | 3 | 7 | 14 | 30 | 60 | 90: How many days after an exposure a related conversion/response event may be attributed to it.
  - `cellTowerMatching` boolean: Whether to include IP-direct matches within a pre-defined window (usually 2 hours) for impressions and conversion/response events that cannot be matched to a household via the device graph.

## Response `200`

OK

- AsyncQuery
  - `id` string, uuid, required
  - `campaignId` string, required
  - `status` 'PENDING' | 'RUNNING' | 'COMPLETE' | 'FAILED', required
  - `callbackUrl` string, uri
  - `results` string, uri
  - `attributionWindow` 1 | 3 | 7 | 14 | 30 | 60 | 90: How many days after an exposure a related conversion/response event may be attributed to it.
  - `startDate` string, date, required
  - `endDate` string, date, required
  - `cellTowerMatching` boolean: Whether to include IP-direct matches within a pre-defined window (usually 2 hours) for impressions and conversion/response events that cannot be matched to a household via the device graph.
  - `timeScale` 'daily' | 'weekly' | 'all': Specifies the level at which the returned pivot data will be aggregated.
  - `geo` 'dma' | 'zip_code': DEPRECATED; this should now be included in the `query` configuration field. Used to signify data should be pivoted by geo. When this attribute is present, the pivot data will also utilize the `timeScale` specified.

## Other responses

- `302`: Duplicate query found
- `401`: Unauthorized. When the access token is missing, invalid, expired or revoked, the body is empty. When the token is valid but its user may not access the resource, the body is an `Error`.
- `403`: The access token has a scope, such as an MCP token. The v2 API only accepts unscoped tokens.
- `404`: Not Found
- `422`: Unprocessable Content

## Changes

- **2026-11-03** `beceb462c707`: 1 breaking, 8 warning, 4 info
  - added `#/components/schemas/ReportCommonAttributes, #/components/schemas/ReportDashboardAttributes` to the request body `allOf` list
  - removed the request property `attributionMethodology`
  - removed the request property `attributionWindow`
  - removed the request property `callbackUrl`
  - …9 more

[Operation history](https://skmtc.dev/magellan/apis/magellan-ai-api/changes/measurement/campaigns/:campaign_id/dashboard/radio/post.md)

---

[API](https://skmtc.dev/magellan/apis/magellan-ai-api.md) - [All operations](https://skmtc.dev/magellan/apis/magellan-ai-api/llms.txt) - [OpenAPI document](https://skmtc.dev/magellan/apis/magellan-ai-api/revisions/beceb462c707?raw)
