Skip to Content

No VideoObject schema on a page with video

What Is This Issue

Pages with embedded video content are missing VideoObject schema, preventing the video from appearing in Google Video Search, video carousels, and video rich results.

Without VideoObject schema:

  • Your videos won’t appear in Google Video Search
  • Videos won’t be eligible for video carousels in search results
  • Video rich results (thumbnail, duration, upload date) won’t display
  • Google must detect and understand the video from page context alone
  • Key moments/chapters won’t appear in search results

A proper VideoObject schema should include: @type (VideoObject), name, description, thumbnailUrl, uploadDate, and optionally duration, contentUrl, embedUrl, hasPart (for key moments).

Why Is This Important

VideoObject schema is important for video SEO and discoverability:

  • Google Video Search: Enables videos to appear in Google’s dedicated Video Search
  • Video carousels: Videos with proper schema can appear in video carousels in search results
  • Rich results: Enables video thumbnail, duration, and upload date to appear in search results
  • Key moments: Adding Clip items enables chapter markers in Google Video results
  • AI search readiness: AI engines use VideoObject schema to understand and cite video content
  • User engagement: Video rich results have higher click-through rates

Resolving this issue improves your SEO health score by ensuring videos are properly structured for maximum visibility in search.

How XeoPix Detects This

XeoPix follows these logical steps to detect missing VideoObject schema:

  1. Detect video content: The crawler identifies pages with:

    • <video> HTML tags
    • YouTube/Vimeo embeds (<iframe> with video URLs)
    • Video player elements or video-related metadata
  2. Extract structured data: The crawler looks for JSON-LD, Microdata, or RDFa blocks on the page

  3. Check for VideoObject schema: The crawler verifies if any schema block has:

    • @type set to VideoObject
    • Required properties: name, description, thumbnailUrl, uploadDate
  4. Validate schema completeness: If VideoObject schema is found, the crawler checks for:

    • thumbnailUrl property (required by Google)
    • uploadDate property (required by Google)
    • duration in ISO 8601 format
    • contentUrl or embedUrl for the video
  5. Trigger conditions: The issue is flagged when:

    • Page has video embed but no VideoObject schema
    • VideoObject schema exists but thumbnailUrl is missing
    • VideoObject schema exists but uploadDate is missing

How To Fix

  1. Identify pages with video content: Look for pages with:

    • <video> tags
    • YouTube/Vimeo embeds (<iframe>)
    • Video player elements
  2. Add VideoObject JSON-LD structured data to the page’s <head> or before </body>:

    { "@context": "https://schema.org", "@type": "VideoObject", "name": "How to Optimise Your Title Tags", "description": "A walkthrough of best practices for writing effective title tags for SEO.", "thumbnailUrl": "https://www.example.com/thumbnail.jpg", "uploadDate": "2024-03-01T08:00:00Z", "duration": "PT9M45S", "embedUrl": "https://www.youtube.com/embed/dQw4w9WgXcQ", "contentUrl": "https://www.example.com/videos/title-tags.mp4" }
  3. Include required properties:

    • name: Video title
    • description: Video description
    • thumbnailUrl: Video thumbnail image URL (required by Google)
    • uploadDate: ISO 8601 format (required by Google)
  4. Add recommended properties:

    • duration: In ISO 8601 format (PT9M45S = 9 min 45 sec)
    • contentUrl: For self-hosted videos
    • embedUrl: For YouTube/Vimeo embeds
    • hasPart: For key moments/chapters (Clip items)
  5. For long videos with chapters, add hasPart with Clip items:

    "hasPart": [ { "@type": "Clip", "name": "Introduction", "startOffset": 0, "endOffset": 60, "url": "https://example.com/video?t=0" }, { "@type": "Clip", "name": "Main Tutorial", "startOffset": 60, "endOffset": 540, "url": "https://example.com/video?t=60" } ]
  6. Validate with Google’s Rich Results Test

What We Store

Storage Level

Page Level — This issue is evaluated for each individual URL that contains structured data.


Database Table / Prisma Model

PageStructuredData


Stored Fields

FieldTypeDescription
schemaTypeSchemaTypeThe type of schema (e.g., Organization, Person)
schemaFormatSchemaFormatThe format of the schema (JSON-LD, Microdata, RDFa)
schemaIdentifierString?Unique identifier for the schema
rawJsonJson?The raw JSON-LD or structured data content
schemaErrorsJson?Array of validation errors found in the schema
isValidSchemaBoolean?Whether the schema is valid according to validation
missingFieldsJson?Array of required fields that are missing

