Skip to content

The test array

When you retrieve scan results, the response includes a tests array. Each entry in that array corresponds to one of the tests documented below, with a name, value, result, and attributes.

This section lists every display test that Advalidation can run against a creative. Each test checks one aspect of the creative and returns pass, fail, or warn.

Checks if the creative’s pixel dimensions match one of the accepted ad unit sizes defined in the ad specification.

ResultCondition
passDimensions match an accepted size
failDimensions do not match any accepted size
Example response
{
  "name": "Test_Display_AdDimensions",
  "value": "300x250",
  "valueFormatted": "300x250",
  "valuePhrase": "300x250 matches one of the accepted dimensions.",
  "result": "pass",
  "attributes": [
    { "name": "Display_Width", "description": "Pixel width of creative", "value": 300 },
    { "name": "Display_Height", "description": "Pixel height of creative", "value": 250 }
  ]
}

Detects ad verification vendor tags (DoubleVerify, IAS, MOAT, etc.) and checks whether they are set to monitor or block delivery. Blocking tags can cause impression discrepancies between your ad server and the advertiser’s reporting.

ResultCondition
passOnly monitoring tags detected, or tags match the ad spec policy
Example response
{
  "name": "Test_Display_AdVerificationTags",
  "value": "monitoring",
  "valueFormatted": "Monitoring",
  "valuePhrase": "cdn.doubleverify.com/dvtp_src.js detected in third party tag. This allows the ad verification vendor to monitor tag performance. Only monitoring tags allowed.",
  "result": "pass",
  "attributes": [
    { "name": "Display_AdVerificationType", "description": "Display ad verification type (blocking/monitoring)", "value": "monitoring" },
    { "name": "Display_AdVerificationVendor", "description": "Display ad verification vendor", "value": "doubleverify" }
  ]
}

Checks if the ad’s animation stops within the allowed duration. Long-running animations distract visitors and violate most publisher specifications.

ResultCondition
passAnimation stops within the threshold (e.g., 15 seconds)
failAnimation runs longer than allowed
Example response
{
  "name": "Test_Display_AnimationLength",
  "value": 0,
  "valueFormatted": "0 seconds",
  "valuePhrase": "The ad animates for 0 seconds. Animation must stop within 15 seconds.",
  "result": "pass",
  "attributes": [
    { "name": "Display_AnimationDuration", "description": "Animation duration in milliseconds", "value": 0 }
  ]
}

Checks if the creative plays audio before user interaction. Most publisher specs prohibit auto-playing audio.

ResultCondition
passNo audio detected before hover
failAudio plays automatically
Example response
{
  "name": "Test_Display_Audio",
  "value": false,
  "valueFormatted": "Not detected",
  "valuePhrase": "No audio before hover detected. Audio is not allowed before hover.",
  "result": "pass",
  "attributes": [
    { "name": "Display_AudioBeforeHover", "description": "Audio before hover", "value": false },
    { "name": "Display_AudioAfterHover", "description": "Audio after hover", "value": false }
  ]
}

Checks if the creative has a distinct border that visually separates it from page content. This is a common publisher requirement to prevent ads from blending into editorial content.

ResultCondition
passDistinct border detected
warnNo distinct border detected
Example response
{
  "name": "Test_Display_Border",
  "value": true,
  "valueFormatted": "Indistinct border",
  "valuePhrase": "Distinct border not detected. Border required.",
  "result": "warn",
  "attributes": [
    { "name": "Display_LowContrastBorder", "description": "Low contrast border", "value": true }
  ]
}

Counts the number of redirects between clicking the ad and reaching the landing page. Excessive redirects cause visitors to drop off before arriving.

ResultCondition
passRedirect count within limit (e.g., 6 max)
failToo many redirects
Example response
{
  "name": "Test_Display_ClickRedirects",
  "value": 1,
  "valueFormatted": "1 redirect",
  "valuePhrase": "Detected 1 redirect. No more than 6 redirects allowed.",
  "result": "pass",
  "attributes": [
    { "name": "Display_ClickRedirects", "description": "Redirects on click", "value": 1 }
  ]
}

Validates the creative’s source code against custom rules defined in the ad specification. These rules can check for prohibited code patterns, required scripts, or other code-level requirements.

