DEV Community

Aleksander Sekowski
Aleksander Sekowski

Posted on

A VAST Tag Can Ship AdVerifications and Still Deliver Zero OMID Measurement

The CTV campaign cleared delivery. The ad server counted the impression. The verification partner's dashboard stayed empty for three days before anyone opened the VAST XML.

The tag was not missing measurement. It had an <AdVerifications> block, a <Verification> node, and a URL inside <JavaScriptResource>. Visually, the buy included Open Measurement. On the wire, the OM SDK had nothing it could bind to.

That gap is common enough that I treat <AdVerifications> as a checklist, not a boolean. VAST 4.1 introduced the block when IAB moved verification off VPAID. The video creative and the measurement script are separate jobs now. SIMID handles interactivity. OMID handles viewability and IVT through the Open Measurement SDK. A tag that still routes measurement through a VPAID <MediaFile> is on the wrong path entirely; the VPAID reference and the deprecation timeline spell out why CTV inventory rejects it.

What AdVerifications actually promises

Under <InLine> or <Wrapper>, <AdVerifications> holds one or more <Verification> elements. Each verification is a contract with four parts the player and OM SDK read together:

  1. vendor on <Verification>: a domain-qualified key such as measureco.com-omid. Required in VAST 4.1+. Without it, the session cannot be attributed to a measurement provider even if a script loads.
  2. A loadable resource: <JavaScriptResource> for web and most OM SDK integrations, or <ExecutableResource> on native paths. VAST 4.1 requires apiFramework on both.
  3. apiFramework="omid": lowercase, exactly. This is not the same attribute as apiFramework="SIMID" on <InteractiveCreativeFile>. SIMID is the interactive layer; OMID is the verification layer. They solve different problems and live in different elements.
  4. <VerificationParameters>: bootstrap JSON or key/value data the vendor's script expects at init. Empty or missing parameters are schema-legal and still leave the script with no config.

VPAID used to hide all of this inside one JavaScript <MediaFile>. The migration guide splits the work: interactivity to SIMID, verification to <AdVerifications>. Tags that only half-migrate often carry both paths, which is its own class of failure on CTV.

Here is the shape that looks complete and is not:

<AdVerifications>
  <Verification vendor="company.com-omid">
    <JavaScriptResource>
      <![CDATA[https://verificationvendor.com/omid.js]]>
    </JavaScriptResource>
  </Verification>
</AdVerifications>
Enter fullscreen mode Exit fullscreen mode

The URL is there. The OM SDK does not treat this as an OMID resource because apiFramework is missing. vastlint reports VAST-4.1-js-resource-apiframework as an error: the attribute is required on verification resources in 4.1+.

The fix is not decorative:

<Verification vendor="company.com-omid">
  <JavaScriptResource apiFramework="omid" browserOptional="true">
    <![CDATA[https://verificationvendor.com/omid.js]]>
  </JavaScriptResource>
  <VerificationParameters>
    <![CDATA[{"partner":"abc123"}]]>
  </VerificationParameters>
</Verification>
Enter fullscreen mode Exit fullscreen mode

The failures that survive a visual QA pass

Missing or wrong apiFramework. Omitting the attribute is an error. Setting apiFramework="OMID" or apiFramework="VPAID" is XML that validates in some pipelines and fails at runtime. The OM SDK match is lowercase omid. VAST-4.1-js-resource-apiframework-value fires when the value is anything else.

Verification shell with no resource. Trafficking sometimes inserts <AdVerifications> during creative build and never injects the vendor script URL. You get <Verification vendor="company.com-omid"> with no <JavaScriptResource> and no <ExecutableResource>. The structure exists. Nothing executes. Buyers blame the publisher; the XML shows an empty node.

HTTP verification URLs. Mixed content blocks the script on HTTPS inventory. The linear MP4 plays. Measurement is blank with no player error. Same class of silent failure as SIMID interactive URLs; the SIMID rule reference covers the interactive side, while OMID rules such as VAST-4.1-js-resource-https cover verification scripts.

Empty <VerificationParameters>. Vendors ship init data in this element: partner IDs, feature flags, session hints. An empty tag is often still schema-valid. VAST-4.1-verification-parameters warns because the script starts without the config it was written for.

Duplicate vendor values. Two <Verification> entries with the same vendor string can spawn conflicting OM SDK sessions. Dedup matters when wrappers chain and each hop adds its own block.

Wrapper chains that drop verification. <AdVerifications> on a wrapper should pass verification metadata to the resolved inline. If your QA stops at the first hop, you can approve a wrapper that never forwards the vendor script the inline actually serves. That is a chain problem, not a creative problem.

How I catch it before the campaign runs

I start with the live tag URL in the VAST tag tester. It fetches the response, renders the linear creative, and surfaces tracking and click URLs. AdVerifications shows up in the parsed tree. I can see whether <JavaScriptResource> declares apiFramework="omid" and whether a URL is present before anyone presses play in a staging player.

Wrapper-heavy CTV paths go through the VAST inspector next. It follows each <VASTAdTagURI> hop and shows where the chain breaks, how deep it ran, and which inline finally handed back creatives. Verification stripped at hop two is invisible if you only ever pasted the top-level XML.

After that, CLI or CI:

$ vastlint check omid-tag.xml
omid-tag.xml  VAST 4.1
  error    <JavaScriptResource> is missing required apiFramework attribute
           VAST-4.1-js-resource-apiframework
  warning  OMID <Verification> should include non-empty <VerificationParameters>
           VAST-4.1-verification-parameters
Enter fullscreen mode Exit fullscreen mode

The broken example for missing apiFramework walks through the same tag with the full finding list. The OMID overview maps each element back to VAST 4.1 ยง3.17 if you need spec anchors for a ticket.

What this is not

<AdVerifications> is not proof that viewability ran. It is instructions for the player to load a vendor script in an OM SDK sandbox. SSAI and many CTV native players never execute that JavaScript at all; verification has to be negotiated at the deal and player level, not assumed from XML presence.

SIMID interactivity does not substitute. A tag with a correct <InteractiveCreativeFile apiFramework="SIMID"> and a broken verification block still plays the interactive creative and still fails independent measurement.

The short version

Presence of <AdVerifications> is not measurement. Every <Verification> needs vendor, a resource with apiFramework="omid", and the vendor's <VerificationParameters>. Test the live URL, walk wrapper chains, then lint the XML. The video will play either way. The buyer's verification invoice is what tells you the contract was hollow.

vastlint is independent of IAB Tech Lab. The rule ids above cite VAST 4.1 because that is where the requirements live, not because this is an official tool.

Top comments (0)