Inline linting for IAB VAST ad tags directly in VS Code. Supports VAST 2.0 through 4.4 with clean Problems entries, concise hovers, fix guidance, and direct docs links. Web validator and full documentation: vastlint.org
Features
- Inline squiggles — red (error), yellow (warning), blue (info) underlines on the offending XML tag
- Hover tooltips — concise issue summary, fix guidance, and a direct rule docs link
- Problems panel — clean issue titles with file, line, and column; click to jump directly to the tag
- Any file type — works in
.xml,.html,.js,.ts,.json, templates — anywhere<VAST>appears - Multi-block — validates every
<VAST>...</VAST>block in a file independently - Live as you type — re-validates 500 ms after you stop typing, and on every save
- CLI backend — uses the
vastlintCLI binary when available, falls back to WASM in-process - 232 rules across VAST 2.0–4.4 plus SIMID and OMID validation: required fields, schema structure, URLs, verification semantics, deprecations, and CTV/SSAI advisories
How it looks
Hover over a squiggled tag:
🔴 <InLine> is missing required <AdSystem>
✅ Fix: Add `<AdSystem>` inside `<InLine>`, e.g. `<AdSystem>My Ad Server</AdSystem>`.
Docs: vastlint.org/docs/rules/VAST-2.0-inline-adsystem
Settings
| Setting | Default | Description |
|---|---|---|
vastlint.enable |
true |
Enable/disable diagnostics |
vastlint.minSeverity |
"info" |
Minimum severity to show: "error", "warning", or "info" |
vastlint.ruleOverrides |
{} |
Per-rule severity overrides (WASM fallback only — use vastlint.toml in CLI mode) |
vastlint.templateIgnoreRegex |
"" |
Regex for template expressions to blank out before validation (e.g. \$\{[^}]+\}) |
vastlint.vastVersion |
"" |
Force a VAST version ("2.0", "3.0", "4.0", "4.1", "4.2", "4.3", "4.4") — blank = auto-detect |
vastlint.cliPath |
"vastlint" |
Path to the vastlint CLI binary. Falls back to common install locations, then WASM. |
Example: silence HTTP warnings
// .vscode/settings.json
{
"vastlint.ruleOverrides": {
"VAST-2.0-mediafile-https": "off",
"VAST-2.0-tracking-https": "off"
}
}
Example: only show errors
{
"vastlint.minSeverity": "error"
}
Rules
VASTlint checks 232 rules across:
- Required elements and attributes (VAST 2.0–4.4)
- Value formats (durations, URLs, enums)
- Schema conformance (unknown elements/attributes)
- Deprecation warnings (VPAID, Flash, Survey, conditionalAd)
- SIMID interactive creative validation (
<InteractiveCreativeFile apiFramework="SIMID">) - OMID AdVerification validation (
<AdVerifications><Verification>,verificationNotExecuted, extension compatibility blocks) - Security (HTTP vs HTTPS)
- CTV/SSAI best practices (Mezzanine, AdServingId)
- Structural issues (wrapper depth, ad sequence, duplicate impressions)
- VMAP 1.0 ad break playlists (
<AdBreak>structure,timeOffset/breakTypeformats, inline<vmap:VASTAdData>VAST validation) - DAAST 1.0 digital audio ads (
<Category>,<DAASTAdTagURI>,<AdInteractions>, audio MediaFile attributes)
Full rule reference with examples and fix guidance: vastlint.org/docs/rules
Canonical rule catalog:
- RULES.md in this repo
- vastlint.org/docs/rules for the hosted per-rule pages
All 232 rules
VAST 2.0
| Rule | Severity | Description |
|---|---|---|
| VAST-2.0-root-element | error | Root element must be <VAST> |
| VAST-2.0-root-version | error | <VAST> must have a version attribute |
| VAST-2.0-root-version-value | warning | version attribute must be a recognised version string |
| VAST-2.0-root-has-ad-or-error | error | <VAST> must contain at least one <Ad> or <Error> |
| VAST-2.0-ad-has-inline-or-wrapper | error | Each <Ad> must contain exactly one <InLine> or <Wrapper> |
| VAST-2.0-inline-adsystem | error | <InLine> must contain <AdSystem> |
| VAST-2.0-inline-adtitle | error | <InLine> must contain <AdTitle> |
| VAST-2.0-inline-impression | error | <InLine> must contain at least one <Impression> |
| VAST-2.0-inline-creatives | error | <InLine> must contain <Creatives> with at least one <Creative> |
| VAST-2.0-linear-duration | error | <Linear> must contain <Duration> |
| VAST-2.0-linear-mediafiles | error | <Linear> must contain <MediaFiles> with at least one <MediaFile> |
| VAST-2.0-mediafile-delivery | error | <MediaFile> must have a delivery attribute |
| VAST-2.0-mediafile-delivery-enum | error | delivery must be "progressive" or "streaming" |
| VAST-2.0-mediafile-type | error | <MediaFile> must have a type attribute |
| VAST-2.0-mediafile-dimensions | error | <MediaFile> must have width and height attributes |
| VAST-2.0-mediafile-https | warning | MediaFile URL uses HTTP instead of HTTPS |
| VAST-2.0-wrapper-adsystem | error | <Wrapper> must contain <AdSystem> |
| VAST-2.0-wrapper-impression | error | <Wrapper> must contain at least one <Impression> |
| VAST-2.0-wrapper-vastadtaguri | error | <Wrapper> must contain <VASTAdTagURI> |
| VAST-2.0-wrapper-depth | error | Wrapper chain depth exceeds the configured maximum |
| VAST-2.0-companion-resource | error | <Companion> must contain at least one resource element |
| VAST-2.0-companion-dimensions | warning | <Companion> missing width or height |
| VAST-2.0-nonlinear-resource | error | <NonLinear> must contain at least one resource element |
| VAST-2.0-nonlinear-dimensions | warning | <NonLinear> missing width or height |
| VAST-2.0-ad-sequence | warning | Inconsistent use of sequence attribute across <Ad> elements |
| VAST-2.0-duplicate-singular-element | error | Element appears more than once where the spec allows a single occurrence |
| VAST-2.0-text-only-element | error | Text-only element contains a child element |
| VAST-2.0-unknown-attribute | warning | Attribute not defined in the VAST spec |
| VAST-2.0-inline-unknown-child | error | <InLine> contains an unrecognised child element |
| VAST-2.0-wrapper-unknown-child | error | <Wrapper> contains an unrecognised child element |
| VAST-2.0-creatives-unknown-child | error | <Creatives> may only contain <Creative> elements |
| VAST-2.0-creative-unknown-child | error | <Creative> contains an unrecognised child element |
| VAST-2.0-linear-unknown-child | error | <Linear> contains an unrecognised child element |
| VAST-2.0-trackingevents-unknown-child | error | <TrackingEvents> may only contain <Tracking> elements |
| VAST-2.0-mediafiles-unknown-child | error | <MediaFiles> contains an unrecognised child element |
| VAST-2.0-extensions-unknown-child | error | <Extensions> may only contain <Extension> elements |
| VAST-2.0-videoclicks-unknown-child | error | <VideoClicks> contains an unrecognised child element |
| VAST-2.0-nonlinearads-unknown-child | error | <NonLinearAds> contains an unrecognised child element |
| VAST-2.0-nonlinear-unknown-child | error | <NonLinear> contains an unrecognised child element |
| VAST-2.0-companionads-unknown-child | error | <CompanionAds> may only contain <Companion> elements |
| VAST-2.0-companion-unknown-child | error | <Companion> contains an unrecognised child element |
| VAST-2.0-creativeextensions-unknown-child | error | <CreativeExtensions> may only contain <CreativeExtension> elements |
| VAST-2.0-extension-misplaced-element | warning | <Extension> contains an element that has a dedicated location in the VAST spec |
| VAST-2.0-extension-cdata | warning | <Extension> leaf text payload with XML-sensitive characters should be wrapped in CDATA so JSON blobs and URL-rich vendor data do not rely on fragile XML escaping |
| VAST-2.0-creative-extension-misplaced-element | warning | <CreativeExtension> contains an element that has a dedicated location in the VAST spec |
| VAST-2.0-creative-extension-cdata | warning | <CreativeExtension> leaf text payload with XML-sensitive characters should be wrapped in CDATA so JSON blobs and URL-rich vendor data do not rely on fragile XML escaping |
| VAST-2.0-tracking-https | warning | Tracking or click URL uses HTTP instead of HTTPS |
| VAST-2.0-url-cdata | warning | URI value is not wrapped in CDATA |
| VAST-2.0-url-empty | error | URL field is empty |
| VAST-2.0-url-invalid | warning | URL field does not appear to be a valid URI |
| VAST-2.0-parse-error | error | XML parse error — document may be malformed |
| VAST-2.0-version-mismatch | warning | Declared version does not match structural signals |
| VAST-2.0-duplicate-impression | warning | Duplicate <Impression> URL within the same <Ad> |
| VAST-2.0-flash-mediafile | warning | Flash MediaFile type is no longer supported |
| VAST-2.0-linear-tracking-quartiles | warning | <Linear> has no standard quartile tracking events — measurement system receives no signal |
| VAST-2.0-duration-format | error | Duration value does not match HH:MM:SS[.mmm] format |
| VAST-2.0-macro-unknown | warning | URL contains a [MACRO] that is not a recognised IAB VAST macro |
| VAST-2.0-macro-lowercase | warning | Recognised macro is not uppercase — players match macro names case-sensitively |
| VAST-2.0-macro-wrong-context | info | Context-restricted macro ([ERRORCODE]/[REASON]) used where it has no defined value |
| VAST-2.0-macro-uri-unencoded | warning | Macro-bearing URL contains characters that must be percent-encoded per RFC 3986 |
| VAST-2.0-adtitle-quality | warning | <AdTitle> value is a known placeholder string; the creative cannot be identified in reporting |
| VAST-2.0-adsystem-quality | info | <AdSystem> value is a known placeholder string; the tag cannot be traced to its serving system |
| VAST-2.0-adsystem-no-version | info | <AdSystem> has no version attribute; provenance is harder to trace in partner debugging |
VAST 3.0
| Rule | Severity | Description |
|---|---|---|
| VAST-3.0-progress-offset | error | <Tracking event="progress"> requires an offset attribute |
| VAST-3.0-progress-offset-format | warning | Progress offset does not match the required format |
| VAST-3.0-skipoffset-format | warning | skipoffset does not match HH:MM:SS[.mmm] or n% format |
| VAST-3.0-skip-event-no-skipoffset | warning | skip tracking event present but <Linear> has no skipoffset attribute |
| VAST-3.0-minmaxbitrate-pair | error | <MediaFile> must have both minBitrate and maxBitrate or neither |
| VAST-3.0-bitrate-conflict | warning | <MediaFile> has both bitrate and minBitrate/maxBitrate |
| VAST-3.0-icon-attrs | warning | <Icon> missing recommended attributes (program/width/height/position) |
| VAST-3.0-icon-program | error | <Icon> missing required program attribute |
| VAST-3.0-icon-width | error | <Icon> missing required width attribute |
| VAST-3.0-icon-height | error | <Icon> missing required height attribute |
| VAST-3.0-icon-xposition | error | <Icon> missing required xPosition attribute |
| VAST-3.0-icon-yposition | error | <Icon> missing required yPosition attribute |
| VAST-3.0-icon-resource | error | <Icon> must have at least one resource element |
| VAST-3.0-icons-unknown-child | error | <Icons> may only contain <Icon> elements |
| VAST-3.0-icon-unknown-child | error | <Icon> contains an unrecognised child element |
| VAST-3.0-iconclicks-unknown-child | error | <IconClicks> contains an unrecognised child element |
| VAST-3.0-pricing-model | error | <Pricing> missing required model attribute |
| VAST-3.0-pricing-currency | error | <Pricing> missing required currency attribute |
| VAST-3.0-pricing-model-case | warning | model value should be lowercase (cpm/cpc/cpe/cpv) |
| VAST-3.0-pricing-currency-format | warning | currency attribute must be a 3-letter ISO 4217 code |
| VAST-3.0-companion-required-attr | warning | <CompanionAds> required attribute must be all, any, or none |
VAST 4.0
| Rule | Severity | Description |
|---|---|---|
| VAST-4.0-wrapper-root-error | warning | <VAST> root contains both <Ad> and <Error> elements |
| VAST-4.0-universaladid-present | error | <Creative> must contain <UniversalAdId> (VAST 4.0+) |
| VAST-4.0-universaladid-idregistry | error | <UniversalAdId> must have an idRegistry attribute |
| VAST-4.0-universaladid-idvalue | error | <UniversalAdId> missing required idValue attribute (VAST 4.0) |
| VAST-4.0-category-authority | error | <Category> missing required authority attribute |
| VAST-4.0-category-authority-not-uri | warning | <Category> authority attribute is not a valid authority URL |
| VAST-4.0-category-authority-unknown | info | <Category> authority is not a recognised IAB Content Taxonomy authority |
| VAST-4.0-companion-clicktracking-id | error | <CompanionClickTracking> missing required id attribute |
| VAST-4.0-wrapper-clickthrough | warning | <ClickThrough> inside Wrapper <VideoClicks> was removed in VAST 4.0 |
| VAST-4.0-conditionalad | warning | conditionalAd attribute is deprecated as of VAST 4.1 |
| VAST-4.0-tracking-event-removed | warning | Tracking events removed in VAST 4.0 |
| VAST-4.0-mediafile-apiframework | info | apiFramework on <MediaFile> is deprecated — use <InteractiveCreativeFile> |
| VAST-4.0-interactive-creative-no-api | warning | <InteractiveCreativeFile> should have an apiFramework attribute |
| VAST-4.0-adverifications-unknown-child | error | <AdVerifications> may only contain <Verification> elements |
| VAST-4.0-verification-unknown-child | error | <Verification> contains an unrecognised child element |
| VAST-4.0-viewableimpression-unknown-child | error | <ViewableImpression> contains an unrecognised child element |
| VAST-4.0-wrapper-bool-attr | warning | <Wrapper> followAdditionalWrappers, allowMultipleAds and fallbackOnNoAd must be a boolean |
VAST 4.1
| Rule | Severity | Description |
|---|---|---|
| VAST-4.1-adservingid-present | error | <InLine> must contain <AdServingId> (VAST 4.1+) |
| VAST-4.1-ad-serving-id-empty | warning | <AdServingId> is present but empty |
| VAST-4.1-universaladid-idvalue-removed | warning | idValue attribute was removed in VAST 4.1 |
| VAST-4.1-universaladid-content | error | <UniversalAdId> must have text content in VAST 4.1+ |
| VAST-4.1-adtype-value | warning | adType must be video, audio, or hybrid |
| VAST-4.1-survey-deprecated | warning | <Survey> is deprecated as of VAST 4.1 |
| VAST-4.1-macro-deprecated | info | [CONTENTPLAYHEAD]/[MEDIAPLAYHEAD] are deprecated as of VAST 4.1 — use [ADPLAYHEAD] |
| VAST-4.1-vpaid-apiframework | warning | VPAID is deprecated as of VAST 4.1 |
| VAST-4.1-vpaid-in-interactive-context | warning | VPAID <MediaFile> alongside <InteractiveCreativeFile> — unsupported in CTV |
| VAST-4.1-interactive-creative-type | warning | <InteractiveCreativeFile> should have a type attribute |
| VAST-4.1-mezzanine-delivery | error | <Mezzanine> missing required delivery attribute |
| VAST-4.1-mezzanine-type | error | <Mezzanine> missing required type attribute |
| VAST-4.1-mezzanine-width | error | <Mezzanine> missing required width attribute |
| VAST-4.1-mezzanine-height | error | <Mezzanine> missing required height attribute |
| VAST-4.1-mezzanine-recommended | info | No <Mezzanine> present — tag may be rejected in CTV/SSAI contexts |
| VAST-4.1-verification-vendor | error | <Verification> missing required vendor attribute |
| VAST-4.1-verification-vendor-format | warning | <Verification> vendor should use a domain-qualified identifier such as company.com-omid |
| VAST-4.1-verification-duplicate-vendor | warning | <AdVerifications> contains duplicate vendor identifiers |
| VAST-4.1-verification-no-resource | warning | <Verification> should have <JavaScriptResource> or <ExecutableResource> |
| VAST-4.1-verification-parameters | warning | OMID <Verification> should include non-empty <VerificationParameters> |
| VAST-4.1-verification-tracking-reason | warning | verificationNotExecuted tracking URI should include the [REASON] macro |
| VAST-4.1-js-resource-apiframework | error | <JavaScriptResource> missing required apiFramework attribute |
| VAST-4.1-js-resource-apiframework-value | warning | OMID <JavaScriptResource> should declare apiFramework="omid" |
| VAST-4.1-js-resource-https | warning | OMID <JavaScriptResource> URL should use HTTPS |
| VAST-4.1-exec-resource-apiframework | error | <ExecutableResource> missing required apiFramework attribute |
| VAST-4.1-exec-resource-apiframework-value | warning | OMID <ExecutableResource> should declare apiFramework="omid" |
| VAST-4.1-exec-resource-type | error | <ExecutableResource> missing required type attribute |
| VAST-4.1-exec-resource-https | warning | OMID <ExecutableResource> reference should use HTTPS when it is a URL |
| VAST-4.1-blockedadcategories-no-authority | warning | <BlockedAdCategories> should have an authority attribute |
| VAST-4.1-blockedadcategories-authority-not-uri | warning | <BlockedAdCategories> authority attribute is not a valid authority URL |
| VAST-4.1-blockedadcategories-authority-unknown | info | <BlockedAdCategories> authority is not a recognised IAB Content Taxonomy authority |
| VAST-4.1-expires-integer | warning | <Expires> value must be an integer number of seconds |
| VAST-4.1-tracking-event-value | error | event attribute not in the valid set for this VAST version |
| VAST-4.1-companion-renderingmode-value | warning | renderingMode must be default, end-card, or concurrent |
VAST 4.2
| Rule | Severity | Description |
|---|---|---|
| VAST-4.2-closedcaptionfiles-unknown-child | error | <ClosedCaptionFiles> may only contain <ClosedCaptionFile> elements |
| VAST-4.2-icon-fallback-image-width-height | warning | <IconClickFallbackImage> should have width and height attributes |
VAST 4.3
| Rule | Severity | Description |
|---|---|---|
| VAST-4.3-js-resource-browser-optional | warning | <JavaScriptResource> should have a browserOptional attribute |
VAST 4.4 rules (CTV Ad Portfolio)
VAST 4.4 is a working-group draft, not a published spec. The CTV Ad Portfolio signaling guidance it accompanies is final (2026-07-22), so rules derived from the guidance carry more weight than rules derived from the draft schema. Nothing here errors unless the markup is malformed under any version.
The NonLinear content model these rules cover is accepted on any VAST 4.x document, not only on version="4.4", because every example in IAB's final guidance ships it on a 4.2 tag.
| Rule | Severity | Description |
|---|---|---|
| VAST-4.4-version-attribute | info | Document declares VAST 4.4, a working-group draft rather than a published spec |
| VAST-4.4-nonlinear-no-renderable-asset | warning | <NonLinear> has a SIMID interactive file but no renderable fallback asset |
| VAST-4.4-nonlinear-mediafiles-empty | error | <NonLinear> <MediaFiles> contains no renderable or interactive asset |
| VAST-4.4-nonlinear-simid-iframe | info | <IFrameResource apiFramework="SIMID"> is superseded by <InteractiveCreativeFile> in NonLinear |
| VAST-4.4-nonlinear-video-no-duration | warning | <NonLinear> delivers video but has no <Duration> — quartile tracking cannot fire |
| VAST-4.4-adcom-extension-unknown-signal | warning | <Extension ext="adcom"> type is not plcmt, pos, playbackmethod or attr |
| VAST-4.4-adcom-extension-type-mismatch | warning | <Extension> type attribute and AdCOM payload element name disagree |
| VAST-4.4-adcom-signal-not-integer | error | AdCOM signal payload in <Extension> is not an integer |
| VAST-4.4-adcom-plcmt-value | warning | AdCOM plcmt outside the Plcmt Subtypes (Video) range 1–9 |
| VAST-4.4-adcom-playbackmethod-value | warning | AdCOM playbackmethod outside the Playback Methods range 1–11 |
| VAST-4.4-adcom-pos-value | warning | AdCOM pos outside the Placement Positions range 0–17 |
| VAST-4.4-adcom-pos-format-mismatch | warning | AdCOM pos is not a position the declared plcmt format supports |
| VAST-4.4-adcom-playbackmethod-format-mismatch | warning | AdCOM playbackmethod and plcmt name different CTV Ad Portfolio formats |
| VAST-4.4-adcom-attr-not-motion | info | AdCOM attr is not a CTV Ad Portfolio creative attribute (19 QR, 20 alpha, 21–23 motion) |
| VAST-4.4-qrcode-position-attrs | error | <QrCodePosition> requires both xPosition and yPosition |
| VAST-4.4-qrcode-position-percent | error | <QrCodePosition> coordinates must be percentages, not pixels |
| VAST-4.4-qrcode-size-attr | error | <QrCodeSize> requires a size attribute |
| VAST-4.4-qrcode-size-percent | error | <QrCodeSize> size must be a percentage |
| VAST-4.4-qrcode-missing-scan-url | warning | QR code geometry declared without a <QrCodeScanUrl> destination |
| VAST-4.4-qrcode-missing-image-url | warning | QR code geometry declared without a <QrCodeImageUrl> image |
| VAST-3.0-adparameters-xmlencoded-value | warning | <AdParameters> xmlEncoded must be a boolean |
| VAST-2.0-ctv-portfolio-creative-id-required | error | <Extension type="ctv_ad_portfolio"> needs <CreativeId> when the ad has multiple creatives |
| VAST-2.0-ctv-portfolio-creative-id-unmatched | error | <Extension type="ctv_ad_portfolio"> <CreativeId> matches no <Creative> id in the ad |
| VAST-2.0-ctv-portfolio-mediafiles-required | error | <Extension type="ctv_ad_portfolio"> carries no <MediaFiles> |
| VAST-2.0-ctv-portfolio-mediafiles-empty | error | <Extension type="ctv_ad_portfolio"> <MediaFiles> contains no renderable or interactive asset |
| VAST-2.0-ctv-portfolio-no-renderable-asset | warning | <Extension type="ctv_ad_portfolio"> has a SIMID file but no <MediaFile> fallback |
| VAST-2.0-ctv-portfolio-no-duration | warning | <Extension type="ctv_ad_portfolio"> delivers a timed asset but has no <Duration> |
SIMID rules
| Rule | Severity | Description |
|---|---|---|
| SIMID-1.0-simid-type-required | error | <InteractiveCreativeFile apiFramework="SIMID"> must have type="text/html" |
| SIMID-1.0-simid-url-empty | error | <InteractiveCreativeFile apiFramework="SIMID"> must contain a non-empty URL |
| SIMID-1.0-simid-url-https | error | <InteractiveCreativeFile> SIMID URL must use HTTPS (not HTTP, javascript:, or file:) |
| SIMID-1.0-simid-url-data-html | error | SIMID data: URI must declare text/html |
| SIMID-1.0-simid-apiframework-case | warning | apiFramework must be exactly "SIMID" (case-sensitive per SIMID §5) |
| SIMID-1.0-simid-variable-duration-value | warning | <InteractiveCreativeFile> variableDuration attribute must be "true" when present |
| SIMID-1.0-simid-mediafile-required | error | Linear SIMID ad must include a video/audio <MediaFile> alongside the interactive creative |
| SIMID-1.0-simid-interactive-start | info | Linear SIMID creative on VAST 4.2+ should include an interactiveStart tracking event |
| SIMID-1.0-simid-ssai-no-client | info | Linear SIMID creative with a Mezzanine but no progressive MediaFile cannot run in SSAI |
| SIMID-1.1-nonlinear-simid-no-iframe | error | <NonLinear apiFramework="SIMID"> must contain an <IFrameResource> |
| SIMID-1.1-iframe-simid-type-required | warning | <IFrameResource> in SIMID <NonLinear> should have type="text/html" |
| SIMID-1.1-iframe-simid-url-empty | error | <IFrameResource> in SIMID <NonLinear> must contain a non-empty URL |
| SIMID-1.1-iframe-simid-url-https | error | <IFrameResource> SIMID URL must use HTTPS (not HTTP, javascript:, or file:) |
| VMAP-1.0-root-version | error | Root <VMAP> element must have a version attribute |
| VMAP-1.0-root-version-value | warning | <VMAP> version attribute should be "1.0" — the only published VMAP version |
| VMAP-1.0-root-namespace | warning | <VMAP> should declare the VMAP namespace URI http://www.iab.net/videosuite/vmap |
| VMAP-1.0-root-unknown-child | error | <VMAP> may only contain <AdBreak> and <Extensions> elements |
| VMAP-1.0-adbreak-timeoffset | error | <AdBreak> must have a timeOffset attribute |
| VMAP-1.0-adbreak-timeoffset-format | error | <AdBreak> timeOffset must be hh:mm:ss[.mmm], n%, "start", "end", or #m |
| VMAP-1.0-adbreak-breaktype | error | <AdBreak> must have a breakType attribute |
| VMAP-1.0-adbreak-breaktype-value | error | <AdBreak> breakType must be a comma-separated list of linear, nonlinear, or display |
| VMAP-1.0-adbreak-repeatafter-format | warning | <AdBreak> repeatAfter does not match the required hh:mm:ss[.mmm] format |
| VMAP-1.0-adbreak-unknown-child | error | <AdBreak> may only contain <AdSource>, <TrackingEvents>, and <Extensions> elements |
| VMAP-1.0-adbreak-multiple-adsource | error | <AdBreak> may contain at most one <AdSource> element |
| VMAP-1.0-adsource-bool-attr | warning | <AdSource> allowMultipleAds and followRedirects must be "true" or "false" |
| VMAP-1.0-adsource-content | error | <AdSource> must contain exactly one of <VASTAdData>, <AdTagURI>, or <CustomAdData> |
| VMAP-1.0-adtaguri-empty | error | <AdTagURI> must contain a URI referencing an ad response |
| VMAP-1.0-adtaguri-cdata | error | <AdTagURI> URI must be contained within a CDATA block |
| VMAP-1.0-customaddata-cdata | error | <CustomAdData> data must be contained within a CDATA block |
| VMAP-1.0-vastaddata-vast-root | error | <VASTAdData> must contain an embedded <VAST> element (as XML, not CDATA) |
| VMAP-1.0-embedded-vast-version | info | Embedded VAST is not version 3.0 — VMAP players are only required to support VAST 3.0 |
| VMAP-1.0-trackingevents-unknown-child | error | VMAP <TrackingEvents> may only contain <Tracking> elements |
| VMAP-1.0-tracking-event | error | VMAP <Tracking> must have an event attribute |
| VMAP-1.0-tracking-event-value | error | VMAP <Tracking> event must be breakStart, breakEnd, or error |
| VMAP-1.0-error-tracking-macro | info | VMAP error tracking URI should include the [ERROR_CODE] macro |
| VMAP-1.0-tracking-url-empty | error | VMAP <Tracking> element does not contain a tracking URI |
| VMAP-1.0-repeatafter-conflict | warning | repeatAfter has no effect when timeOffset is "start" or "end" |
| VMAP-1.0-display-break-no-companions | info | breakType includes "display" but the inline VAST has no <CompanionAds> to fill the break |
| DAAST-1.0-root-version | error | Root <DAAST> element must have a version attribute |
| DAAST-1.0-root-version-value | warning | <DAAST> version attribute must be a recognised version string (1.0 or 1.1) |
| DAAST-1.0-root-has-ad-or-error | error | <DAAST> must contain at least one <Ad> or <Error> |
| DAAST-1.0-ad-has-inline-or-wrapper | error | Each DAAST <Ad> must contain exactly one <InLine> or <Wrapper> |
| DAAST-1.0-inline-adtitle | error | DAAST <InLine> must contain <AdTitle> |
| DAAST-1.0-inline-impression | error | DAAST <InLine> must contain at least one <Impression> |
| DAAST-1.0-inline-category | error | DAAST <InLine> must contain <Category> (required in DAAST, unlike VAST) |
| DAAST-1.0-inline-creatives | error | DAAST <InLine> must contain <Creatives> with at least one <Creative> |
| DAAST-1.0-wrapper-daastadtaguri | error | DAAST <Wrapper> must contain <DAASTAdTagURI> |
| DAAST-1.0-wrapper-vast-adtaguri | warning | <VASTAdTagURI> is a VAST element — DAAST wrappers redirect via <DAASTAdTagURI> |
| DAAST-1.0-wrapper-impression | error | DAAST <Wrapper> must contain at least one <Impression> |
| DAAST-1.0-videoclicks-element | warning | <VideoClicks> is a VAST element — DAAST uses <AdInteractions> |
| DAAST-1.0-audiointeractions-renamed | warning | <AudioInteractions> was renamed <AdInteractions> in the final DAAST release |
| DAAST-1.0-linear-duration | error | DAAST <Linear> must contain <Duration> |
| DAAST-1.0-duration-format | error | DAAST <Duration> value does not match HH:MM:SS[.mmm] format |
| DAAST-1.0-linear-mediafiles | error | DAAST <Linear> must contain <MediaFiles> with at least one <MediaFile> |
| DAAST-1.0-mediafile-delivery | error | DAAST <MediaFile> must have a delivery attribute |
| DAAST-1.0-mediafile-delivery-enum | error | DAAST <MediaFile> delivery must be "progressive" or "streaming" |
| DAAST-1.0-mediafile-type | error | DAAST <MediaFile> must have a type attribute |
| DAAST-1.0-mediafile-audio-type | warning | DAAST <MediaFile> type is a video MIME type — DAAST creative is audio |
| DAAST-1.0-mediafile-id | warning | DAAST <MediaFile> should have an id attribute (required by the DAAST XSD) |
| DAAST-1.0-mediafile-url-empty | error | DAAST <MediaFile> does not contain a media URI |
| DAAST-1.0-tracking-event-value | error | DAAST <Tracking> event is not in the DAAST audio event set |
| DAAST-1.0-progress-offset | error | DAAST <Tracking event="progress"> requires a valid offset attribute |
| DAAST-1.0-pricing-model | error | DAAST <Pricing> is missing the required model attribute |
| DAAST-1.0-pricing-model-value | warning | DAAST <Pricing> model must be one of cpm, cpc, cpe, cpv, cpo |
| DAAST-1.0-pricing-currency | error | DAAST <Pricing> is missing the required currency attribute |
| DAAST-1.0-error-url-empty | warning | DAAST <Error> element is present but contains no URI |
| DAAST-1.0-error-tracking-macro | info | DAAST <Error> URI does not include the [ERRORCODE] macro |
Requirements
No external tools needed - the validator runs entirely in-process via WebAssembly.
License
Apache-2.0 - see LICENSE