VideoObject schema markup: example, required fields and WordPress setup
VideoObject schema describes a video embedded on a page: its title, description, thumbnail, upload date, duration and where the file or player lives. Google requires name, thumbnailUrl and uploadDate. The recommended contentUrl and embedUrl help Google fetch the video itself, which it needs for features like key moments.
Video features go to pages built around a video. If a video is a small supporting element in a long article, Google is unlikely to treat the page as a video result, markup or not. For watch pages, tutorials and recorded talks, VideoObject is how you make the title, thumbnail and length unambiguous.
JSON-LD example
Copy this into a <script type="application/ld+json"> tag and replace the values with your own.
{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "How to True a Bicycle Wheel at Home",
"description": "Step-by-step wheel truing with a spoke wrench and zip-tie gauge, no truing stand needed.",
"thumbnailUrl": [
"https://example.com/video/wheel-truing-16x9.jpg",
"https://example.com/video/wheel-truing-1x1.jpg"
],
"uploadDate": "2026-05-12T09:00:00-07:00",
"duration": "PT8M42S",
"contentUrl": "https://example.com/video/wheel-truing.mp4",
"embedUrl": "https://example.com/embed/wheel-truing",
"hasPart": [
{
"@type": "Clip",
"name": "Find the wobble",
"startOffset": 35,
"endOffset": 140,
"url": "https://example.com/wheel-truing?t=35"
},
{
"@type": "Clip",
"name": "Adjust the spokes",
"startOffset": 140,
"endOffset": 395,
"url": "https://example.com/wheel-truing?t=140"
},
{
"@type": "Clip",
"name": "Check spoke tension",
"startOffset": 395,
"endOffset": 522,
"url": "https://example.com/wheel-truing?t=395"
}
]
}
Properties
| Property | Status | What it is |
|---|---|---|
name | Required | The video's title. |
thumbnailUrl | Required | One or more crawlable thumbnail image URLs. |
uploadDate | Required | When the video was first published, in ISO 8601 with a time zone offset. |
description | Recommended | A description of the video's content. |
duration | Recommended | Length as an ISO 8601 duration, such as PT8M42S. |
contentUrl | Recommended | The URL of the video file itself. |
embedUrl | Recommended | The URL of the video player, such as the iframe src. |
hasPart | Recommended | Clip items marking key moments, each with name, startOffset, endOffset and url. |
potentialAction (SeekToAction) | Recommended | Tells Google how your URLs link to a timestamp so it can find key moments automatically. |
publication (BroadcastEvent) | Recommended | For livestreams: isLiveBroadcast, startDate and endDate. Enables the LIVE badge. |
interactionStatistic / expires / regionsAllowed | Recommended | View count, an expiry date, and where the video can be watched. |
Key moments: Clip vs SeekToAction
Key moments let searchers jump to a section of a video. There are two ways to provide them:
- Clip (inside
hasPart): you list each segment yourself with a name, start and end offsets in seconds, and a URL that starts playback at that point. Use this when you want control over the labels. - SeekToAction (in
potentialAction): you tell Google the URL pattern for a timestamp, such ashttps://example.com/wheel-truing?t={seek_to_second_number}, and Google identifies the moments itself.
Both need URLs that actually start the video at the given time. For videos hosted on YouTube, Google can detect key moments from YouTube's own chapters, so your page markup matters most for self-hosted video.
Add it in WordPress
By hand. Print JSON-LD from wp_head with values from the video provider. Take care that the thumbnail and duration match the actual video.
With Hydrogen SEO. VideoObject schema can be added to a post in the Hydrogen SEO metabox. Hydrogen SEO's video sitemap also detects embedded videos (YouTube, Vimeo, self-hosted files and others) and looks up their details; VideoObject values you enter override the detected ones, so schema is how you correct a title, description or thumbnail for one video. If a video is missing from the video sitemap because it has no thumbnail, adding VideoObject schema with a thumbnail, or setting a featured image, fixes it.
Common mistakes
- Blocked or missing thumbnails. thumbnailUrl must be an image Googlebot can fetch.
- uploadDate without a time zone. Add an offset so the date is unambiguous.
- Duration in plain text. Use
PT8M42S, not "8:42". - Markup for a video that is not on the page. The video must be embedded and playable on that URL.
- Clip URLs that ignore the timestamp. If
?t=140does not start playback at 2:20, key moments will not work. - Marking up every page that mentions a video. Focus on pages where the video is the main content.
Test it
Two passes work best for VideoObject: syntax and required fields in our validator, then the live URL in the Rich Results Test and validator.schema.org. Search Console's Video indexing report shows which pages Google treats as video pages and why others are excluded, such as the video not being the main content. The Videos enhancement report covers markup errors.
Common questions
What fields does Google require for VideoObject?
name, thumbnailUrl and uploadDate. contentUrl, embedUrl, duration and description are recommended.
Do I need VideoObject markup for YouTube embeds?
It is not strictly required, since Google can read YouTube embeds, but markup states the title, thumbnail and date for your page explicitly and lets you correct them.
How do I get the LIVE badge?
Add a BroadcastEvent in the publication property with isLiveBroadcast set to true and start and end dates. Google recommends the Indexing API for livestream pages.
Why isn't my page showing as a video result?
Google mainly shows video features when the video is the main content of the page. A video tucked below a long article usually does not qualify.