OMID: Open Measurement SDK and VAST AdVerification
OMID (Open Measurement Interface Definition) is the IAB Tech Lab standard for third-party viewability, audio, and fraud measurement across video and audio ad inventory. It defines a secure API that lets measurement vendors — IAS, DoubleVerify, Moat, and others — collect consistent signals from any web, app, or CTV player without executing privileged code inside the player itself.
The current version is OMID 1.5 (June 2024). OMID replaced VPAID as the standard mechanism for ad verification and viewability measurement. Where VPAID combined interactivity and measurement into one executable unit, OMID handles only measurement — cleanly, securely, and in a way that works on CTV and SSAI environments where VPAID cannot run.
Why OMID exists
Before OMID, measurement vendors had no standardised way to integrate across players. Each vendor shipped its own JavaScript snippet that had to be inserted into the ad tag. Those scripts often ran in the same context as the player, exposing the publisher page to security and performance risks identical to VPAID. Worse, a script that worked in one player was not guaranteed to work in another.
OMID draws a hard boundary. The measurement script loads into an isolated context and talks to the player through a standardised API. The player reports media events and geometry data to the OM SDK; the SDK forwards them to vendor scripts via the OMID API. No DOM access, no shared JavaScript context, no ability to fire tracking pixels outside the defined event model.
How OMID fits into the VAST ecosystem
VAST describes the ad: media files, tracking URLs, companion ads. OMID describes who measures the ad and how. Starting with VAST 4.1, the <AdVerifications> element carries one or more <Verification> entries, each pointing to a vendor's OMID-compatible measurement script.
Players that support OM SDK parse <AdVerifications> automatically, load the scripts, and begin reporting signals as soon as the ad enters the viewport. Players that do not support OM SDK skip the element gracefully — OMID degrades without breaking playback.
The <AdVerifications> element
<AdVerifications> sits directly inside <InLine> or <Wrapper> in a VAST 4.1+ document. It contains one <Verification> element per measurement vendor.
Key attributes and children of <Verification>
vendor(required): uniquely identifies the measurement vendor indomain-omidformat, e.g.doubleverify.com-omid. VASTlint validates the format of this value.<JavaScriptResource>(required for web/app): URL to the vendor's OMID-compatible measurement script. Must haveapiFramework="omid".browserOptionalon<JavaScriptResource>: whentrue, native-app players can skip loading the JS resource and use native SDK integration instead. Whenfalse(the default), the JavaScript resource is required even in app contexts.<VerificationParameters>(optional): a CDATA block containing vendor-specific parameters — typically key-value pairs the vendor script needs at initialisation (placement ID, publisher ID, etc.).<TrackingEvents>: should contain averificationNotExecutedtracking URL. The player fires this pixel when it cannot load or execute the verification script, so the vendor knows measurement failed rather than inferring it from missing signals.
<AdVerifications>
<Verification vendor="doubleverify.com-omid">
<JavaScriptResource apiFramework="omid" browserOptional="true">
<![CDATA[https://cdn.doubleverify.com/dvtp_src.js]]>
</JavaScriptResource>
<VerificationParameters>
<![CDATA[ctx=12345678&cmp=DV123456]]>
</VerificationParameters>
<TrackingEvents>
<Tracking event="verificationNotExecuted">
<![CDATA[https://cdn.doubleverify.com/dvtp_not_executed.js?ctx=12345678&reason=[REASON]]]>
</Tracking>
</TrackingEvents>
</Verification>
<!-- Multiple vendors are allowed -->
<Verification vendor="ias.com-omid">
<JavaScriptResource apiFramework="omid" browserOptional="false">
<![CDATA[https://pixel.adsafeprotected.com/jload]]>
</JavaScriptResource>
<VerificationParameters>
<![CDATA[anId=12345&advId=67890]]>
</VerificationParameters>
<TrackingEvents>
<Tracking event="verificationNotExecuted">
<![CDATA[https://pixel.adsafeprotected.com/jload?not_executed=1&reason=[REASON]]]>
</Tracking>
</TrackingEvents>
</Verification>
</AdVerifications>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.
OMID vs. VPAID: measurement comparison
| Feature | VPAID (for measurement) | OMID |
|---|---|---|
| Security model | Script runs in shared player JS context | Script runs in isolated context via OM SDK API |
| DOM access | Full access to publisher DOM | None — signals delivered via standardised API only |
| CTV / native players | Not supported — requires browser JS runtime | Supported via native OM SDK libraries |
| SSAI environments | Not possible | Supported |
| Multiple vendors | Each vendor ships its own ad wrapper | Multiple <Verification> elements in one tag |
| Failed measurement signal | No standard mechanism | verificationNotExecuted tracking event |
| Fraud risk | High — script can fire arbitrary pixels | Low — constrained to defined OMID event model |
| Status | Deprecated by IAB Tech Lab | Current standard (v1.5) |
VAST version support
| VAST version | AdVerifications support | Notes |
|---|---|---|
| VAST 2.0, 3.0 | None (native) | Some players accept AdVerifications in an Extensions block — non-standard |
| VAST 4.0 | Pre-OMID | <AdVerifications> exists but predates OMID — no apiFramework="omid" or browserOptional attributes |
| VAST 4.1 | Full | Canonical placement introduced; the version most OM SDK integrations target |
| VAST 4.2, 4.3 | Full | Inherited from 4.1 without structural changes |
The browserOptional attribute
browserOptional="true" on <JavaScriptResource> signals that the vendor has a native OM SDK integration and the JavaScript resource is only needed for web players. A native iOS or Android player can skip loading the JS file and use the vendor's native SDK instead.
Setting browserOptional="false" (or omitting it, since false is the default) tells native-app players they must load the JavaScript resource to satisfy the measurement requirement. If the player cannot execute JavaScript, it should fire the verificationNotExecuted pixel.
The verificationNotExecuted tracking event
When a player cannot load or execute a verification script — because JavaScript is unavailable, the script URL fails to load, or the OM SDK is not integrated — it should fire the verificationNotExecuted pixel so the vendor knows measurement failed. The [REASON] macro is replaced by a numeric reason code; for example, code 1 is used when the player explicitly refuses to execute the verification resource. The full enumeration is in section 3.17.4 of the VAST 4.1 specification.
OMID and wrapper chains
<AdVerifications> can appear in both <InLine> and <Wrapper> documents. When a wrapper chain is involved:
- The player accumulates all
<Verification>entries from every hop in the chain — from the outermost wrapper down to the InLine. - Each vendor's script is loaded independently. Duplicate vendors (same
vendorattribute value at multiple hops) should be deduplicated by the player — only one instance per vendor should run. - The VAST Inspector shows the AdVerifications block at each hop, so you can see which vendors are introduced at which level of the chain.
How VASTlint validates OMID
VASTlint validates the VAST XML structure around OMID verification entries. The current checks include:
- Vendor format: the
vendorattribute must follow thedomain-omidpattern. Missing or malformed vendor values are flagged. - apiFramework value:
<JavaScriptResource>must haveapiFramework="omid"(lowercase). Incorrect or missing values are flagged. - HTTPS enforcement: the script URL inside
<JavaScriptResource>must be HTTPS. HTTP URLs are flagged as errors. - Duplicate vendor detection: more than one
<Verification>with the samevendorvalue in the same document is flagged as a warning, since players should deduplicate but behaviour varies. - VerificationParameters guidance: if
<VerificationParameters>is present but empty, VASTlint surfaces an advisory since empty parameters are typically a configuration oversight.
VASTlint does not execute the verification script or validate the runtime OMID session. That requires a live player environment with OM SDK integrated. For live URL testing, use the VAST Tag Tester.
Validate OMID AdVerifications in your VAST tag
Paste a VAST 4.1+ tag to check vendor format, apiFramework values, HTTPS enforcement, and duplicate vendor entries instantly.
Common mistakes
| Mistake | Effect |
|---|---|
apiFramework="OMID" (uppercase) | Some players treat the attribute as case-sensitive and fail to recognise the vendor |
| HTTP script URL | Mixed-content block in modern browsers; script never loads |
Missing vendor attribute | Player cannot deduplicate vendors or route the script correctly |
Vendor value not in domain-omid format | Non-standard values may be silently ignored by strict OM SDK implementations |
Missing verificationNotExecuted tracking URL | Vendor has no signal when measurement fails; discrepancy goes undetected |
| Duplicate vendor at multiple wrapper hops | Some players run both instances, causing double-counting |
| AdVerifications in VAST 2.0 / 3.0 without Extensions wrapper | Structurally invalid; most players will ignore the block entirely |