Detection Dependencies

  • The following data sources are required to evaluate this issue:
  • HTML Document — The crawler parses the HTML to find structured data (JSON-LD, Microdata, RDFa)
  • Structured Data Validation — The extracted schema is validated against Schema.org definitions
  • Schema Parser — JSON-LD scripts, Microdata attributes, and RDFa markup are parsed

Examples

Example 1: Missing VideoObject Schema

Problematic state:

<!-- Page with video embed but no schema --> <html> <head> <title>SEO Tutorial Video</title> </head> <body> <h1>How to Optimise Title Tags</h1> <iframe src="https://www.youtube.com/embed/dQw4w9WgXcQ"></iframe> <p>Watch our tutorial on title tag optimization.</p> </body> </html>

Corrected state:

<!-- Page with proper VideoObject schema --> <html> <head> <title>SEO Tutorial Video</title> <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "VideoObject", "name": "How to Optimise Your Title Tags", "description": "A walkthrough of best practices for writing effective title tags for SEO.", "thumbnailUrl": "https://www.example.com/thumbnail.jpg", "uploadDate": "2024-03-01T08:00:00Z", "duration": "PT9M45S", "embedUrl": "https://www.youtube.com/embed/dQw4w9WgXcQ" } </script> </head> <body> <h1>How to Optimise Title Tags</h1> <iframe src="https://www.youtube.com/embed/dQw4w9WgXcQ"></iframe> <p>Watch our tutorial on title tag optimization.</p> </body> </html>

Example 2: Incomplete VideoObject Schema

Problematic state:

{ "@context": "https://schema.org", "@type": "VideoObject", "name": "SEO Tutorial" }

Missing required properties: description, thumbnailUrl, uploadDate

Corrected state:

{ "@context": "https://schema.org", "@type": "VideoObject", "name": "How to Optimise Your Title Tags", "description": "A walkthrough of best practices for writing effective title tags for SEO.", "thumbnailUrl": "https://www.example.com/thumbnail.jpg", "uploadDate": "2024-03-01T08:00:00Z", "duration": "PT9M45S" }

Example 3: Video with Chapters/Key Moments

Corrected state with hasPart:

{ "@context": "https://schema.org", "@type": "VideoObject", "name": "Complete SEO Audit Guide", "description": "Learn how to perform a complete SEO audit for your website.", "thumbnailUrl": "https://www.example.com/audit-guide-thumb.jpg", "uploadDate": "2024-03-15T10:00:00Z", "duration": "PT15M30S", "hasPart": [ { "@type": "Clip", "name": "Introduction", "startOffset": 0, "endOffset": 60, "url": "https://example.com/video?t=0" }, { "@type": "Clip", "name": "Technical SEO Check", "startOffset": 60, "endOffset": 300, "url": "https://example.com/video?t=60" }, { "@type": "Clip", "name": "Content Analysis", "startOffset": 300, "endOffset": 600, "url": "https://example.com/video?t=300" } ] }

Unit Test

Test File

xeopix-crawling-v2/__tests__/seo-audit-checks/structuredDataRichResults/issue-147-duplicate-schema-type.test.js

Purpose

Validates that the crawler correctly detects when the same schema type appears multiple times on a page.

Tested Function

runStructuredDataRichResults()

Issue Information

  • Issue Number: 147
  • Issue Code: duplicate_schema_type
  • Toggle Group: structuredDataRichResults

Test Scenarios

Positive Test Cases

None — the test only validates that duplicates are detected.

Negative Test Cases

  • Duplicate schema type detected: Two Organization schemas appear on the same page — issue is reported.

Boundary Cases

None.

Edge Cases

  • Empty HTML: <html></html> — no crash.

Expected Outcome

Pass

Issue should be reported when the same schema type appears multiple times on the page.

Fail

No false positive scenarios are tested.

Validation

  • Correct detection of duplicate schema types
  • Graceful handling of empty HTML
  • xeopix-crawling-v2/toggleGroups/structuredDataRichResults.js
  • xeopix-crawling-v2/issueCodes.js
  • xeopix-crawling-v2/utils/context.js
  • xeopix-crawling-v2/utils/issues.js
  • xeopix-crawling-v2/utils/schema.js

Coverage Summary

  • Covers detection of duplicate schema types
  • Covers empty HTML resilience

References

Last updated on