ResultCondition
passCode passes all custom validation rules
failCode violates one or more rules
Example response
{
  "name": "Test_Display_CodeRules",
  "value": 1,
  "valueFormatted": "1 issue",
  "valuePhrase": "This ad fails custom code validation rules set up by the ad spec.",
  "result": "fail",
  "attributes": []
}

Checks the creative’s external connections against an approved vendor list defined in the ad specification. Connections to unapproved domains are flagged.

ResultCondition
passAll connections match approved vendors
failOne or more connections violate the rules
Example response
{
  "name": "Test_Display_Connections",
  "value": 4,
  "valueFormatted": "4 violations",
  "valuePhrase": "This ad violates the ad specification rules for external connections.",
  "result": "fail",
  "attributes": []
}

Counts the number of cookies set by the creative and checks against the allowed limit.

ResultCondition
passCookie count within limit
failToo many cookies
Example response
{
  "name": "Test_Display_Cookies",
  "value": 0,
  "valueFormatted": 0,
  "valuePhrase": "Detected no cookies. The maximum number of cookies allowed is 0.",
  "result": "pass",
  "attributes": [
    { "name": "Display_TotalCookies", "description": "Number of cookies", "value": 0 }
  ]
}

Measures the creative’s CPU usage as average and peak percentages. High CPU usage drains battery life and degrades the browsing experience, especially on mobile devices.

ResultCondition
passBoth average and peak within limits
failAverage or peak exceeds the threshold
Example response
{
  "name": "Test_Display_Cpu",
  "value": 1,
  "valueFormatted": "1% average, 4% peak",
  "valuePhrase": "CPU usage within allowed limits. CPU usage during testing was: 1% average, 4% peak. The maximum CPU usage allowed is 10% average, 20% peak.",
  "result": "pass",
  "attributes": [
    { "name": "Display_CPUAverage", "description": "CPU average", "value": 1 },
    { "name": "Display_CPUPeak", "description": "CPU peak", "value": 4 }
  ]
}

Counts the total number of HTTP requests the creative makes and checks against the allowed limit. Fewer requests means faster load times and better viewability.

ResultCondition
passRequest count within limit
failToo many requests
Example response
{
  "name": "Test_Display_ExternalRequests",
  "value": 5,
  "valueFormatted": 5,
  "valuePhrase": "This ad is making 5 requests. The maximum allowed is 15 requests.",
  "result": "pass",
  "attributes": [
    { "name": "Display_FileRequestsTotal", "description": "Total requests (post exclusions)", "value": 4 },
    { "name": "Display_FileRequestsInitial", "description": "Initial requests (post exclusions)", "value": 4 }
  ]
}

Checks the total hosted file size of the creative’s assets against the allowed limit. Oversized creatives hurt viewability and user experience.

ResultCondition
passFile size within limit
failFile size exceeds limit
Example response
{
  "name": "Test_Display_Filesize",
  "value": "141977",
  "valueFormatted": "139 kb",
  "valuePhrase": "The hosted filesize of this ad is 139 kb. The maximum hosted filesize allowed is 100 kb.",
  "result": "fail",
  "attributes": [
    { "name": "Display_HTML5InflatedSize", "description": "Hosted filesize (sum)", "value": 141977 }
  ]
}

Checks if the creative uses Flash local shared objects (Flash cookies). These persist after clearing browser cookies and are generally prohibited.

ResultCondition
passNo Flash cookies detected
failFlash cookies detected
Example response
{
  "name": "Test_Display_FlashLso",
  "value": false,
  "valueFormatted": "Not detected",
  "valuePhrase": "Detected no flash cookies.",
  "result": "pass",
  "attributes": []
}

Checks if the creative’s source code contains the GDPR consent macro, which is required for GDPR-compliant ad delivery in applicable regions.

ResultCondition
passGDPR consent macro detected
failMacro not found
Example response
{
  "name": "Test_Display_GdprConsent",
  "value": "Detected",
  "valueFormatted": "Detected",
  "valuePhrase": "This creative's code contains the GDPR consent macro.",
  "result": "pass",
  "attributes": []
}

Checks if the creative would trigger Chrome’s heavy ad intervention, which removes ads that consume excessive CPU or network resources. Chrome considers an ad “heavy” if it uses more than 4 MB of network, more than 15 seconds of CPU in any 30-second window, or more than 60 seconds of CPU total.

