UniversalAdId: one creative, one identity
UniversalAdId is the VAST element that gives a creative a single identity across every system that touches it. Ad servers, DSPs, SSPs, and verification vendors each assign their own internal creative IDs, and none of them match. The UniversalAdId, typically a registered Ad-ID code, is the one identifier that means the same creative everywhere.
The element was introduced in VAST 4.0 and is required inside the <Creative> of every InLine ad from 4.0 onward.
Why creative identity is a money problem
Several revenue-adjacent systems only work if the same creative is recognizable as the same creative across platforms:
- Frequency capping. A viewer who sees the same spot on two apps and a CTV channel counts as three exposures to three different internal IDs. Cross-platform caps need one ID.
- Creative deduplication in pods. Two DSPs win adjacent slots in the same ad pod with the same creative under different internal IDs. Pod dedup logic can only catch it via UniversalAdId.
- Competitive separation. Keeping two car brands out of the same break requires knowing what the creatives actually are, not what each seller labeled them.
- Audits and brand safety. Tracing one creative across a quarter of delivery logs from different vendors requires a join key.
This is also one of the quiet casualties of version downgrades: when a 4.x tag is re-rendered as VAST 2.0 or 3.0 for compatibility, UniversalAdId has no home and the identity is stripped. The version mismatch post covers that failure mode.
Syntax by VAST version
The element's shape changed in 4.2, and the difference is a recurring source of invalid tags.
VAST 4.0 and 4.1: idValue attribute
<Creative id="5480" sequence="1">
<UniversalAdId idRegistry="Ad-ID" idValue="CNPA0484000H">CNPA0484000H</UniversalAdId>
<Linear>...</Linear>
</Creative>VAST XML fragment only. This excerpt belongs inside a complete VAST document, so standalone validation will fail until it is wrapped in a full <VAST>response.
VAST 4.2 and 4.3: value in text content, multiple IDs allowed
<Creative id="5480" sequence="1">
<UniversalAdId idRegistry="Ad-ID">CNPA0484000H</UniversalAdId>
<UniversalAdId idRegistry="clearcast.co.uk">AAA/BBBB123/030</UniversalAdId>
<Linear>...</Linear>
</Creative>VAST XML fragment only. This excerpt belongs inside a complete VAST document, so standalone validation will fail until it is wrapped in a full <VAST>response.
idRegistry(required): the registry that issued the ID.Ad-IDis the standard registry for US commercial creative; Clearcast serves the same role in the UK. When no registry ID exists, useunknownand supply your ad server's creative ID as the value.- The value: in 4.0/4.1, both the
idValueattribute and the text content (kept identical); in 4.2+, text content only. - Multiplicity: exactly one element through 4.1; one or more in 4.2+.
UniversalAdId vs the other identifiers in a tag
| Identifier | Identifies | Scope |
|---|---|---|
UniversalAdId | The creative asset | Global, cross-system, stable across campaigns |
Creative id attribute | The creative in one ad server | Private to that system |
Ad id attribute | The ad buy wrapping the creative | Private to that system |
AdServingId (VAST 4.1+) | One serving transaction | Unique per impression, used to join logs across parties |
Common UniversalAdId mistakes
- Missing entirely in a 4.x InLine. The element is required from 4.0 onward; its absence is a spec violation that vastlint flags.
idValueunder version 4.2 or 4.3. The attribute was removed; strict parsers read only text content and may see an empty identifier.- Attribute and content disagreeing in 4.0/4.1. When both carry a value, they must match; a mismatch means downstream systems disagree about which creative played.
idRegistry="Ad-ID"with a made-up value. Claiming the Ad-ID registry for an internal ID poisons dedup for everyone. Useunknownhonestly instead.- Regenerating the value per response. The point is stability. An ID that changes on every serve is a session ID, and
AdServingIdalready exists for that.
Does vastlint validate UniversalAdId?
Yes. vastlint checks presence in 4.x InLine creatives, version-appropriate structure (attribute vs text content), idRegistry presence, and Ad-ID code format where the registry claims it. See the rules reference for the exact rule IDs.