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
Clipitems 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:
-
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
-
Extract structured data: The crawler looks for JSON-LD, Microdata, or RDFa blocks on the page
-
Check for VideoObject schema: The crawler verifies if any schema block has:
@typeset toVideoObject- Required properties:
name,description,thumbnailUrl,uploadDate
-
Validate schema completeness: If VideoObject schema is found, the crawler checks for:
thumbnailUrlproperty (required by Google)uploadDateproperty (required by Google)durationin ISO 8601 formatcontentUrlorembedUrlfor the video
-
Trigger conditions: The issue is flagged when:
- Page has video embed but no VideoObject schema
- VideoObject schema exists but
thumbnailUrlis missing - VideoObject schema exists but
uploadDateis missing
How To Fix
-
Identify pages with video content: Look for pages with:
<video>tags- YouTube/Vimeo embeds (
<iframe>) - Video player elements
-
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" } -
Include required properties:
name: Video titledescription: Video descriptionthumbnailUrl: Video thumbnail image URL (required by Google)uploadDate: ISO 8601 format (required by Google)
-
Add recommended properties:
duration: In ISO 8601 format (PT9M45S= 9 min 45 sec)contentUrl: For self-hosted videosembedUrl: For YouTube/Vimeo embedshasPart: For key moments/chapters (Clip items)
-
For long videos with chapters, add
hasPartwith 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" } ] -
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
| Field | Type | Description |
|---|---|---|
| schemaType | SchemaType | The type of schema (e.g., Organization, Person) |
| schemaFormat | SchemaFormat | The format of the schema (JSON-LD, Microdata, RDFa) |
| schemaIdentifier | String? | Unique identifier for the schema |
| rawJson | Json? | The raw JSON-LD or structured data content |
| schemaErrors | Json? | Array of validation errors found in the schema |
| isValidSchema | Boolean? | Whether the schema is valid according to validation |
| missingFields | Json? | 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
Organizationschemas 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
Related Production Files
xeopix-crawling-v2/toggleGroups/structuredDataRichResults.jsxeopix-crawling-v2/issueCodes.jsxeopix-crawling-v2/utils/context.jsxeopix-crawling-v2/utils/issues.jsxeopix-crawling-v2/utils/schema.js
Coverage Summary
- Covers detection of duplicate schema types
- Covers empty HTML resilience
References
- Schema.org — VideoObject — Schema.org
- Google — Video Structured Data — Google Search Central