ResultCondition
passResource usage within Chrome’s limits
failOne or more thresholds exceeded
Example response
{
  "name": "Test_Display_HeavyAdInterventions",
  "value": false,
  "valueFormatted": "Not detected",
  "valuePhrase": "Chrome heavy ad interventions not detected. Ads triggering heavy ad intervention are not accepted.",
  "result": "pass",
  "attributes": []
}

Verifies that the ad’s landing page URL resolves to a working page. Catches broken URLs, malformed click macros, and redirect failures before launch.

ResultCondition
passLanding page returns HTTP 200
failLanding page returns an error or does not resolve
Example response
{
  "name": "Test_Display_LandingPage",
  "value": true,
  "valueFormatted": "Working",
  "valuePhrase": "The landing page works. Response code must be 200.",
  "result": "pass",
  "attributes": [
    { "name": "Display_LandingPageResponseCode", "description": "Landing page HTTP code", "value": 200 }
  ]
}

Checks if the creative uses browser local storage. Local storage persists data that cannot be cleared through standard cookie controls, making it a privacy concern.

ResultCondition
passNo local storage usage detected
failLocal storage objects detected
Example response
{
  "name": "Test_Display_LocalStorage",
  "value": false,
  "valueFormatted": "Not detected",
  "valuePhrase": "Detected no local storage objects. Local storage objects are not allowed.",
  "result": "pass",
  "attributes": []
}

Verifies that click tracking works via the click macro. This ensures the publisher can count clicks and attribute conversions.

ResultCondition
passClick tracking via macro is working
failClick tracking is not functioning
Example response
{
  "name": "Test_Display_MouseClick",
  "value": true,
  "valueFormatted": "Trackable",
  "valuePhrase": "Click tracking works as expected. Click tracking via macro required.",
  "result": "pass",
  "attributes": [
    { "name": "Display_ClickTracking", "description": "Click is trackable", "value": true }
  ]
}

Checks that all network requests made by the creative use HTTPS. Non-HTTPS requests can trigger mixed content warnings and be blocked by browsers.

ResultCondition
passAll requests use HTTPS
failOne or more non-HTTPS requests detected
Example response
{
  "name": "Test_Display_Ssl",
  "value": 0,
  "valueFormatted": "No issues",
  "valuePhrase": "This ad is not making any non HTTPS requests. Only HTTPS allowed.",
  "result": "pass",
  "attributes": [
    { "name": "Display_NonHTTPSRequests", "description": "Non-HTTPS assets", "value": 0 }
  ]
}

Measures the total file size of assets loaded during the initial load phase (before the browser’s load event). Keeping initial load lightweight ensures the ad doesn’t compete with page content for bandwidth.

ResultCondition
passInitial load size within limit
failInitial load size exceeds limit
Example response
{
  "name": "Test_Display_TagLoadInitial",
  "value": "35091",
  "valueFormatted": "34 kb",
  "valuePhrase": "This ad is loading 34 kb within the initial load phase. The maximum allowed is 150 kb.",
  "result": "pass",
  "attributes": [
    { "name": "Display_RemoteLoadInitial", "description": "Initial load bytes (post exclusions)", "value": 35091 }
  ]
}

Measures the total file size of assets loaded during the subload phase (after the browser’s load event). Subload has a higher budget than initial load since the page has already rendered.

ResultCondition
passSubload size within limit
failSubload size exceeds limit
Example response
{
  "name": "Test_Display_TagLoadSubload",
  "value": "906",
  "valueFormatted": "1 kb",
  "valuePhrase": "This ad is loading 1 kb within the subload phase. The maximum allowed is 300 kb.",
  "result": "pass",
  "attributes": [
    { "name": "Display_RemoteLoadSubload", "description": "Subload bytes (post exclusions)", "value": 906 }
  ]
}

Measures how quickly the creative renders visible content. Slow-loading ads get scrolled past before they are seen, directly impacting viewability metrics and campaign performance.

ResultCondition
passRenders within the threshold (e.g., 0.8 seconds)
failTakes longer than the threshold
Example response
{
  "name": "Test_Display_VisualStart",
  "value": "664",
  "valueFormatted": "0.66 seconds",
  "valuePhrase": "The median visual start time was 0.66 seconds. Ads must render something visible within 0.8 seconds.",
  "result": "pass",
  "attributes": [
    { "name": "Display_VisualStartTime", "description": "Time to visual start in milliseconds", "value": 664 }
  ]
}

This section lists every video test that Advalidation can run against a creative. Each test checks one aspect of the video or VAST tag and returns pass or fail.

