Machine-Readable Infrastructure

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 of contentUrl or embedUrl.
  • thumbnailUrl: minimum 30×30px, crawlable by Google, 1:1/4:3/16:9 aspect ratios preferred; supply multiple sizes as an array.
  • duration format is ISO 8601 — PT4M30S = 4 min 30 sec, PT1H2M3S = 1 hr 2 min 3 sec.
  • No two Clip elements on the same video should share a startOffset value.
  • expires removes 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.