VideoObject Schema
Last reviewed:
Wrap in <script type="application/ld+json"> on the page where the video is actually watchable — marking up a page that only links to the video elsewhere does not produce valid video structured data. For YouTube-hosted video, YouTube’s own markup is injected automatically; adding VideoObject on a YouTube embed page may create a conflict.
Google Video Rich Result variation
name, description, thumbnailUrl, and uploadDate are required. Video-tab indexing additionally requires at least one of contentUrl or embedUrl.
{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "REQUIRED — video title, unique per video on your site",
"description": "REQUIRED — what the video covers, unique text per video, no HTML tags",
"thumbnailUrl": [
"REQUIRED — https://example.com/thumbnails/video-1x1.jpg",
"https://example.com/thumbnails/video-4x3.jpg",
"https://example.com/thumbnails/video-16x9.jpg"
],
"uploadDate": "REQUIRED — 2024-07-19T08:00:00+00:00",
"duration": "RECOMMENDED — PT4M30S",
"contentUrl": "REQUIRED (at least one of contentUrl or embedUrl) — https://example.com/videos/file.mp4",
"embedUrl": "REQUIRED (at least one of contentUrl or embedUrl) — https://example.com/embed/video-id",
"interactionStatistic": {
"@type": "InteractionCounter",
"interactionType": { "@type": "WatchAction" },
"userInteractionCount": 12345
}
}
Clip — key moments
hasPart with Clip enables labeled key-moment timestamps in search results. Google uses your explicit Clip data instead of its own auto-detected segments.
{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "Tutorial: Setting Up Your Environment",
"description": "Step-by-step guide to configuring the development environment.",
"thumbnailUrl": "https://example.com/thumbnails/tutorial.jpg",
"uploadDate": "2024-07-19T08:00:00+00:00",
"duration": "PT12M15S",
"contentUrl": "https://example.com/videos/tutorial.mp4",
"hasPart": [
{
"@type": "Clip",
"name": "Install dependencies",
"startOffset": 30,
"endOffset": 180,
"url": "https://example.com/videos/tutorial?t=30"
},
{
"@type": "Clip",
"name": "Configuration file",
"startOffset": 181,
"endOffset": 420,
"url": "https://example.com/videos/tutorial?t=181"
}
]
}
Field notes
- Required:
name,description,thumbnailUrl,uploadDate. Video-tab indexing additionally requires at least one ofcontentUrlorembedUrl. thumbnailUrl: minimum 30×30px, crawlable by Google, 1:1/4:3/16:9 aspect ratios preferred; supply multiple sizes as an array.durationformat is ISO 8601 —PT4M30S= 4 min 30 sec,PT1H2M3S= 1 hr 2 min 3 sec.- No two
Clipelements on the same video should share astartOffsetvalue. expiresremoves the video from search consideration after that date; omit if it doesn’t expire.- Schema must be on the page where users actually watch the video — adding it to a page without an embedded player is a guideline violation.