Some video tests come in pairs — the ad specification determines which variant is active. You will only see one from each pair in a scan response.

EitherOrSetting
Test_Video_ResolutionTest_Video_AspectRatioDimensions: exact resolution vs. aspect ratio
Test_Video_TotalBitrateTest_Video_AudioBitrate + Test_Video_VideoBitrateBitrate: total container vs. separate audio/video tracks

These tests check the properties of video media files. They appear on hosted video scans and VAST child media file scans.

Checks if the video’s aspect ratio matches one of the accepted ratios defined in the ad specification.

ResultCondition
passAspect ratio matches an accepted value
failAspect ratio does not match any accepted value
Example response
{
  "name": "Test_Video_AspectRatio",
  "value": "16:9",
  "valueFormatted": "16:9 (640x360)",
  "valuePhrase": "The aspect ratio is 16:9. The resolution is 640x360. Supported aspect ratio is: 4:3.",
  "result": "fail",
  "attributes": [
    {
      "name": "Video_AspectRatioString",
      "description": "Aspect ratio",
      "value": "16:9"
    }
  ]
}

Checks if the average audio loudness is within the allowed range. Uses the R128/LKFS loudness standard.

ResultCondition
passAverage loudness within the specified range
failAverage loudness outside the allowed range
Example response
{
  "name": "Test_Video_AudioAverage",
  "value": -23,
  "valueFormatted": "-23.00 LUFS",
  "valuePhrase": "Average audio volume is within allowed limits: -23.00 LUFS. Audio average must be within -23 +/- 1 LUFS.",
  "result": "pass",
  "attributes": [
    {
      "name": "Audio_VolumeAverage",
      "description": "Audio R128 volume average",
      "value": -23
    }
  ]
}

Checks if the audio track bitrate is within the allowed range.

ResultCondition
passAudio bitrate within the specified range
failAudio bitrate outside the allowed range
Example response
{
  "name": "Test_Video_AudioBitrate",
  "value": 128,
  "valueFormatted": "128 kbps",
  "valuePhrase": "The bitrate of the audio track is 128 kbps. The audio bitrate must be between 192 kbps and 192 kbps.",
  "result": "fail",
  "attributes": [
    {
      "name": "Audio_BitRate",
      "description": "Audio track bit rate",
      "value": 128
    }
  ]
}

Checks the number of audio channels in the video file.

ResultCondition
passChannel count matches an accepted value
failChannel count does not match any accepted value
Example response
{
  "name": "Test_Video_AudioChannels",
  "value": 2,
  "valueFormatted": "2 channels",
  "valuePhrase": "The number of audio channels are 2. Number of audio channels supported are: 0.",
  "result": "fail",
  "attributes": [
    {
      "name": "Audio_Channels",
      "description": "Audio channels",
      "value": true
    }
  ]
}

Checks if the audio track codec matches one of the accepted codecs.

ResultCondition
passAudio codec matches an accepted value
failAudio codec does not match any accepted value
Example response
{
  "name": "Test_Video_AudioCodec",
  "value": "AAC",
  "valueFormatted": "AAC",
  "valuePhrase": "The audio codec is AAC.",
  "result": "pass",
  "attributes": [
    {
      "name": "Audio_Codec",
      "description": "Audio track codec",
      "value": "AAC"
    }
  ]
}

Checks if the true peak audio level is within the allowed maximum.

ResultCondition
passPeak level within the allowed maximum
failPeak level exceeds the allowed maximum
Example response
{
  "name": "Test_Video_AudioPeak",
  "value": -11.8,
  "valueFormatted": "-11.80 dBTP",
  "valuePhrase": "The peak audio volume is -11.80 dBTP. The allowed true-peak maximum is -1 dBTP.",
  "result": "pass",
  "attributes": [
    {
      "name": "Audio_VolumePeak",
      "description": "Audio volume peak",
      "value": -11.8
    }
  ]
}

Checks if the audio sample rate matches one of the accepted values.

ResultCondition
passSample rate matches an accepted value
failSample rate does not match any accepted value
Example response
{
  "name": "Test_Video_AudioSampleRate",
  "value": 48,
  "valueFormatted": "48 kHz",
  "valuePhrase": "The audio sample rate is 48 kHz.",
  "result": "pass",
  "attributes": [
    {
      "name": "Audio_SamplingRate",
      "description": "Audio sampling rate",
      "value": 48
    }
  ]
}

