A video page, to structured data, is a page whose main content is one video. The markup is VideoObject, and the rewards are the video snippet (a thumbnail on the result), placement in the Video tab, and — with timestamps — key moments.

What is required — four properties, no shortcuts

  • name — the video's title.
  • description — what it shows. Not the page's meta description reused unless it genuinely describes the video.
  • thumbnailUrl — the image shown on the result. It must be an absolute URL, reachable, and fetchable by Googlebot — a thumbnail behind robots.txt is the commonest reason video markup produces nothing, and the failure is silent.
  • uploadDate — ISO 8601, ideally with a time and offset.

What strengthens the result

  • duration — ISO 8601 (PT12M30S), shown on the result itself.
  • contentUrl — the video file, so Google can fetch the actual media rather than inferring it from a player. This is also what makes preview clips possible.
  • embedUrl — the player URL, for videos served through an embed. Declare whichever of the two you have; both is best.

Is this a video page at all?

The result goes to pages where the video is the main content. A blog post with a supporting clip halfway down can carry VideoObject markup harmlessly, but the video result itself favours pages where the video is what the visitor came for. If the video matters, give it a page.

An example

{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "Fixing a leaking tap in ten minutes",
  "description": "Isolate the supply, replace the cartridge, reseal.",
  "thumbnailUrl": ["https://example.com/img/tap-thumb.jpg"],
  "uploadDate": "2026-05-03T10:00:00+05:30",
  "duration": "PT9M40S",
  "contentUrl": "https://cdn.example.com/video/tap-repair.mp4",
  "embedUrl": "https://example.com/embed/tap-repair"
}

Key moments, if the video has chapters

For a longer video with distinct sections, hasPart with Clip entries — each carrying a name, a startOffset in seconds and a url that jumps to that moment — lets Google show the chapter list directly on the result. It is the difference between "a ten-minute video" and "the answer is at 4:20", and for tutorial content it measurably earns the click. Alternatively, on platforms you control, SeekToAction tells Google how to build a jump-to-time URL itself.

The mistakes that keep videos out of results

The blocked thumbnail. Worth repeating because nothing reports it: the markup validates, the page indexes, and the video simply never appears, because the one image Google needs is disallowed to it.

No fetchable media. Neither a contentUrl nor an embedUrl means Google knows a video exists but cannot look at it.

An uploadDate that moves. Regenerating it on every deploy makes every video permanently "new", which is a freshness claim the content contradicts.

Checking your page

Validate the block with the structured data validator, then run the complete page audit — the audit also reads your robots rules, which is where the thumbnail problem lives, and it is precisely the kind of cross-page fact a markup validator cannot see.