{
  "url": "https://vastlint.org/docs/rules.json",
  "html": "https://vastlint.org/docs/rules/",
  "tester": "https://vastlint.org/tester/",
  "inspect": "https://vastlint.org/inspect/",
  "count": 232,
  "rules": [
    {
      "id": "VAST-2.0-root-element",
      "severity": "error",
      "category": "Required fields",
      "description": "Root element must be <VAST>",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-root-element/"
    },
    {
      "id": "VAST-2.0-root-version",
      "severity": "error",
      "category": "Required fields",
      "description": "<VAST> must have a version attribute",
      "specRef": "IAB VAST 2.0 §2.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-root-version/"
    },
    {
      "id": "VAST-2.0-root-version-value",
      "severity": "warning",
      "category": "Required fields",
      "description": "VAST version attribute must be a recognised version string",
      "specRef": "IAB VAST 2.0 §2.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-root-version-value/"
    },
    {
      "id": "VAST-2.0-root-has-ad-or-error",
      "severity": "error",
      "category": "Required fields",
      "description": "<VAST> must contain at least one <Ad> or <Error>",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-root-has-ad-or-error/"
    },
    {
      "id": "VAST-4.0-wrapper-root-error",
      "severity": "warning",
      "category": "Required fields",
      "description": "<VAST> root contains both <Ad> and <Error> elements (invalid per VAST 4.0)",
      "specRef": "IAB VAST 4.0 §2.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-wrapper-root-error/"
    },
    {
      "id": "VAST-2.0-ad-has-inline-or-wrapper",
      "severity": "error",
      "category": "Required fields",
      "description": "Each <Ad> must contain exactly one <InLine> or <Wrapper>",
      "specRef": "IAB VAST 2.0 §2.2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-ad-has-inline-or-wrapper/"
    },
    {
      "id": "VAST-2.0-inline-adsystem",
      "severity": "error",
      "category": "Required fields",
      "description": "<InLine> must contain <AdSystem>",
      "specRef": "IAB VAST 2.0 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-inline-adsystem/"
    },
    {
      "id": "VAST-2.0-inline-adtitle",
      "severity": "error",
      "category": "Required fields",
      "description": "<InLine> must contain <AdTitle>",
      "specRef": "IAB VAST 2.0 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-inline-adtitle/"
    },
    {
      "id": "VAST-2.0-inline-impression",
      "severity": "error",
      "category": "Required fields",
      "description": "<InLine> must contain at least one <Impression>",
      "specRef": "IAB VAST 2.0 §2.3.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-inline-impression/"
    },
    {
      "id": "VAST-2.0-inline-creatives",
      "severity": "error",
      "category": "Required fields",
      "description": "<InLine> must contain <Creatives> with at least one <Creative>",
      "specRef": "IAB VAST 2.0 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-inline-creatives/"
    },
    {
      "id": "VAST-4.1-adservingid-present",
      "severity": "error",
      "category": "Required fields",
      "description": "<InLine> must contain <AdServingId> (VAST 4.1+)",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-adservingid-present/"
    },
    {
      "id": "VAST-4.0-universaladid-present",
      "severity": "error",
      "category": "Required fields",
      "description": "<Creative> must contain <UniversalAdId> (VAST 4.0+)",
      "specRef": "IAB VAST 4.0 §2.3.4",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-universaladid-present/"
    },
    {
      "id": "VAST-4.0-universaladid-idregistry",
      "severity": "error",
      "category": "Required fields",
      "description": "<UniversalAdId> must have an idRegistry attribute",
      "specRef": "IAB VAST 4.0 §2.3.4",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-universaladid-idregistry/"
    },
    {
      "id": "VAST-2.0-linear-duration",
      "severity": "error",
      "category": "Required fields",
      "description": "<Linear> must contain <Duration>",
      "specRef": "IAB VAST 2.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-linear-duration/"
    },
    {
      "id": "VAST-2.0-linear-mediafiles",
      "severity": "error",
      "category": "Required fields",
      "description": "<Linear> must contain <MediaFiles> with at least one <MediaFile>",
      "specRef": "IAB VAST 2.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-linear-mediafiles/"
    },
    {
      "id": "VAST-2.0-mediafile-delivery",
      "severity": "error",
      "category": "Required fields",
      "description": "<MediaFile> must have a delivery attribute",
      "specRef": "IAB VAST 2.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-mediafile-delivery/"
    },
    {
      "id": "VAST-2.0-mediafile-type",
      "severity": "error",
      "category": "Required fields",
      "description": "<MediaFile> must have a type attribute",
      "specRef": "IAB VAST 2.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-mediafile-type/"
    },
    {
      "id": "VAST-2.0-mediafile-dimensions",
      "severity": "error",
      "category": "Required fields",
      "description": "<MediaFile> must have width and height attributes",
      "specRef": "IAB VAST 2.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-mediafile-dimensions/"
    },
    {
      "id": "VAST-2.0-wrapper-adsystem",
      "severity": "error",
      "category": "Required fields",
      "description": "<Wrapper> must contain <AdSystem>",
      "specRef": "IAB VAST 2.0 §2.5",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-wrapper-adsystem/"
    },
    {
      "id": "VAST-2.0-wrapper-impression",
      "severity": "error",
      "category": "Required fields",
      "description": "<Wrapper> must contain at least one <Impression>",
      "specRef": "IAB VAST 2.0 §2.5",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-wrapper-impression/"
    },
    {
      "id": "VAST-2.0-wrapper-vastadtaguri",
      "severity": "error",
      "category": "Required fields",
      "description": "<Wrapper> must contain <VASTAdTagURI>",
      "specRef": "IAB VAST 2.0 §2.5",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-wrapper-vastadtaguri/"
    },
    {
      "id": "VAST-2.0-companion-resource",
      "severity": "error",
      "category": "Required fields",
      "description": "<Companion> must contain at least one StaticResource, IFrameResource, or HTMLResource",
      "specRef": "IAB VAST 2.0 §2.4.2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-companion-resource/"
    },
    {
      "id": "VAST-2.0-nonlinear-resource",
      "severity": "error",
      "category": "Required fields",
      "description": "InLine <NonLinear> must contain at least one StaticResource, IFrameResource, or HTMLResource",
      "specRef": "IAB VAST 2.0 §2.4.3",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-nonlinear-resource/"
    },
    {
      "id": "VAST-2.0-wrapper-depth",
      "severity": "error",
      "category": "Structure",
      "description": "Wrapper chain depth exceeds the configured maximum",
      "specRef": "IAB VAST 2.0 §2.5",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-wrapper-depth/"
    },
    {
      "id": "VAST-2.0-ad-sequence",
      "severity": "warning",
      "category": "Structure",
      "description": "Mixed use of sequence attribute across <Ad> elements in a pod",
      "specRef": "IAB VAST 2.0 §2.2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-ad-sequence/"
    },
    {
      "id": "VAST-2.0-duplicate-singular-element",
      "severity": "error",
      "category": "Structure",
      "description": "Element appears more than once where the spec allows a single occurrence",
      "specRef": "IAB VAST 4.2 XSD",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-duplicate-singular-element/"
    },
    {
      "id": "VAST-2.0-text-only-element",
      "severity": "error",
      "category": "Schema",
      "description": "Text-only element contains a child element",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-text-only-element/"
    },
    {
      "id": "VAST-2.0-unknown-attribute",
      "severity": "warning",
      "category": "Schema",
      "description": "Element has an attribute not defined in the VAST spec",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-unknown-attribute/"
    },
    {
      "id": "VAST-2.0-inline-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<InLine> contains an unrecognised child element",
      "specRef": "IAB VAST 2.0 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-inline-unknown-child/"
    },
    {
      "id": "VAST-2.0-wrapper-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<Wrapper> contains an unrecognised child element",
      "specRef": "IAB VAST 2.0 §2.5",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-wrapper-unknown-child/"
    },
    {
      "id": "VAST-2.0-creatives-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<Creatives> may only contain <Creative> elements",
      "specRef": "IAB VAST 2.0 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-creatives-unknown-child/"
    },
    {
      "id": "VAST-2.0-creative-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<Creative> contains an unrecognised child element",
      "specRef": "IAB VAST 2.0 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-creative-unknown-child/"
    },
    {
      "id": "VAST-2.0-linear-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<Linear> contains an unrecognised child element",
      "specRef": "IAB VAST 2.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-linear-unknown-child/"
    },
    {
      "id": "VAST-2.0-trackingevents-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<TrackingEvents> may only contain <Tracking> elements",
      "specRef": "IAB VAST 2.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-trackingevents-unknown-child/"
    },
    {
      "id": "VAST-2.0-mediafiles-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<MediaFiles> contains an unrecognised child element",
      "specRef": "IAB VAST 2.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-mediafiles-unknown-child/"
    },
    {
      "id": "VAST-2.0-extensions-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<Extensions> may only contain <Extension> elements",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-extensions-unknown-child/"
    },
    {
      "id": "VAST-2.0-videoclicks-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<VideoClicks> contains an unrecognised child element",
      "specRef": "IAB VAST 2.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-videoclicks-unknown-child/"
    },
    {
      "id": "VAST-2.0-nonlinearads-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<NonLinearAds> contains an unrecognised child element",
      "specRef": "IAB VAST 2.0 §2.4.3",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-nonlinearads-unknown-child/"
    },
    {
      "id": "VAST-2.0-nonlinear-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<NonLinear> contains an unrecognised child element",
      "specRef": "IAB VAST 2.0 §2.4.3",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-nonlinear-unknown-child/"
    },
    {
      "id": "VAST-2.0-companionads-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<CompanionAds> may only contain <Companion> elements",
      "specRef": "IAB VAST 2.0 §2.4.2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-companionads-unknown-child/"
    },
    {
      "id": "VAST-2.0-companion-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<Companion> contains an unrecognised child element",
      "specRef": "IAB VAST 2.0 §2.4.2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-companion-unknown-child/"
    },
    {
      "id": "VAST-3.0-icons-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<Icons> may only contain <Icon> elements",
      "specRef": "IAB VAST 3.0 §2.4.5",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-icons-unknown-child/"
    },
    {
      "id": "VAST-3.0-icon-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<Icon> contains an unrecognised child element",
      "specRef": "IAB VAST 3.0 §2.4.5",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-icon-unknown-child/"
    },
    {
      "id": "VAST-3.0-iconclicks-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<IconClicks> contains an unrecognised child element",
      "specRef": "IAB VAST 3.0 §2.4.5",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-iconclicks-unknown-child/"
    },
    {
      "id": "VAST-2.0-creativeextensions-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<CreativeExtensions> may only contain <CreativeExtension> elements",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-creativeextensions-unknown-child/"
    },
    {
      "id": "VAST-4.2-closedcaptionfiles-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<ClosedCaptionFiles> may only contain <ClosedCaptionFile> elements",
      "specRef": "IAB VAST 4.2 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.2-closedcaptionfiles-unknown-child/"
    },
    {
      "id": "VAST-4.0-adverifications-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<AdVerifications> may only contain <Verification> elements",
      "specRef": "IAB VAST 4.0 §3.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-adverifications-unknown-child/"
    },
    {
      "id": "VAST-4.0-verification-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<Verification> contains an unrecognised child element",
      "specRef": "IAB VAST 4.0 §3.4.2",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-verification-unknown-child/"
    },
    {
      "id": "VAST-4.0-viewableimpression-unknown-child",
      "severity": "error",
      "category": "Schema",
      "description": "<ViewableImpression> contains an unrecognised child element",
      "specRef": "IAB VAST 4.0 §3.4.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-viewableimpression-unknown-child/"
    },
    {
      "id": "VAST-4.0-wrapper-bool-attr",
      "severity": "warning",
      "category": "Schema",
      "description": "<Wrapper> followAdditionalWrappers, allowMultipleAds and fallbackOnNoAd must be a boolean",
      "specRef": "IAB VAST 4.0 XSD",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-wrapper-bool-attr/"
    },
    {
      "id": "VAST-4.1-expires-integer",
      "severity": "warning",
      "category": "Values",
      "description": "<Expires> value must be an integer number of seconds",
      "specRef": "IAB VAST 4.1 §3.2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-expires-integer/"
    },
    {
      "id": "VAST-2.0-extension-misplaced-element",
      "severity": "warning",
      "category": "Schema",
      "description": "<Extension> contains an element that has a dedicated location in the VAST spec",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-extension-misplaced-element/"
    },
    {
      "id": "VAST-2.0-creative-extension-misplaced-element",
      "severity": "warning",
      "category": "Schema",
      "description": "<CreativeExtension> contains an element that has a dedicated location in the VAST spec",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-creative-extension-misplaced-element/"
    },
    {
      "id": "VAST-2.0-extension-cdata",
      "severity": "warning",
      "category": "Schema",
      "description": "<Extension> leaf text with XML-sensitive characters should be wrapped in CDATA",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-extension-cdata/"
    },
    {
      "id": "VAST-2.0-creative-extension-cdata",
      "severity": "warning",
      "category": "Schema",
      "description": "<CreativeExtension> leaf text with XML-sensitive characters should be wrapped in CDATA",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-creative-extension-cdata/"
    },
    {
      "id": "VAST-2.0-url-cdata",
      "severity": "warning",
      "category": "Schema",
      "description": "URI value is not wrapped in CDATA",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-url-cdata/"
    },
    {
      "id": "VAST-2.0-mediafile-https",
      "severity": "info",
      "category": "Security",
      "description": "<MediaFile> URL uses HTTP instead of HTTPS",
      "specRef": "IAB VAST 2.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-mediafile-https/"
    },
    {
      "id": "VAST-2.0-tracking-https",
      "severity": "info",
      "category": "Security",
      "description": "Tracking or click URL uses HTTP instead of HTTPS",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-tracking-https/"
    },
    {
      "id": "VAST-2.0-url-empty",
      "severity": "error",
      "category": "Security",
      "description": "URL field is empty",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-url-empty/"
    },
    {
      "id": "VAST-2.0-url-invalid",
      "severity": "warning",
      "category": "Security",
      "description": "URL field does not appear to be a valid URI",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-url-invalid/"
    },
    {
      "id": "VAST-2.0-parse-error",
      "severity": "error",
      "category": "Consistency",
      "description": "XML parse error — document may be malformed",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-parse-error/"
    },
    {
      "id": "VAST-2.0-version-mismatch",
      "severity": "warning",
      "category": "Consistency",
      "description": "Declared version does not match structural signals",
      "specRef": "IAB VAST 2.0 §2.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-version-mismatch/"
    },
    {
      "id": "VAST-2.0-duplicate-impression",
      "severity": "warning",
      "category": "Consistency",
      "description": "Duplicate <Impression> URL within the same <Ad>",
      "specRef": "IAB VAST 2.0 §2.3.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-duplicate-impression/"
    },
    {
      "id": "VAST-4.0-conditionalad",
      "severity": "warning",
      "category": "Deprecated",
      "description": "conditionalAd attribute is deprecated as of VAST 4.1",
      "specRef": "IAB VAST 4.1 §2.2",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-conditionalad/"
    },
    {
      "id": "VAST-4.1-survey-deprecated",
      "severity": "warning",
      "category": "Deprecated",
      "description": "<Survey> is deprecated as of VAST 4.1",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-survey-deprecated/"
    },
    {
      "id": "VAST-4.1-vpaid-apiframework",
      "severity": "warning",
      "category": "Deprecated",
      "description": "apiFramework=\"VPAID\" is deprecated as of VAST 4.1",
      "specRef": "IAB VAST 4.1 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-vpaid-apiframework/"
    },
    {
      "id": "VAST-4.0-mediafile-apiframework",
      "severity": "info",
      "category": "Deprecated",
      "description": "<MediaFile apiFramework> is deprecated in VAST 4.0+ — use <InteractiveCreativeFile>",
      "specRef": "IAB VAST 4.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-mediafile-apiframework/"
    },
    {
      "id": "VAST-2.0-flash-mediafile",
      "severity": "warning",
      "category": "Deprecated",
      "description": "Flash-based MediaFile type is no longer supported",
      "specRef": "IAB VAST 2.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-flash-mediafile/"
    },
    {
      "id": "VAST-3.0-progress-offset",
      "severity": "error",
      "category": "Ambiguous",
      "description": "<Tracking event=\"progress\"> requires an offset attribute",
      "specRef": "IAB VAST 3.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-progress-offset/"
    },
    {
      "id": "VAST-3.0-icon-attrs",
      "severity": "warning",
      "category": "Ambiguous",
      "description": "Icon missing recommended attributes (program/width/height/position)",
      "specRef": "IAB VAST 3.0 §2.4.5",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-icon-attrs/"
    },
    {
      "id": "VAST-2.0-nonlinear-dimensions",
      "severity": "warning",
      "category": "Ambiguous",
      "description": "<NonLinear> missing required width or height attributes",
      "specRef": "IAB VAST 2.0 §2.4.3 / VAST 4.2 §2.4.3",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-nonlinear-dimensions/"
    },
    {
      "id": "VAST-2.0-companion-dimensions",
      "severity": "warning",
      "category": "Ambiguous",
      "description": "<Companion> missing width or height",
      "specRef": "IAB VAST 2.0 §2.4.2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-companion-dimensions/"
    },
    {
      "id": "VAST-4.0-wrapper-clickthrough",
      "severity": "warning",
      "category": "Ambiguous",
      "description": "<ClickThrough> inside Wrapper <VideoClicks> was removed in VAST 4.0 (re-allowed in 4.2)",
      "specRef": "IAB VAST 4.0 §2.5 / VAST 4.2 §2.5",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-wrapper-clickthrough/"
    },
    {
      "id": "VAST-4.2-icon-fallback-image-width-height",
      "severity": "warning",
      "category": "Ambiguous",
      "description": "<IconClickFallbackImage> should have width and height attributes",
      "specRef": "IAB VAST 4.2 §2.4.5",
      "docs": "https://vastlint.org/docs/rules/VAST-4.2-icon-fallback-image-width-height/"
    },
    {
      "id": "VAST-2.0-linear-tracking-quartiles",
      "severity": "warning",
      "category": "Ambiguous",
      "description": "<Linear> has no standard quartile tracking events — measurement system receives no signal",
      "specRef": "IAB VAST 4.1 §3.14.2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-linear-tracking-quartiles/"
    },
    {
      "id": "VAST-3.0-pricing-model",
      "severity": "error",
      "category": "Required fields",
      "description": "<Pricing> missing required model attribute",
      "specRef": "IAB VAST 3.0 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-pricing-model/"
    },
    {
      "id": "VAST-3.0-pricing-currency",
      "severity": "error",
      "category": "Required fields",
      "description": "<Pricing> missing required currency attribute",
      "specRef": "IAB VAST 3.0 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-pricing-currency/"
    },
    {
      "id": "VAST-3.0-pricing-model-case",
      "severity": "warning",
      "category": "Required fields",
      "description": "<Pricing> model value should be lowercase in VAST 3.0 (cpm/cpc/cpe/cpv)",
      "specRef": "IAB VAST 3.0 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-pricing-model-case/"
    },
    {
      "id": "VAST-3.0-pricing-currency-format",
      "severity": "warning",
      "category": "Required fields",
      "description": "<Pricing> currency attribute must be a 3-letter ISO-4217 code",
      "specRef": "IAB VAST 3.0 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-pricing-currency-format/"
    },
    {
      "id": "VAST-3.0-icon-program",
      "severity": "error",
      "category": "Required fields",
      "description": "<Icon> missing required program attribute",
      "specRef": "IAB VAST 3.0 §2.4.5",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-icon-program/"
    },
    {
      "id": "VAST-3.0-icon-width",
      "severity": "error",
      "category": "Required fields",
      "description": "<Icon> missing required width attribute",
      "specRef": "IAB VAST 3.0 §2.4.5",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-icon-width/"
    },
    {
      "id": "VAST-3.0-icon-height",
      "severity": "error",
      "category": "Required fields",
      "description": "<Icon> missing required height attribute",
      "specRef": "IAB VAST 3.0 §2.4.5",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-icon-height/"
    },
    {
      "id": "VAST-3.0-icon-xposition",
      "severity": "error",
      "category": "Required fields",
      "description": "<Icon> missing required xPosition attribute",
      "specRef": "IAB VAST 3.0 §2.4.5",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-icon-xposition/"
    },
    {
      "id": "VAST-3.0-icon-yposition",
      "severity": "error",
      "category": "Required fields",
      "description": "<Icon> missing required yPosition attribute",
      "specRef": "IAB VAST 3.0 §2.4.5",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-icon-yposition/"
    },
    {
      "id": "VAST-3.0-icon-resource",
      "severity": "error",
      "category": "Required fields",
      "description": "<Icon> must have at least one resource element",
      "specRef": "IAB VAST 3.0 §2.4.5",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-icon-resource/"
    },
    {
      "id": "VAST-4.0-category-authority",
      "severity": "error",
      "category": "Required fields",
      "description": "<Category> missing required authority attribute",
      "specRef": "IAB VAST 4.0 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-category-authority/"
    },
    {
      "id": "VAST-4.0-category-authority-not-uri",
      "severity": "warning",
      "category": "Values",
      "description": "<Category> authority attribute is not a valid authority URL",
      "specRef": "IAB VAST 4.0 §2.3.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-category-authority-not-uri/"
    },
    {
      "id": "VAST-4.0-category-authority-unknown",
      "severity": "info",
      "category": "Values",
      "description": "<Category> authority is not a recognised IAB Content Taxonomy authority",
      "specRef": "IAB Tech Lab Content Taxonomy",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-category-authority-unknown/"
    },
    {
      "id": "VAST-4.1-blockedadcategories-authority-not-uri",
      "severity": "warning",
      "category": "Values",
      "description": "<BlockedAdCategories> authority attribute is not a valid authority URL",
      "specRef": "IAB VAST 4.1 §2.3.2",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-blockedadcategories-authority-not-uri/"
    },
    {
      "id": "VAST-4.1-blockedadcategories-authority-unknown",
      "severity": "info",
      "category": "Values",
      "description": "<BlockedAdCategories> authority is not a recognised IAB Content Taxonomy authority",
      "specRef": "IAB Tech Lab Content Taxonomy",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-blockedadcategories-authority-unknown/"
    },
    {
      "id": "VAST-4.0-companion-clicktracking-id",
      "severity": "error",
      "category": "Required fields",
      "description": "<CompanionClickTracking> missing required id attribute",
      "specRef": "IAB VAST 4.0 §2.4.2",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-companion-clicktracking-id/"
    },
    {
      "id": "VAST-4.0-universaladid-idvalue",
      "severity": "error",
      "category": "Required fields",
      "description": "<UniversalAdId> missing required idValue attribute (VAST 4.0)",
      "specRef": "IAB VAST 4.0 §2.3.4",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-universaladid-idvalue/"
    },
    {
      "id": "VAST-4.1-universaladid-idvalue-removed",
      "severity": "warning",
      "category": "Required fields",
      "description": "<UniversalAdId> idValue attribute was removed in VAST 4.1",
      "specRef": "IAB VAST 4.1 §2.3.4",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-universaladid-idvalue-removed/"
    },
    {
      "id": "VAST-4.1-universaladid-content",
      "severity": "error",
      "category": "Required fields",
      "description": "<UniversalAdId> must have text content in VAST 4.1+",
      "specRef": "IAB VAST 4.1 §2.3.4",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-universaladid-content/"
    },
    {
      "id": "VAST-4.1-mezzanine-delivery",
      "severity": "error",
      "category": "Required fields",
      "description": "<Mezzanine> missing required delivery attribute",
      "specRef": "IAB VAST 4.1 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-mezzanine-delivery/"
    },
    {
      "id": "VAST-4.1-mezzanine-type",
      "severity": "error",
      "category": "Required fields",
      "description": "<Mezzanine> missing required type attribute",
      "specRef": "IAB VAST 4.1 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-mezzanine-type/"
    },
    {
      "id": "VAST-4.1-mezzanine-width",
      "severity": "error",
      "category": "Required fields",
      "description": "<Mezzanine> missing required width attribute",
      "specRef": "IAB VAST 4.1 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-mezzanine-width/"
    },
    {
      "id": "VAST-4.1-mezzanine-height",
      "severity": "error",
      "category": "Required fields",
      "description": "<Mezzanine> missing required height attribute",
      "specRef": "IAB VAST 4.1 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-mezzanine-height/"
    },
    {
      "id": "VAST-4.1-verification-no-resource",
      "severity": "warning",
      "category": "Required fields",
      "description": "<Verification> should have JavaScriptResource or ExecutableResource",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-verification-no-resource/"
    },
    {
      "id": "VAST-4.1-blockedadcategories-no-authority",
      "severity": "warning",
      "category": "Required fields",
      "description": "<BlockedAdCategories> should have authority attribute",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-blockedadcategories-no-authority/"
    },
    {
      "id": "VAST-4.0-interactive-creative-no-api",
      "severity": "warning",
      "category": "Required fields",
      "description": "<InteractiveCreativeFile> should have an apiFramework attribute",
      "specRef": "IAB VAST 4.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-interactive-creative-no-api/"
    },
    {
      "id": "VAST-4.1-interactive-creative-type",
      "severity": "warning",
      "category": "Required fields",
      "description": "<InteractiveCreativeFile> should have a type attribute identifying the MIME type",
      "specRef": "IAB VAST 4.1 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-interactive-creative-type/"
    },
    {
      "id": "VAST-4.1-verification-vendor",
      "severity": "error",
      "category": "Required fields",
      "description": "<Verification> is missing required vendor attribute",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-verification-vendor/"
    },
    {
      "id": "VAST-4.1-js-resource-apiframework",
      "severity": "error",
      "category": "Required fields",
      "description": "<JavaScriptResource> is missing required apiFramework attribute",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-js-resource-apiframework/"
    },
    {
      "id": "VAST-4.3-js-resource-browser-optional",
      "severity": "warning",
      "category": "Required fields",
      "description": "<JavaScriptResource> should have a browserOptional attribute",
      "specRef": "IAB VAST 4.3 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.3-js-resource-browser-optional/"
    },
    {
      "id": "VAST-4.1-exec-resource-apiframework",
      "severity": "error",
      "category": "Required fields",
      "description": "<ExecutableResource> is missing required apiFramework attribute",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-exec-resource-apiframework/"
    },
    {
      "id": "VAST-4.1-exec-resource-type",
      "severity": "error",
      "category": "Required fields",
      "description": "<ExecutableResource> is missing required type attribute",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-exec-resource-type/"
    },
    {
      "id": "VAST-4.1-js-resource-apiframework-value",
      "severity": "warning",
      "category": "Required fields",
      "description": "OMID <JavaScriptResource> should declare apiFramework=\"omid\"",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-js-resource-apiframework-value/"
    },
    {
      "id": "VAST-4.1-js-resource-https",
      "severity": "warning",
      "category": "Security",
      "description": "OMID <JavaScriptResource> URL should use HTTPS",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-js-resource-https/"
    },
    {
      "id": "VAST-4.1-exec-resource-apiframework-value",
      "severity": "warning",
      "category": "Required fields",
      "description": "OMID <ExecutableResource> should declare apiFramework=\"omid\"",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-exec-resource-apiframework-value/"
    },
    {
      "id": "VAST-4.1-exec-resource-https",
      "severity": "warning",
      "category": "Security",
      "description": "OMID <ExecutableResource> reference should use HTTPS when it is a URL",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-exec-resource-https/"
    },
    {
      "id": "VAST-4.1-verification-vendor-format",
      "severity": "warning",
      "category": "Values",
      "description": "<Verification> vendor should use a domain-qualified identifier such as company.com-omid",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-verification-vendor-format/"
    },
    {
      "id": "VAST-4.1-verification-duplicate-vendor",
      "severity": "warning",
      "category": "Consistency",
      "description": "<AdVerifications> contains duplicate vendor identifiers",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-verification-duplicate-vendor/"
    },
    {
      "id": "VAST-4.1-verification-parameters",
      "severity": "warning",
      "category": "Required fields",
      "description": "OMID <Verification> should include non-empty <VerificationParameters>",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-verification-parameters/"
    },
    {
      "id": "VAST-4.1-verification-tracking-reason",
      "severity": "warning",
      "category": "Values",
      "description": "verificationNotExecuted tracking URI should include the [REASON] macro",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-verification-tracking-reason/"
    },
    {
      "id": "VAST-2.0-duration-format",
      "severity": "error",
      "category": "Values",
      "description": "<Duration> value does not match HH:MM:SS[.mmm] format",
      "specRef": "IAB VAST 2.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-duration-format/"
    },
    {
      "id": "VAST-2.0-mediafile-delivery-enum",
      "severity": "error",
      "category": "Values",
      "description": "<MediaFile> delivery must be \"progressive\" or \"streaming\"",
      "specRef": "IAB VAST 2.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-mediafile-delivery-enum/"
    },
    {
      "id": "VAST-3.0-skipoffset-format",
      "severity": "warning",
      "category": "Values",
      "description": "Linear skipoffset does not match HH:MM:SS[.mmm] or n% format",
      "specRef": "IAB VAST 3.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-skipoffset-format/"
    },
    {
      "id": "VAST-3.0-progress-offset-format",
      "severity": "warning",
      "category": "Values",
      "description": "Tracking progress offset does not match required format",
      "specRef": "IAB VAST 3.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-progress-offset-format/"
    },
    {
      "id": "VAST-3.0-skip-event-no-skipoffset",
      "severity": "warning",
      "category": "Values",
      "description": "skip tracking event present but Linear has no skipoffset attribute",
      "specRef": "IAB VAST 3.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-skip-event-no-skipoffset/"
    },
    {
      "id": "VAST-3.0-minmaxbitrate-pair",
      "severity": "error",
      "category": "Values",
      "description": "<MediaFile> must have both minBitrate and maxBitrate or neither",
      "specRef": "IAB VAST 3.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-minmaxbitrate-pair/"
    },
    {
      "id": "VAST-3.0-bitrate-conflict",
      "severity": "warning",
      "category": "Values",
      "description": "<MediaFile> has both bitrate and minBitrate/maxBitrate",
      "specRef": "IAB VAST 3.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-bitrate-conflict/"
    },
    {
      "id": "VAST-4.0-tracking-event-removed",
      "severity": "warning",
      "category": "Values",
      "description": "fullscreen/exitFullscreen tracking events were removed in VAST 4.0",
      "specRef": "IAB VAST 4.0 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.0-tracking-event-removed/"
    },
    {
      "id": "VAST-4.1-tracking-event-value",
      "severity": "error",
      "category": "Values",
      "description": "Tracking event attribute not in the valid set for this VAST version",
      "specRef": "IAB VAST 4.1 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-tracking-event-value/"
    },
    {
      "id": "VAST-4.1-adtype-value",
      "severity": "warning",
      "category": "Values",
      "description": "Ad adType must be video, audio, or hybrid",
      "specRef": "IAB VAST 4.1 §2.2.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-adtype-value/"
    },
    {
      "id": "VAST-4.1-companion-renderingmode-value",
      "severity": "warning",
      "category": "Values",
      "description": "Companion renderingMode must be default, end-card, or concurrent",
      "specRef": "IAB VAST 4.1 §2.4.2",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-companion-renderingmode-value/"
    },
    {
      "id": "VAST-3.0-companion-required-attr",
      "severity": "warning",
      "category": "Values",
      "description": "<CompanionAds> required attribute must be all, any, or none",
      "specRef": "IAB VAST 3.0 §2.4.2",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-companion-required-attr/"
    },
    {
      "id": "VAST-4.1-mezzanine-recommended",
      "severity": "info",
      "category": "CTV",
      "description": "<MediaFiles> has no <Mezzanine> — may be rejected in CTV/SSAI contexts",
      "specRef": "IAB VAST 4.1 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-mezzanine-recommended/"
    },
    {
      "id": "VAST-4.1-vpaid-in-interactive-context",
      "severity": "warning",
      "category": "CTV",
      "description": "VPAID MediaFile alongside InteractiveCreativeFile — VPAID unsupported in CTV",
      "specRef": "IAB VAST 4.1 §2.4.1",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-vpaid-in-interactive-context/"
    },
    {
      "id": "VAST-4.1-ad-serving-id-empty",
      "severity": "warning",
      "category": "CTV",
      "description": "<AdServingId> is present but empty",
      "specRef": "IAB VAST 4.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-ad-serving-id-empty/"
    },
    {
      "id": "VAST-4.4-version-attribute",
      "severity": "info",
      "category": "CTV Ad Portfolio",
      "description": "Document declares VAST 4.4, a working-group draft rather than a published spec",
      "specRef": "IAB vast_4.4.xsd (draft annotation)",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-version-attribute/"
    },
    {
      "id": "VAST-4.4-nonlinear-no-renderable-asset",
      "severity": "warning",
      "category": "CTV Ad Portfolio",
      "description": "<NonLinear> has a SIMID interactive file but no renderable fallback asset",
      "specRef": "IAB CTV Ad Portfolio §Secure Interactive Ad Units (Fallback Media)",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-nonlinear-no-renderable-asset/"
    },
    {
      "id": "VAST-4.4-nonlinear-mediafiles-empty",
      "severity": "error",
      "category": "CTV Ad Portfolio",
      "description": "<NonLinear> <MediaFiles> contains no renderable or interactive asset",
      "specRef": "IAB CTV Ad Portfolio §Signaling the Five Non-Linear CTV Formats",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-nonlinear-mediafiles-empty/"
    },
    {
      "id": "VAST-4.4-nonlinear-simid-iframe",
      "severity": "info",
      "category": "CTV Ad Portfolio",
      "description": "<IFrameResource apiFramework=\"SIMID\"> is superseded by <InteractiveCreativeFile> in NonLinear",
      "specRef": "IAB CTV Ad Portfolio §Secure Interactive Ad Units",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-nonlinear-simid-iframe/"
    },
    {
      "id": "VAST-4.4-nonlinear-video-no-duration",
      "severity": "warning",
      "category": "CTV Ad Portfolio",
      "description": "<NonLinear> delivers video but has no <Duration>: quartile tracking cannot fire",
      "specRef": "IAB CTV Ad Portfolio §Handling Duration",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-nonlinear-video-no-duration/"
    },
    {
      "id": "VAST-4.4-adcom-extension-unknown-signal",
      "severity": "warning",
      "category": "CTV Ad Portfolio",
      "description": "<Extension ext=\"adcom\"> type is not plcmt, pos, playbackmethod or attr",
      "specRef": "IAB CTV Ad Portfolio §Purpose of VAST ext",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-adcom-extension-unknown-signal/"
    },
    {
      "id": "VAST-4.4-adcom-extension-type-mismatch",
      "severity": "warning",
      "category": "CTV Ad Portfolio",
      "description": "<Extension> type attribute and AdCOM payload element name disagree",
      "specRef": "IAB CTV Ad Portfolio §Purpose of VAST ext",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-adcom-extension-type-mismatch/"
    },
    {
      "id": "VAST-4.4-adcom-signal-not-integer",
      "severity": "error",
      "category": "CTV Ad Portfolio",
      "description": "AdCOM signal payload in <Extension> is not an integer",
      "specRef": "IAB AdCOM 1.0 enumerated lists",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-adcom-signal-not-integer/"
    },
    {
      "id": "VAST-4.4-adcom-plcmt-value",
      "severity": "warning",
      "category": "CTV Ad Portfolio",
      "description": "AdCOM plcmt outside the Plcmt Subtypes (Video) range 1–9",
      "specRef": "IAB AdCOM List: Plcmt Subtypes - Video",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-adcom-plcmt-value/"
    },
    {
      "id": "VAST-4.4-adcom-playbackmethod-value",
      "severity": "warning",
      "category": "CTV Ad Portfolio",
      "description": "AdCOM playbackmethod outside the Playback Methods range 1–11",
      "specRef": "IAB AdCOM List: Playback Methods",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-adcom-playbackmethod-value/"
    },
    {
      "id": "VAST-4.4-adcom-pos-value",
      "severity": "warning",
      "category": "CTV Ad Portfolio",
      "description": "AdCOM pos outside the Placement Positions range 0–17",
      "specRef": "IAB AdCOM List: Placement Positions",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-adcom-pos-value/"
    },
    {
      "id": "VAST-4.4-adcom-pos-format-mismatch",
      "severity": "warning",
      "category": "CTV Ad Portfolio",
      "description": "AdCOM pos is not a position the declared plcmt format supports",
      "specRef": "IAB CTV Ad Portfolio §Format-to-Signal Reference Table",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-adcom-pos-format-mismatch/"
    },
    {
      "id": "VAST-4.4-adcom-playbackmethod-format-mismatch",
      "severity": "warning",
      "category": "CTV Ad Portfolio",
      "description": "AdCOM playbackmethod and plcmt name different CTV Ad Portfolio formats",
      "specRef": "IAB CTV Ad Portfolio §Format-to-Signal Reference Table",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-adcom-playbackmethod-format-mismatch/"
    },
    {
      "id": "VAST-4.4-adcom-attr-not-motion",
      "severity": "info",
      "category": "CTV Ad Portfolio",
      "description": "AdCOM attr is not a CTV Ad Portfolio creative attribute (19 QR, 20 alpha, 21–23 motion)",
      "specRef": "IAB CTV Ad Portfolio §Declaring Creative Experience with battr and attr",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-adcom-attr-not-motion/"
    },
    {
      "id": "VAST-4.4-qrcode-position-attrs",
      "severity": "error",
      "category": "CTV Ad Portfolio",
      "description": "<QrCodePosition> requires both xPosition and yPosition",
      "specRef": "IAB vast_4.4.xsd vastQrCodePosition_type",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-qrcode-position-attrs/"
    },
    {
      "id": "VAST-4.4-qrcode-position-percent",
      "severity": "error",
      "category": "CTV Ad Portfolio",
      "description": "<QrCodePosition> coordinates must be percentages, not pixels",
      "specRef": "IAB vast_4.4.xsd vastPercent_type",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-qrcode-position-percent/"
    },
    {
      "id": "VAST-4.4-qrcode-size-attr",
      "severity": "error",
      "category": "CTV Ad Portfolio",
      "description": "<QrCodeSize> requires a size attribute",
      "specRef": "IAB vast_4.4.xsd vastQrCodeSize_type",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-qrcode-size-attr/"
    },
    {
      "id": "VAST-4.4-qrcode-size-percent",
      "severity": "error",
      "category": "CTV Ad Portfolio",
      "description": "<QrCodeSize> size must be a percentage",
      "specRef": "IAB vast_4.4.xsd vastPercent_type",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-qrcode-size-percent/"
    },
    {
      "id": "VAST-4.4-qrcode-missing-scan-url",
      "severity": "warning",
      "category": "CTV Ad Portfolio",
      "description": "QR code geometry declared without a <QrCodeScanUrl> destination",
      "specRef": "IAB CTV Ad Portfolio §QR Code Signaling",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-qrcode-missing-scan-url/"
    },
    {
      "id": "VAST-4.4-qrcode-missing-image-url",
      "severity": "warning",
      "category": "CTV Ad Portfolio",
      "description": "QR code geometry declared without a <QrCodeImageUrl> image",
      "specRef": "IAB CTV Ad Portfolio §QR Code Signaling",
      "docs": "https://vastlint.org/docs/rules/VAST-4.4-qrcode-missing-image-url/"
    },
    {
      "id": "VAST-3.0-adparameters-xmlencoded-value",
      "severity": "warning",
      "category": "Values",
      "description": "<AdParameters> xmlEncoded must be a boolean",
      "specRef": "IAB VAST 3.0 §2.3.5.3",
      "docs": "https://vastlint.org/docs/rules/VAST-3.0-adparameters-xmlencoded-value/"
    },
    {
      "id": "VAST-2.0-ctv-portfolio-creative-id-required",
      "severity": "error",
      "category": "CTV Ad Portfolio",
      "description": "<Extension type=\"ctv_ad_portfolio\"> needs <CreativeId> when the ad has multiple creatives",
      "specRef": "IAB CTV Ad Portfolio for VAST 2.0 §Implementation",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-ctv-portfolio-creative-id-required/"
    },
    {
      "id": "VAST-2.0-ctv-portfolio-creative-id-unmatched",
      "severity": "error",
      "category": "CTV Ad Portfolio",
      "description": "<Extension type=\"ctv_ad_portfolio\"> <CreativeId> matches no <Creative> id in the ad",
      "specRef": "IAB CTV Ad Portfolio for VAST 2.0 §Implementation",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-ctv-portfolio-creative-id-unmatched/"
    },
    {
      "id": "VAST-2.0-ctv-portfolio-mediafiles-required",
      "severity": "error",
      "category": "CTV Ad Portfolio",
      "description": "<Extension type=\"ctv_ad_portfolio\"> carries no <MediaFiles>",
      "specRef": "IAB CTV Ad Portfolio for VAST 2.0 §Media file delivery",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-ctv-portfolio-mediafiles-required/"
    },
    {
      "id": "VAST-2.0-ctv-portfolio-mediafiles-empty",
      "severity": "error",
      "category": "CTV Ad Portfolio",
      "description": "<Extension type=\"ctv_ad_portfolio\"> <MediaFiles> contains no renderable or interactive asset",
      "specRef": "IAB CTV Ad Portfolio for VAST 2.0 §Media file delivery",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-ctv-portfolio-mediafiles-empty/"
    },
    {
      "id": "VAST-2.0-ctv-portfolio-no-renderable-asset",
      "severity": "warning",
      "category": "CTV Ad Portfolio",
      "description": "<Extension type=\"ctv_ad_portfolio\"> has a SIMID file but no <MediaFile> fallback",
      "specRef": "IAB CTV Ad Portfolio for VAST 2.0 §SIMID interactive creative delivery",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-ctv-portfolio-no-renderable-asset/"
    },
    {
      "id": "VAST-2.0-ctv-portfolio-no-duration",
      "severity": "warning",
      "category": "CTV Ad Portfolio",
      "description": "<Extension type=\"ctv_ad_portfolio\"> delivers a timed asset but has no <Duration>",
      "specRef": "IAB CTV Ad Portfolio for VAST 2.0 §Duration and tracking",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-ctv-portfolio-no-duration/"
    },
    {
      "id": "VAST-2.0-macro-unknown",
      "severity": "warning",
      "category": "Macros",
      "description": "URL contains a [MACRO] that is not a recognised IAB VAST macro",
      "specRef": "IAB VAST 4.2 §6",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-macro-unknown/"
    },
    {
      "id": "VAST-2.0-macro-lowercase",
      "severity": "warning",
      "category": "Macros",
      "description": "Recognised macro is not uppercase — players match macro names case-sensitively",
      "specRef": "IAB VAST 4.2 §6",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-macro-lowercase/"
    },
    {
      "id": "VAST-4.1-macro-deprecated",
      "severity": "info",
      "category": "Macros",
      "description": "[CONTENTPLAYHEAD]/[MEDIAPLAYHEAD] are deprecated as of VAST 4.1 — use [ADPLAYHEAD]",
      "specRef": "IAB VAST 4.1 §6",
      "docs": "https://vastlint.org/docs/rules/VAST-4.1-macro-deprecated/"
    },
    {
      "id": "VAST-2.0-macro-wrong-context",
      "severity": "info",
      "category": "Macros",
      "description": "Context-restricted macro ([ERRORCODE]/[REASON]) used where it has no defined value",
      "specRef": "IAB VAST 4.2 §6",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-macro-wrong-context/"
    },
    {
      "id": "VAST-2.0-macro-uri-unencoded",
      "severity": "warning",
      "category": "Macros",
      "description": "Macro-bearing URL contains characters that must be percent-encoded per RFC 3986",
      "specRef": "RFC 3986 §2.1",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-macro-uri-unencoded/"
    },
    {
      "id": "VAST-2.0-adtitle-quality",
      "severity": "warning",
      "category": "Quality",
      "description": "<AdTitle> value is a known placeholder string; the creative cannot be identified in reporting",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-adtitle-quality/"
    },
    {
      "id": "VAST-2.0-adsystem-quality",
      "severity": "info",
      "category": "Quality",
      "description": "<AdSystem> value is a known placeholder string; the tag cannot be traced to its serving system",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-adsystem-quality/"
    },
    {
      "id": "VAST-2.0-adsystem-no-version",
      "severity": "info",
      "category": "Quality",
      "description": "<AdSystem> has no version attribute; provenance is harder to trace in partner debugging",
      "specRef": "IAB VAST 2.0 §2",
      "docs": "https://vastlint.org/docs/rules/VAST-2.0-adsystem-no-version/"
    },
    {
      "id": "SIMID-1.0-simid-type-required",
      "severity": "error",
      "category": "SIMID",
      "description": "<InteractiveCreativeFile apiFramework=\"SIMID\"> must have type=\"text/html\"",
      "specRef": "IAB SIMID 1.0 §5",
      "docs": "https://vastlint.org/docs/rules/SIMID-1.0-simid-type-required/"
    },
    {
      "id": "SIMID-1.0-simid-url-empty",
      "severity": "error",
      "category": "SIMID",
      "description": "<InteractiveCreativeFile apiFramework=\"SIMID\"> must contain a non-empty URL",
      "specRef": "IAB SIMID 1.0 §3.1",
      "docs": "https://vastlint.org/docs/rules/SIMID-1.0-simid-url-empty/"
    },
    {
      "id": "SIMID-1.0-simid-url-https",
      "severity": "error",
      "category": "SIMID",
      "description": "<InteractiveCreativeFile apiFramework=\"SIMID\"> URL must use HTTPS",
      "specRef": "IAB SIMID 1.0 §3.1",
      "docs": "https://vastlint.org/docs/rules/SIMID-1.0-simid-url-https/"
    },
    {
      "id": "SIMID-1.0-simid-url-data-html",
      "severity": "error",
      "category": "SIMID",
      "description": "SIMID data: URI must declare text/html",
      "specRef": "IAB SIMID 1.0 §3.1",
      "docs": "https://vastlint.org/docs/rules/SIMID-1.0-simid-url-data-html/"
    },
    {
      "id": "SIMID-1.0-simid-apiframework-case",
      "severity": "warning",
      "category": "SIMID",
      "description": "apiFramework must be exactly \"SIMID\" (case-sensitive per SIMID §5)",
      "specRef": "IAB SIMID 1.0 §5",
      "docs": "https://vastlint.org/docs/rules/SIMID-1.0-simid-apiframework-case/"
    },
    {
      "id": "SIMID-1.0-simid-variable-duration-value",
      "severity": "warning",
      "category": "SIMID",
      "description": "variableDuration must be \"true\" when present on a SIMID InteractiveCreativeFile",
      "specRef": "IAB SIMID 1.0 §5",
      "docs": "https://vastlint.org/docs/rules/SIMID-1.0-simid-variable-duration-value/"
    },
    {
      "id": "SIMID-1.0-simid-mediafile-required",
      "severity": "error",
      "category": "SIMID",
      "description": "Linear SIMID ad must include a video/audio <MediaFile> alongside the interactive creative",
      "specRef": "IAB SIMID 1.0 §3.4",
      "docs": "https://vastlint.org/docs/rules/SIMID-1.0-simid-mediafile-required/"
    },
    {
      "id": "SIMID-1.0-simid-interactive-start",
      "severity": "info",
      "category": "SIMID",
      "description": "Linear SIMID creative on VAST 4.2+ should include an interactiveStart tracking event",
      "specRef": "IAB VAST 4.2 interactiveStart",
      "docs": "https://vastlint.org/docs/rules/SIMID-1.0-simid-interactive-start/"
    },
    {
      "id": "SIMID-1.0-simid-ssai-no-client",
      "severity": "info",
      "category": "SIMID",
      "description": "Linear SIMID creative with a Mezzanine but no progressive MediaFile cannot run in SSAI",
      "specRef": "IAB VAST 4.1 §1.1.2",
      "docs": "https://vastlint.org/docs/rules/SIMID-1.0-simid-ssai-no-client/"
    },
    {
      "id": "SIMID-1.1-nonlinear-simid-no-iframe",
      "severity": "error",
      "category": "SIMID",
      "description": "<NonLinear apiFramework=\"SIMID\"> must contain an <IFrameResource>",
      "specRef": "IAB SIMID 1.1 §3.5.1",
      "docs": "https://vastlint.org/docs/rules/SIMID-1.1-nonlinear-simid-no-iframe/"
    },
    {
      "id": "SIMID-1.1-iframe-simid-type-required",
      "severity": "warning",
      "category": "SIMID",
      "description": "<IFrameResource> in SIMID <NonLinear> should have type=\"text/html\"",
      "specRef": "IAB SIMID 1.1 §3.5.1",
      "docs": "https://vastlint.org/docs/rules/SIMID-1.1-iframe-simid-type-required/"
    },
    {
      "id": "SIMID-1.1-iframe-simid-url-empty",
      "severity": "error",
      "category": "SIMID",
      "description": "<IFrameResource> in SIMID <NonLinear> must contain a non-empty URL",
      "specRef": "IAB SIMID 1.1 §3.5.1",
      "docs": "https://vastlint.org/docs/rules/SIMID-1.1-iframe-simid-url-empty/"
    },
    {
      "id": "SIMID-1.1-iframe-simid-url-https",
      "severity": "error",
      "category": "SIMID",
      "description": "<IFrameResource> in SIMID <NonLinear> URL must use HTTPS",
      "specRef": "IAB SIMID 1.1 §3.5.1",
      "docs": "https://vastlint.org/docs/rules/SIMID-1.1-iframe-simid-url-https/"
    },
    {
      "id": "VMAP-1.0-root-version",
      "severity": "error",
      "category": "VMAP",
      "description": "Root `<VMAP>` element must have a version attribute",
      "specRef": "IAB VMAP 1.0.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-root-version/"
    },
    {
      "id": "VMAP-1.0-root-version-value",
      "severity": "warning",
      "category": "VMAP",
      "description": "`<VMAP>` version attribute should be `\"1.0\"` — the only published VMAP version",
      "specRef": "IAB VMAP 1.0.1 §2.3",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-root-version-value/"
    },
    {
      "id": "VMAP-1.0-root-namespace",
      "severity": "warning",
      "category": "VMAP",
      "description": "`<VMAP>` should declare the VMAP namespace URI http://www.iab.net/videosuite/vmap",
      "specRef": "IAB VMAP 1.0.1 §2.2",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-root-namespace/"
    },
    {
      "id": "VMAP-1.0-root-unknown-child",
      "severity": "error",
      "category": "VMAP",
      "description": "`<VMAP>` may only contain `<AdBreak>` and `<Extensions>` elements",
      "specRef": "IAB VMAP 1.0.1 §2.3.1",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-root-unknown-child/"
    },
    {
      "id": "VMAP-1.0-adbreak-timeoffset",
      "severity": "error",
      "category": "VMAP",
      "description": "`<AdBreak>` must have a timeOffset attribute",
      "specRef": "IAB VMAP 1.0.1 §2.3.1",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-adbreak-timeoffset/"
    },
    {
      "id": "VMAP-1.0-adbreak-timeoffset-format",
      "severity": "error",
      "category": "VMAP",
      "description": "`<AdBreak>` timeOffset must be hh:mm:ss[.mmm], n%, `\"start\"`, `\"end\"`, or #m",
      "specRef": "IAB VMAP 1.0.1 §2.3.1",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-adbreak-timeoffset-format/"
    },
    {
      "id": "VMAP-1.0-adbreak-breaktype",
      "severity": "error",
      "category": "VMAP",
      "description": "`<AdBreak>` must have a breakType attribute",
      "specRef": "IAB VMAP 1.0.1 §2.3.1",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-adbreak-breaktype/"
    },
    {
      "id": "VMAP-1.0-adbreak-breaktype-value",
      "severity": "error",
      "category": "VMAP",
      "description": "`<AdBreak>` breakType must be a comma-separated list of `\"linear\"`, `\"nonlinear\"`, or `\"display\"`",
      "specRef": "IAB VMAP 1.0.1 §2.3.1",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-adbreak-breaktype-value/"
    },
    {
      "id": "VMAP-1.0-adbreak-repeatafter-format",
      "severity": "warning",
      "category": "VMAP",
      "description": "`<AdBreak>` repeatAfter does not match the required hh:mm:ss[.mmm] format",
      "specRef": "IAB VMAP 1.0.1 §2.3.1",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-adbreak-repeatafter-format/"
    },
    {
      "id": "VMAP-1.0-adbreak-unknown-child",
      "severity": "error",
      "category": "VMAP",
      "description": "`<AdBreak>` may only contain `<AdSource>`, `<TrackingEvents>`, and `<Extensions>` elements",
      "specRef": "IAB VMAP 1.0.1 §2.3.1",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-adbreak-unknown-child/"
    },
    {
      "id": "VMAP-1.0-adbreak-multiple-adsource",
      "severity": "error",
      "category": "VMAP",
      "description": "`<AdBreak>` may contain at most one `<AdSource>` element",
      "specRef": "IAB VMAP 1.0.1 §2.3.2",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-adbreak-multiple-adsource/"
    },
    {
      "id": "VMAP-1.0-adsource-bool-attr",
      "severity": "warning",
      "category": "VMAP",
      "description": "`<AdSource>` allowMultipleAds and followRedirects must be `\"true\"` or `\"false\"`",
      "specRef": "IAB VMAP 1.0.1 §2.3.2",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-adsource-bool-attr/"
    },
    {
      "id": "VMAP-1.0-adsource-content",
      "severity": "error",
      "category": "VMAP",
      "description": "`<AdSource>` must contain exactly one of `<VASTAdData>`, `<AdTagURI>`, or `<CustomAdData>`",
      "specRef": "IAB VMAP 1.0.1 §2.3.2",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-adsource-content/"
    },
    {
      "id": "VMAP-1.0-adtaguri-empty",
      "severity": "error",
      "category": "VMAP",
      "description": "`<AdTagURI>` must contain a URI referencing an ad response",
      "specRef": "IAB VMAP 1.0.1 §2.3.2",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-adtaguri-empty/"
    },
    {
      "id": "VMAP-1.0-adtaguri-cdata",
      "severity": "error",
      "category": "VMAP",
      "description": "`<AdTagURI>` URI must be contained within a CDATA block",
      "specRef": "IAB VMAP 1.0.1 §2.3.2",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-adtaguri-cdata/"
    },
    {
      "id": "VMAP-1.0-customaddata-cdata",
      "severity": "error",
      "category": "VMAP",
      "description": "`<CustomAdData>` data must be contained within a CDATA block",
      "specRef": "IAB VMAP 1.0.1 §2.3.2",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-customaddata-cdata/"
    },
    {
      "id": "VMAP-1.0-vastaddata-vast-root",
      "severity": "error",
      "category": "VMAP",
      "description": "`<VASTAdData>` must contain an embedded `<VAST>` element (as XML, not CDATA)",
      "specRef": "IAB VMAP 1.0.1 §2.3.2",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-vastaddata-vast-root/"
    },
    {
      "id": "VMAP-1.0-embedded-vast-version",
      "severity": "info",
      "category": "VMAP",
      "description": "Embedded VAST is not version 3.0 — VMAP players are only required to support VAST 3.0",
      "specRef": "IAB VMAP 1.0.1 §3.2",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-embedded-vast-version/"
    },
    {
      "id": "VMAP-1.0-trackingevents-unknown-child",
      "severity": "error",
      "category": "VMAP",
      "description": "VMAP `<TrackingEvents>` may only contain `<Tracking>` elements",
      "specRef": "IAB VMAP 1.0.1 §2.3.3",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-trackingevents-unknown-child/"
    },
    {
      "id": "VMAP-1.0-tracking-event",
      "severity": "error",
      "category": "VMAP",
      "description": "VMAP `<Tracking>` must have an event attribute",
      "specRef": "IAB VMAP 1.0.1 §2.3.3",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-tracking-event/"
    },
    {
      "id": "VMAP-1.0-tracking-event-value",
      "severity": "error",
      "category": "VMAP",
      "description": "VMAP `<Tracking>` event must be `\"breakStart\"`, `\"breakEnd\"`, or `\"error\"`",
      "specRef": "IAB VMAP 1.0.1 §2.3.3",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-tracking-event-value/"
    },
    {
      "id": "VMAP-1.0-error-tracking-macro",
      "severity": "info",
      "category": "VMAP",
      "description": "VMAP error tracking URI should include the `[ERROR_CODE]` macro",
      "specRef": "IAB VMAP 1.0.1 §2.5",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-error-tracking-macro/"
    },
    {
      "id": "VMAP-1.0-tracking-url-empty",
      "severity": "error",
      "category": "VMAP",
      "description": "VMAP `<Tracking>` element does not contain a tracking URI",
      "specRef": "IAB VMAP 1.0.1 §2.3.3",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-tracking-url-empty/"
    },
    {
      "id": "VMAP-1.0-repeatafter-conflict",
      "severity": "warning",
      "category": "VMAP",
      "description": "repeatAfter has no effect when timeOffset is `\"start\"` or `\"end\"` — those positions occur once per playback",
      "specRef": "IAB VMAP 1.0.1 §2.3.1",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-repeatafter-conflict/"
    },
    {
      "id": "VMAP-1.0-display-break-no-companions",
      "severity": "info",
      "category": "VMAP",
      "description": "breakType includes \"display\" but the inline VAST has no <CompanionAds> to fill the break",
      "specRef": "IAB VMAP 1.0.1 §2.3.1",
      "docs": "https://vastlint.org/docs/rules/VMAP-1.0-display-break-no-companions/"
    },
    {
      "id": "DAAST-1.0-root-version",
      "severity": "error",
      "category": "DAAST",
      "description": "Root `<DAAST>` element must have a version attribute",
      "specRef": "IAB DAAST 1.0 §3.1.1",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-root-version/"
    },
    {
      "id": "DAAST-1.0-root-version-value",
      "severity": "warning",
      "category": "DAAST",
      "description": "`<DAAST>` version attribute must be a recognised version string (`1.0` or `1.1`)",
      "specRef": "IAB DAAST 1.0 §3.1.1",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-root-version-value/"
    },
    {
      "id": "DAAST-1.0-root-has-ad-or-error",
      "severity": "error",
      "category": "DAAST",
      "description": "`<DAAST>` must contain at least one `<Ad>` or `<Error>`",
      "specRef": "IAB DAAST 1.0 §3.1.2",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-root-has-ad-or-error/"
    },
    {
      "id": "DAAST-1.0-ad-has-inline-or-wrapper",
      "severity": "error",
      "category": "DAAST",
      "description": "Each DAAST `<Ad>` must contain exactly one `<InLine>` or `<Wrapper>`",
      "specRef": "IAB DAAST 1.0 §3.1.2",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-ad-has-inline-or-wrapper/"
    },
    {
      "id": "DAAST-1.0-inline-adtitle",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<InLine>` must contain `<AdTitle>`",
      "specRef": "IAB DAAST 1.0 §3.1.4.1",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-inline-adtitle/"
    },
    {
      "id": "DAAST-1.0-inline-impression",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<InLine>` must contain at least one `<Impression>`",
      "specRef": "IAB DAAST 1.0 §3.1.4.1",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-inline-impression/"
    },
    {
      "id": "DAAST-1.0-inline-category",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<InLine>` must contain `<Category>` (required in DAAST, unlike VAST)",
      "specRef": "IAB DAAST 1.0 §3.1.4.1",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-inline-category/"
    },
    {
      "id": "DAAST-1.0-inline-creatives",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<InLine>` must contain `<Creatives>` with at least one `<Creative>`",
      "specRef": "IAB DAAST 1.0 §3.1.4.1",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-inline-creatives/"
    },
    {
      "id": "DAAST-1.0-wrapper-daastadtaguri",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<Wrapper>` must contain `<DAASTAdTagURI>`",
      "specRef": "IAB DAAST 1.0 §3.3.1.1",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-wrapper-daastadtaguri/"
    },
    {
      "id": "DAAST-1.0-wrapper-vast-adtaguri",
      "severity": "warning",
      "category": "DAAST",
      "description": "`<VASTAdTagURI>` is a VAST element — DAAST wrappers redirect via `<DAASTAdTagURI>`",
      "specRef": "IAB DAAST 1.0 §3.3.1.1",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-wrapper-vast-adtaguri/"
    },
    {
      "id": "DAAST-1.0-wrapper-impression",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<Wrapper>` must contain at least one `<Impression>`",
      "specRef": "IAB DAAST 1.0 §3.3.1.1",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-wrapper-impression/"
    },
    {
      "id": "DAAST-1.0-videoclicks-element",
      "severity": "warning",
      "category": "DAAST",
      "description": "`<VideoClicks>` is a VAST element — DAAST uses `<AdInteractions>`",
      "specRef": "IAB DAAST 1.0 §3.2.5",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-videoclicks-element/"
    },
    {
      "id": "DAAST-1.0-audiointeractions-renamed",
      "severity": "warning",
      "category": "DAAST",
      "description": "`<AudioInteractions>` was renamed `<AdInteractions>` in the final DAAST release",
      "specRef": "IAB DAAST 1.0 §3.2.5",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-audiointeractions-renamed/"
    },
    {
      "id": "DAAST-1.0-linear-duration",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<Linear>` must contain `<Duration>`",
      "specRef": "IAB DAAST 1.0 §3.2.1",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-linear-duration/"
    },
    {
      "id": "DAAST-1.0-duration-format",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<Duration>` value does not match HH:MM:SS[.mmm] format",
      "specRef": "IAB DAAST 1.0 §3.2.1",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-duration-format/"
    },
    {
      "id": "DAAST-1.0-linear-mediafiles",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<Linear>` must contain `<MediaFiles>` with at least one `<MediaFile>`",
      "specRef": "IAB DAAST 1.0 §3.2.2",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-linear-mediafiles/"
    },
    {
      "id": "DAAST-1.0-mediafile-delivery",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<MediaFile>` must have a delivery attribute",
      "specRef": "IAB DAAST 1.0 §3.2.2",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-mediafile-delivery/"
    },
    {
      "id": "DAAST-1.0-mediafile-delivery-enum",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<MediaFile>` delivery must be `\"progressive\"` or `\"streaming\"`",
      "specRef": "IAB DAAST 1.0 §3.2.2",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-mediafile-delivery-enum/"
    },
    {
      "id": "DAAST-1.0-mediafile-type",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<MediaFile>` must have a type attribute",
      "specRef": "IAB DAAST 1.0 §3.2.2",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-mediafile-type/"
    },
    {
      "id": "DAAST-1.0-mediafile-audio-type",
      "severity": "warning",
      "category": "DAAST",
      "description": "DAAST `<MediaFile>` type is a video MIME type — DAAST creatives are audio",
      "specRef": "IAB DAAST 1.0 §3.2.2",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-mediafile-audio-type/"
    },
    {
      "id": "DAAST-1.0-mediafile-id",
      "severity": "warning",
      "category": "DAAST",
      "description": "DAAST `<MediaFile>` should have an `id` attribute (required by the DAAST XSD)",
      "specRef": "IAB DAAST 1.0 XSD",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-mediafile-id/"
    },
    {
      "id": "DAAST-1.0-mediafile-url-empty",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<MediaFile>` does not contain a media URI",
      "specRef": "IAB DAAST 1.0 §3.2.2",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-mediafile-url-empty/"
    },
    {
      "id": "DAAST-1.0-tracking-event-value",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<Tracking>` event is not in the DAAST audio event set",
      "specRef": "IAB DAAST 1.0 XSD",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-tracking-event-value/"
    },
    {
      "id": "DAAST-1.0-progress-offset",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<Tracking event=\"progress\">` requires a valid offset attribute",
      "specRef": "IAB DAAST 1.0 §3.2.4",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-progress-offset/"
    },
    {
      "id": "DAAST-1.0-pricing-model",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<Pricing>` is missing the required model attribute",
      "specRef": "IAB DAAST 1.0 §3.1.4.1",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-pricing-model/"
    },
    {
      "id": "DAAST-1.0-pricing-model-value",
      "severity": "warning",
      "category": "DAAST",
      "description": "DAAST `<Pricing>` model must be one of `cpm`, `cpc`, `cpe`, `cpv`, `cpo`",
      "specRef": "IAB DAAST 1.0 XSD",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-pricing-model-value/"
    },
    {
      "id": "DAAST-1.0-pricing-currency",
      "severity": "error",
      "category": "DAAST",
      "description": "DAAST `<Pricing>` is missing the required currency attribute",
      "specRef": "IAB DAAST 1.0 §3.1.4.1",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-pricing-currency/"
    },
    {
      "id": "DAAST-1.0-error-url-empty",
      "severity": "warning",
      "category": "DAAST",
      "description": "DAAST `<Error>` element is present but contains no URI",
      "specRef": "IAB DAAST 1.0 §3.1.3",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-error-url-empty/"
    },
    {
      "id": "DAAST-1.0-error-tracking-macro",
      "severity": "info",
      "category": "DAAST",
      "description": "DAAST `<Error>` URI does not include the `[ERRORCODE]` macro — error diagnostics will be incomplete",
      "specRef": "IAB DAAST 1.0 §3.1.3",
      "docs": "https://vastlint.org/docs/rules/DAAST-1.0-error-tracking-macro/"
    }
  ]
}