Detects letterboxing (black bars top/bottom) or pillarboxing (black bars left/right) in the video. Boxing indicates the video content doesn’t fill the declared resolution.

ResultCondition
passNo boxing detected
failLetterboxing or pillarboxing detected
Example response
{
  "name": "Test_Video_Boxing",
  "value": 0,
  "valueFormatted": "None detected",
  "valuePhrase": "None detected. Letterboxing not allowed.",
  "result": "pass",
  "attributes": []
}

Checks if the chroma subsampling format matches one of the accepted values.

ResultCondition
passChroma subsampling matches an accepted value
failChroma subsampling does not match any accepted value
Example response
{
  "name": "Test_Video_ChromaSubsampling",
  "value": "4:2:0",
  "valueFormatted": "4:2:0",
  "valuePhrase": "Chroma subsampling is 4:2:0. Supported options are: 4:4:4, 4:2:2, 4:2:0 and 4:1:1.",
  "result": "pass",
  "attributes": [
    {
      "name": "Video_ChromaSubsampling",
      "description": "Video chroma subsampling",
      "value": "4:2:0"
    }
  ]
}

Checks if the video codec matches one of the accepted codecs.

ResultCondition
passVideo codec matches an accepted value
failVideo codec does not match any accepted value
Example response
{
  "name": "Test_Video_Codec",
  "value": "H264",
  "valueFormatted": "H264",
  "valuePhrase": "The video codec is H264.",
  "result": "pass",
  "attributes": [
    {
      "name": "Video_Codec",
      "description": "Video codec",
      "value": "H264"
    }
  ]
}

Checks if the video container format matches one of the accepted formats.

ResultCondition
passContainer format matches an accepted value
failContainer format does not match any accepted value
Example response
{
  "name": "Test_Video_ContainerFormat",
  "value": "MP4",
  "valueFormatted": "MP4",
  "valuePhrase": "The container format is MP4.",
  "result": "pass",
  "attributes": [
    {
      "name": "Video_ContainerFormat",
      "description": "Video container format",
      "value": "MP4"
    }
  ]
}

Detects repeated duplicate frames in the video, which can indicate encoding issues or artificially inflated duration.

ResultCondition
passNo repeated duplicate frames detected
failRepeated duplicate frames detected
Example response
{
  "name": "Test_Video_DuplicateFrames",
  "value": 0,
  "valueFormatted": "Not detected",
  "valuePhrase": "Repeated duplicate frames not detected. Repeated duplicated frames not allowed.",
  "result": "pass",
  "attributes": []
}

Checks if the video duration is within the allowed range. Reports both video track and audio track durations.

ResultCondition
passDuration within the allowed range
failDuration outside the allowed range
Example response
{
  "name": "Test_Video_Duration",
  "value": "30.03",
  "valueFormatted": "30 seconds",
  "valuePhrase": "Video track duration is 30 seconds (30.03). Audio track duration is 30 seconds (30.03).",
  "result": "pass",
  "attributes": [
    {
      "name": "Video_PlayTime",
      "description": "Duration of video in milliseconds",
      "value": 30.03
    }
  ]
}

Checks if the video file size is within the allowed range.

ResultCondition
passFile size within the allowed range
failFile size outside the allowed range
Example response
{
  "name": "Test_Video_Filesize",
  "value": 1258496,
  "valueFormatted": "1229 kb",
  "valuePhrase": "The size of this video file is 1229 kb. The filesize must be above 500 kB.",
  "result": "pass",
  "attributes": [
    {
      "name": "File_Length",
      "description": "Video file size",
      "value": 11.03
    }
  ]
}

Checks if the video frame rate matches one of the accepted values.

ResultCondition
passFrame rate matches an accepted value
failFrame rate does not match any accepted value
Example response
{
  "name": "Test_Video_Fps",
  "value": 23.976,
  "valueFormatted": "23.976 FPS",
  "valuePhrase": "The framerate is 23.976 FPS.",
  "result": "pass",
  "attributes": [
    {
      "name": "Video_FrameRate",
      "description": "Frame rate",
      "value": 23.976
    }
  ]
}

Detects interlaced frames in the video by analyzing the interlace frame ratio. Interlaced content causes visual artifacts on progressive displays.

