Answers

How do audio ads work in OpenRTB?

Short answer

Audio inventory is offered through imp.audio, a sibling of imp.video with its own object definition. Only mimes is required; the recommended set is minduration, maxduration, protocols, and startdelay, which distinguishes pre-roll, mid-roll, and post-roll. Creatives are VAST: DAAST was folded into VAST 4.1 and later, so the protocols list is the same creative subtype list video uses. Streaming audio uses the same pod fields as CTV (poddur, podid, rqddurs, slotinpod, mincpmpersec), and audio-specific fields cover feed type, whether the ad is stitched server-side, volume normalisation, and companion display units.

Audio is its own impression object

Programmatic audio, streaming music, radio simulcast, and podcasts, is sold through imp.audio. It sits alongside banner, video, and native on the impression, and like them it can be combined: an impression that carries both audio and banner is offering an audio ad with a companion display unit.

A bid on an audio impression sets mtype to 3, and the markup in adm is VAST XML. If the exchange is going to check that the markup matches what was offered, and most do, an audio bid returning display markup is dropped with loss reason 204.

The fields, and which ones you cannot skip

FieldStatusWhat it decides
mimesRequiredWhich audio formats the player accepts
minduration, maxdurationRecommendedThe length window the creative must fall inside
protocolsRecommendedAccepted creative subtypes: VAST versions and legacy DAAST
startdelayRecommendedPre-roll (0), mid-roll at a known offset (>0), generic mid-roll (-1), generic post-roll (-2)
feedOptionalMusic service, broadcast simulcast, podcast, from the AdCOM Feed Types list
stitchedOptionalWhether the ad is inserted server-side into the stream
nvolOptionalVolume normalisation mode applied to the stream
companionad, companiontypeOptionalDisplay units shown alongside the audio ad, described as Banner objects
podid, poddur, rqddurs, slotinpod, maxseq, mincpmpersec, durfloorsOptionalAd break structure and duration-based pricing, identical in shape to video

A minimal audio impression

"imp": [{
  "id": "1",
  "audio": {
    "mimes": ["audio/mp4", "audio/mpeg"],
    "minduration": 10,
    "maxduration": 30,
    "protocols": [7, 8],
    "startdelay": -1,
    "feed": 3,
    "stitched": 1,
    "companiontype": [1, 2]
  },
  "bidfloor": 18.0,
  "bidfloorcur": "USD"
}]

This says: a mid-roll slot in a podcast, ten to thirty seconds, VAST 4.0 or its wrapper, stitched server-side, companion static or HTML resources accepted, floor of $18 CPM. startdelay of -1 is the generic mid-roll value, used when the exact position in the stream is not known at request time; -2 is generic post-roll.

What is different about the surrounding request

  • Context is usually app. Streaming audio lives in mobile apps, smart speakers, and car head units, so app plus device.devicetype and device.ifa carry more weight than any page-level signal.
  • Content metadata matters more. The Content object's artist, album, isrc, series, and genre fields exist for exactly this channel, and podcast buyers target on them.
  • No viewability. Audio has no visual surface, so measurement is completion-based. Companion banners are the only visual inventory, and they may never render on a screenless device.
  • Duration pricing is common. durfloors and mincpmpersec apply to imp.audio exactly as they do to video. See bid floors.

The mistakes that break audio requests

Three recur. Copying a video builder and leaving visual fields behind produces openrtb.field.undefined for things like plcmt or linearity under audio, which do not exist there. Omitting mimes makes the impression unbiddable and trips openrtb.field.required. And declaring pod fields such as mincpmpersec without any pod context produces a warning, because duration-based pricing with no declared break structure is almost always a builder bug. Paste a real audio request into the tester to see which applies. Pod mechanics are covered in CTV and ad pods.

Sources