> ## Documentation Index
> Fetch the complete documentation index at: https://docs.adcontextprotocol.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Radio creative

> Canonical hosted-audio contracts for file-based broadcast radio spots.

Broadcast radio spots use the canonical `audio_hosted` format. They do not require a new canonical: the product narrows hosted audio to a fixed duration, file specification, loudness profile, and a single audio slot.

## Reference format declarations

The following :15, :30, and :60 declarations use a common production profile: MP3, AAC, or WAV; 48 kHz stereo; at least 192 kbps where bitrate applies; and -16 LUFS/LKFS ±2 dB. A station or network may publish a different accepted profile.

The canonical parameter is historically named `audio_codecs`, but its vocabulary includes the WAV container label. In these declarations, `wav` means that a WAV delivery file is accepted; a matching manifest reports `container_format: "wav"` and its underlying codec, normally `codec: "pcm"`. Validators should compare the declared `wav` value with the asset container rather than reject the asset because its codec is PCM.

### :15 spot

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/3.2.0-beta.7/core/product-format-declaration.json",
  "format_option_id": "broadcast_radio_15s",
  "display_name": "Broadcast radio :15 spot",
  "applies_to_channels": ["radio"],
  "format_kind": "audio_hosted",
  "params": {
    "duration_ms_exact": 15000,
    "audio_codecs": ["mp3", "aac", "wav"],
    "audio_sample_rates": [48000],
    "audio_channels": ["stereo"],
    "min_bitrate_kbps": 192,
    "loudness_lufs": -16,
    "loudness_tolerance_db": 2,
    "true_peak_dbfs": -2,
    "asset_source": "buyer_uploaded",
    "buyer_asset_acceptance": "accepted",
    "composition_model": "deterministic",
    "slots": [
      { "asset_group_id": "audio_main", "asset_type": "audio", "required": true }
    ]
  }
}
```

### :30 spot

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/3.2.0-beta.7/core/product-format-declaration.json",
  "format_option_id": "broadcast_radio_30s",
  "display_name": "Broadcast radio :30 spot",
  "applies_to_channels": ["radio"],
  "format_kind": "audio_hosted",
  "params": {
    "duration_ms_exact": 30000,
    "audio_codecs": ["mp3", "aac", "wav"],
    "audio_sample_rates": [48000],
    "audio_channels": ["stereo"],
    "min_bitrate_kbps": 192,
    "loudness_lufs": -16,
    "loudness_tolerance_db": 2,
    "true_peak_dbfs": -2,
    "asset_source": "buyer_uploaded",
    "buyer_asset_acceptance": "accepted",
    "composition_model": "deterministic",
    "slots": [
      { "asset_group_id": "audio_main", "asset_type": "audio", "required": true }
    ]
  }
}
```

### :60 spot

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/3.2.0-beta.7/core/product-format-declaration.json",
  "format_option_id": "broadcast_radio_60s",
  "display_name": "Broadcast radio :60 spot",
  "applies_to_channels": ["radio"],
  "format_kind": "audio_hosted",
  "params": {
    "duration_ms_exact": 60000,
    "audio_codecs": ["mp3", "aac", "wav"],
    "audio_sample_rates": [48000],
    "audio_channels": ["stereo"],
    "min_bitrate_kbps": 192,
    "loudness_lufs": -16,
    "loudness_tolerance_db": 2,
    "true_peak_dbfs": -2,
    "asset_source": "buyer_uploaded",
    "buyer_asset_acceptance": "accepted",
    "composition_model": "deterministic",
    "slots": [
      { "asset_group_id": "audio_main", "asset_type": "audio", "required": true }
    ]
  }
}
```

## Creative identifiers

Use the manifest's `industry_identifiers` list for the traffic or clearance identifier expected by the broadcaster. AdCP supports `ad_id`, `isci`, `clearcast_clock`, and `idcrea`; choose the identifier used by the applicable market and traffic system. Each duration cut should carry its own identifier.

```json theme={null}
{
  "$schema": "https://adcontextprotocol.org/schemas/3.2.0-beta.7/core/creative-manifest.json",
  "format_kind": "audio_hosted",
  "format_option_ref": {
    "scope": "product",
    "format_option_id": "broadcast_radio_30s"
  },
  "industry_identifiers": [
    { "type": "isci", "value": "NOVA123430" }
  ],
  "assets": {
    "audio_main": {
      "asset_type": "audio",
      "url": "https://cdn.novamotors.example/radio/summer-30.wav",
      "duration_ms": 30000,
      "container_format": "wav",
      "codec": "pcm",
      "sampling_rate_hz": 48000,
      "channels": "stereo",
      "bitrate_kbps": 1536,
      "loudness_lufs": -16,
      "true_peak_dbfs": -2
    }
  }
}
```

## No VAST or tracker semantics

The reference declarations contain only the required `audio_main` file slot. Terrestrial broadcast radio has no renderer in which a VAST/DAAST tag, impression pixel, click tracker, or clickthrough URL can operate. Their absence is part of the format contract; do not add tracker slots or represent these spots as `audio_daast`.

Digital streaming or SSAI inventory is a separate execution context. It may use `audio_hosted` with explicitly declared impression, click, or other supported `pixel_tracker` slots. Standardized audio quartile and completion tag events use `audio_daast`. A terrestrial spot simulcast digitally does not make trackers operational on the terrestrial airing.

## Delivery measurement and reconciliation

Radio plans, guarantees, and reconciles on measured audience — panel data (Nielsen Audio in the US, RAJAR in the UK), not served-event counts. Three declarations carry the whole contract:

* **Demographic notation** — `demographic_system` on the CPP pricing option and forecast (e.g. `nielsen_audio` with `demographic: "P25-54"`) says how the audience is written.
* **Provider identity** — `measurement_source` on forecast and delivery rows (e.g. `nielsen_audio`, `rajar`) says whose data produced the numbers. Notation and provider are separate declarations: RAJAR is a `measurement_source`, not a notation system.
* **Maturation** — delayed panel publication reuses the existing `measurement_windows` contract (`is_final`, `finalized_at`), the same preliminary→final semantics broadcast uses for C3/C7. There is no separate phase vocabulary.

A buy committed to `grps` against `P25-54` on `nielsen_audio` reconciles when the delivery row carries the same declarations:

```json theme={null}
{
  "grps": 84.2,
  "measurement_source": "nielsen_audio",
  "is_final": true,
  "finalized_at": "2026-10-12T00:00:00Z"
}
```

Panel data arrives on the panel's publication cycle — declare `weekly` (or coarser) in `reporting_capabilities.available_reporting_frequencies`, and buyers treat that cadence as an optimization-eligibility gate: nothing should mid-flight-optimize against numbers that publish weekly. Station affidavits and playout logs prove that scheduled spots aired; the audience currency turns those airings into the audience-size number.

See [Audio](/dist/docs/3.2.0-beta.7/creative/channels/audio), [Broadcast](/dist/docs/3.2.0-beta.7/creative/channels/broadcast), and [Creative manifests](/dist/docs/3.2.0-beta.7/creative/creative-manifests).