ResultCondition
passInterlace ratio within allowed limits
failInterlace ratio exceeds the threshold
Example response
{
  "name": "Test_Video_Interlace",
  "value": 29,
  "valueFormatted": "29%",
  "valuePhrase": "The interlace frame ratio is 29%. Video must not be interlaced.",
  "result": "fail",
  "attributes": []
}

Checks if the video resolution matches one of the accepted resolutions defined in the ad specification.

ResultCondition
passResolution matches an accepted value
failResolution does not match any accepted value
Example response
{
  "name": "Test_Video_Resolution",
  "value": "640x360",
  "valueFormatted": "640x360 (16:9)",
  "valuePhrase": "The resolution is 640x360. The aspect ratio is 16:9. Supported resolutions are: 640x480, 800x600 and 1920x1080.",
  "result": "fail",
  "attributes": [
    {
      "name": "Video_Height",
      "description": "Video pixel height",
      "value": 360
    },
    {
      "name": "Video_Width",
      "description": "Video pixel width",
      "value": 640
    }
  ]
}

Checks if the video scan type (progressive or interlaced) matches one of the accepted values.

ResultCondition
passScan type matches an accepted value
failScan type does not match any accepted value
Example response
{
  "name": "Test_Video_ScanType",
  "value": "progressive",
  "valueFormatted": "progressive",
  "valuePhrase": "Scan type of the video is progressive. Supported scan types are: interlaced and progressive.",
  "result": "pass",
  "attributes": [
    {
      "name": "Video_ScanType",
      "description": "Scan type (progressive/interlaced)",
      "value": "progressive"
    }
  ]
}

Checks if the video contains timecode information and whether it matches accepted formats.

ResultCondition
passTimecode matches an accepted format, or any format is accepted
failTimecode does not match any accepted format
Example response
{
  "name": "Test_Video_Timecode",
  "value": null,
  "valueFormatted": "Missing",
  "valuePhrase": "This video contains no timecode information. Any timecode combination is supported..",
  "result": "pass",
  "attributes": []
}

Checks if the total container bitrate (audio + video combined) is within the allowed range.

ResultCondition
passTotal bitrate within the allowed range
failTotal bitrate outside the allowed range
Example response
{
  "name": "Test_Video_TotalBitrate",
  "value": 913,
  "valueFormatted": "913 kbps",
  "valuePhrase": "The total bitrate is 913 kbps. The total bitrate must be between 100 kbps and 2000 kbps.",
  "result": "pass",
  "attributes": [
    {
      "name": "General_BitRate",
      "description": "Total (container) bit rate",
      "value": 913
    }
  ]
}

Compares properties declared in the VAST XML (such as codec, dimensions, and bitrate) against the actual properties of the downloaded video file. Discrepancies between declared and actual values are flagged.

ResultCondition
passNo discrepancies between declared and actual properties
failOne or more discrepancies detected
Example response
{
  "name": "Test_Video_VastPropertyDiscrepancy",
  "value": 0,
  "valueFormatted": "0 discrepancies",
  "valuePhrase": "Detected 0 discrepancies between the XML declaration and the properties of the actual video file. Must align.",
  "result": "pass",
  "attributes": []
}

Checks if the video track bitrate is within the allowed range.

ResultCondition
passVideo bitrate within the allowed range
failVideo bitrate outside the allowed range
Example response
{
  "name": "Test_Video_VideoBitrate",
  "value": 800,
  "valueFormatted": "800 kbps",
  "valuePhrase": "The bitrate of the video track is 800 kbps. The video bitrate must be between 1000 kbps and 1500 kbps.",
  "result": "fail",
  "attributes": [
    {
      "name": "Video_BitRate",
      "description": "Video track bit rate",
      "value": 800
    }
  ]
}

These tests validate the VAST XML structure and tag behavior. They appear on VAST parent scans and variation scans.

Detects ad verification vendor tags in the VAST response and checks whether they comply with the ad specification policy.

ResultCondition
passTags comply with the policy, or no tags detected when none are allowed
failTags violate the ad specification policy
Example response
{
  "name": "Test_Video_AdVerificationTags",
  "value": null,
  "valueFormatted": "None",
  "valuePhrase": " Only monitoring tags allowed.",
  "result": "pass",
  "attributes": []
}

Checks for VPAID or other API frameworks in the VAST response and validates against the ad specification’s framework policy.

ResultCondition
passDetected frameworks match the policy, or none detected when none are required
failFramework requirements not met
Example response
{
  "name": "Test_Video_VastApiProperties",
  "value": 0,
  "valueFormatted": "VPAID not detected",
  "valuePhrase": "Detected no frameworks. Supported framework is: VPAID javascript.",
  "result": "pass",
  "attributes": []
}

Validates the VAST tag’s external connections against an approved vendor list defined in the ad specification. All URLs referenced in the VAST XML are checked.

ResultCondition
passAll connections match approved vendors
failOne or more connections violate the rules
Example response
{
  "name": "Test_Video_VastConnectionRules",
  "value": 6,
  "valueFormatted": "6 violations",
  "valuePhrase": "This ad violates the ad specification rules for external connections.",
  "result": "fail",
  "attributes": []
}

Counts the number of <Creative> elements in the VAST XML. Multi-creative VAST responses can cause unexpected ad behavior.

ResultCondition
passCreative count within the allowed limit
failToo many creatives in the VAST response
Example response
{
  "name": "Test_Video_VastCreativeCount",
  "value": 1,
  "valueFormatted": 1,
  "valuePhrase": "The VAST XML contains 1 creative. Multi creative VAST not allowed.",
  "result": "pass",
  "attributes": []
}

Checks whether the duration declared in the VAST XML matches the actual duration of the media files. Discrepancies can cause player issues.

ResultCondition
passNo duration discrepancies detected
failDuration discrepancies found between XML and media files
Example response
{
  "name": "Test_Video_VastDurationDiscrepancy",
  "value": 1,
  "valueFormatted": "None",
  "valuePhrase": "No duration discrepancies detected. Must not vary.",
  "result": "pass",
  "attributes": []
}

Checks if the VAST XML contains any non-HTTPS URLs. Mixed content can be blocked by browsers and cause tracking failures.

ResultCondition
passAll URLs use HTTPS
failOne or more non-HTTPS URLs detected
Example response
{
  "name": "Test_Video_VastNonHttps",
  "value": 0,
  "valueFormatted": "No issues",
  "valuePhrase": "This ad is making requests to 0 non HTTPS URLs. Only HTTPS allowed.",
  "result": "pass",
  "attributes": []
}

Checks if the VAST XML contains all required media file definitions as specified in the ad specification. Media file definitions match on codec, dimensions, and bitrate.

ResultCondition
passAll required media file definitions matched
failOne or more required definitions not matched
Example response
{
  "name": "Test_Video_VastRequiredMediaFiles",
  "value": 1,
  "valueFormatted": "1 definition not matched",
  "valuePhrase": "1 media files definition not matched, all of the definitions required",
  "result": "fail",
  "attributes": []
}

Checks if the VAST tag includes skip functionality and whether it matches the ad specification’s skip policy.

ResultCondition
passSkip behavior matches the policy
failSkip behavior does not match the policy
Example response
{
  "name": "Test_Video_VastSkipDetection",
  "value": null,
  "valueFormatted": "Not skippable",
  "valuePhrase": "The VAST skippable property is: not skippable. Ad must not be skippable.",
  "result": "pass",
  "attributes": []
}

Validates the VAST XML against the VAST schema. Catches syntax errors, missing required elements, and structural issues.

ResultCondition
passVAST XML is valid
failVAST XML contains validation errors
Example response
{
  "name": "Test_Video_VastValidateXml",
  "value": 1,
  "valueFormatted": "Valid",
  "valuePhrase": "The XML of this VAST file is valid. The VAST XML syntax must be valid.",
  "result": "pass",
  "attributes": []
}

Detects whether a VAST URL returns different content on subsequent loads. Variations indicate the tag serves rotating or dynamic content.

ResultCondition
passVariation count within the allowed limit
failVariation count exceeds the allowed limit
Example response
{
  "name": "Test_Video_VastVariations",
  "value": 1,
  "valueFormatted": 1,
  "valuePhrase": "The VAST URL returns 1 variation. Varying VAST responses not allowed.",
  "result": "pass",
  "attributes": []
}

Checks if the VAST version matches one of the accepted versions.

ResultCondition
passVAST version matches an accepted value
failVAST version does not match any accepted value
Example response
{
  "name": "Test_Video_VastVersion",
  "value": "2.0",
  "valueFormatted": "VAST 2.0",
  "valuePhrase": "The VAST version is: 2.0.",
  "result": "fail",
  "attributes": [
    {
      "name": "Video_VASTVersion",
      "description": "VAST version",
      "value": "2.0"
    }
  ]
}