Video schema markup: earn video rich results with VideoObject

Add VideoObject schema markup with JSON-LD to earn video rich results in Google. Required properties, a copy-paste example, key moments and validation.

S
Sneha Nair
Freelance SEO consultant; covers reporting, white-label workflows and getting found locally.
Published 26 Jun 2026·7 min read

Video schema markup is a small block of VideoObject JSON-LD you add to a page so Google understands there's a video on it — what it's called, when it went live, and where the file sits. Add it correctly and your result can carry a video thumbnail, clickable key moments, and a LIVE badge; skip it and you're a plain blue link competing against pages that aren't. This guide covers the required properties, a copy-paste example, chapters via Clip and SeekToAction, livestreams, and how to validate.

What video schema markup is and why it matters

Search engines don't watch your videos. They read the HTML around them. Structured data is how you hand Google a machine-readable summary of the video instead of hoping it infers one from your markup. The specific type is VideoObject, part of the schema.org vocabulary, and the recommended format is JSON-LD — a <script> block you drop into the page rather than attributes sprinkled through your HTML.

The payoff is a video rich result: a thumbnail in the main results, in the Videos tab, in Google Images, and in Discover. On mobile especially, a thumbnail is a wildly bigger click target than a text snippet. It's the same logic as a good YouTube thumbnail — the image does the persuading — which is why it pairs with everything in YouTube thumbnails and CTR.

One honest caveat up front: markup makes you eligible, not guaranteed. Google still decides whether the query deserves a video result. Your job is to remove every technical reason it might say no.

Google splits VideoObject properties into required and recommended. Miss a required one and the page is not eligible for video rich results — full stop. The recommended ones unlock extra features like key moments and live badges.

Property Status What it does
name Required The video title. Keep it distinct from the page title.
description Required Plain-text summary of the video. Not a duplicate of name; describe the content.
thumbnailUrl Required A crawlable, high-res image URL. Google recommends multiple sizes, min 60x30px.
uploadDate Required ISO 8601 date, ideally with timezone, e.g. 2026-06-26T08:00:00+05:30.
contentUrl Recommended Direct URL to the raw video file (.mp4 etc.). Helps Google fetch it.
embedUrl Recommended URL of the player (e.g. the YouTube/Vimeo embed). Provide this or contentUrl.
duration Recommended ISO 8601 duration, e.g. PT8M40S for 8m40s.
hasPart / potentialAction Recommended Enables key moments via Clip or SeekToAction.
publication Recommended Marks a livestream with BroadcastEvent.

Two mistakes cause most failures. First, a thumbnailUrl Google can't crawl — blocked by robots.txt, behind a login, or a data URI. Provide a real, public image URL. Second, a description that just repeats the title; write two useful sentences about what the viewer will see.

JSON-LD example you can copy and adapt

Here's a complete, valid VideoObject. Replace the values, keep the structure.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "How to run a technical SEO audit in 30 minutes",
  "description": "A walkthrough of crawling a site, spotting index bloat, and fixing Core Web Vitals — with a downloadable checklist you can reuse on any project.",
  "thumbnailUrl": [
    "https://example.com/thumbs/audit-1x1.jpg",
    "https://example.com/thumbs/audit-4x3.jpg",
    "https://example.com/thumbs/audit-16x9.jpg"
  ],
  "uploadDate": "2026-06-26T08:00:00+05:30",
  "duration": "PT12M30S",
  "contentUrl": "https://example.com/videos/technical-seo-audit.mp4",
  "embedUrl": "https://example.com/embed/technical-seo-audit",
  "publisher": {
    "@type": "Organization",
    "name": "DeployFlare",
    "logo": {
      "@type": "ImageObject",
      "url": "https://example.com/logo.png"
    }
  }
}
</script>

Notes that trip people up:

  • Provide three thumbnail aspect ratios (16:9, 4:3, 1:1) so Google can pick per surface. An array is fine.
  • uploadDate must be ISO 8601. June 26, 2026 will fail validation.
  • Include either contentUrl or embedUrl (both is better). Without one, key moments and previews are weaker.

If you'd rather not hand-write JSON, a video schema generator — Google's own Structured Data Markup Helper, or the templating in most modern CMS platforms — produces the same block. Whatever you use, still validate the output; generators happily emit fields Google ignores.

Key moments with Clip and SeekToAction

Key moments are the clickable timestamps that appear under a video result, letting a searcher jump straight to the relevant part. They're one of the highest-value video features because they turn one result into several entry points. There are two ways to get them.

Method 1 — Clip (explicit)

You define each segment by hand. Best when you want exact labels and full control.

"hasPart": [
  {
    "@type": "Clip",
    "name": "Crawling the site",
    "startOffset": 30,
    "endOffset": 210,
    "url": "https://example.com/watch?v=audit&t=30"
  },
  {
    "@type": "Clip",
    "name": "Fixing Core Web Vitals",
    "startOffset": 210,
    "endOffset": 480,
    "url": "https://example.com/watch?v=audit&t=210"
  }
]

Each Clip needs a name, startOffset (seconds), and a url with a deep link to that timestamp. Your player must actually honor that t= parameter, or the moments send viewers to the wrong spot.

Method 2 — SeekToAction (automatic)

Instead of listing clips, you tell Google the URL pattern your player uses for timestamps, and Google auto-detects chapters from your video's own structure.

"potentialAction": {
  "@type": "SeekToAction",
  "target": "https://example.com/watch?v=audit&t={seek_to_second_number}",
  "startOffset-input": "required name=seek_to_second_number"
}

Use SeekToAction when your video already has clear chapters and you'd rather Google generate the moments than maintain a Clip list. Use Clip when you want precise, human-written labels. Don't use both for the same video. Well-structured chapters here reinforce the same transcript work described in video transcripts for SEO.

Livestreams with BroadcastEvent

For a live video, you use the same VideoObject and add a publication node of type BroadcastEvent. This is what earns the red LIVE badge in search — a strong CTR lift while you're on air.

"publication": {
  "@type": "BroadcastEvent",
  "isLiveBroadcast": true,
  "startDate": "2026-06-26T18:30:00+05:30",
  "endDate": "2026-06-26T19:30:00+05:30"
}

Three things make live markup work:

  • Set isLiveBroadcast: true and provide a startDate. Add endDate when known.
  • Update the markup as the state changes — before, during, and after the stream. Google offers the Indexing API for live videos so the badge appears and disappears at the right time.
  • Keep the surrounding VideoObject valid; the BroadcastEvent is an addition, not a replacement.

After the stream ends, the recording keeps its VideoObject and can still earn a normal video result — so a single livestream page can rank twice over its life.

Validating and pairing with a video sitemap

Markup you haven't tested is a guess. Two steps close the loop.

1. Run the Rich Results Test. Paste the live URL (or the code) into the Rich Results Test. It tells you whether the page is eligible for video rich results and lists errors (missing required field) and warnings (recommended field absent). Fix every error; treat warnings as an upgrade backlog. Then watch the Videos report in Search Console for how many of your videos Google actually indexed.

2. Submit a video sitemap. Schema describes a video; a video sitemap helps Google discover it and understand which page it belongs to. The two work together — this is important enough that it has its own guide in video sitemaps. At minimum, list each video's page URL, thumbnail, title, and description in your sitemap so crawling and structured data agree.

Here's the launch checklist I run before calling a video page done:

Step Do Don't
Required fields Fill name, description, thumbnailUrl, uploadDate Leave uploadDate as a human-readable string
Thumbnail Public, high-res, multiple ratios Block the image in robots.txt
Player link Provide contentUrl and/or embedUrl Omit both
Key moments Pick Clip or SeekToAction, not both Deep-link to timestamps the player ignores
Validation Pass the Rich Results Test with zero errors Ship untested markup
Discovery Add the page to a video sitemap Rely on schema alone

Schema is the technical layer of a bigger picture. It decides how your video appears, but ranking still rests on the fundamentals in video SEO and how to rank YouTube videos. Once your video pages are earning impressions, watch which queries actually surface them — DeployFlare's rank tracker lets you monitor video and SERP-feature positions the same way you'd track any keyword, so you can see whether that thumbnail is winning clicks or just sitting there.

Get the four required properties right, add key moments where they help, validate, and back it with a sitemap. That's the whole job — and it's the difference between a result people scroll past and one they click.

Frequently asked questions

What is video schema markup?

Video schema markup is structured data — almost always written as VideoObject JSON-LD — that describes a video on your page in a format search engines read directly. It names the video, gives a description, points to a thumbnail and the video file, and states when it was published. Google uses this to show video thumbnails, key moments, and LIVE badges in search results instead of a plain text link.

How do I add video schema to my website?

Add a <script type="application/ld+json"> block to the HTML of the page that hosts the video, filling in a VideoObject with at least name, description, thumbnailUrl, and uploadDate. Most teams generate it from a template or CMS field so every video page gets consistent markup. After adding it, test the URL in Google's Rich Results Test to confirm the video is eligible, then add the page to a video sitemap so Google finds it.

What are the required properties for VideoObject?

Google requires exactly four VideoObject properties for a video to be eligible for rich results: name (the title), description (a plain-text summary, not a copy of the title), thumbnailUrl (a high-resolution image Google can crawl), and uploadDate in ISO 8601 format. Recommended-but-optional properties like contentUrl, embedUrl, duration, and hasPart add features such as key moments and better previews, but the four required fields are the minimum bar.

How do I add key moments to video search results?

Key moments — the clickable timestamps under a video result — come from one of two methods. The Clip method has you define each segment explicitly with a name, start time, end time, and a deep-linked URL. The SeekToAction method lets Google auto-detect chapters by telling it the URL pattern your player uses for timestamps (for example ?t={seconds}). Use Clip when you want full control over labels; use SeekToAction when your video already has chapters and you want them detected automatically.

Does video schema markup guarantee a video rich result?

No. Correct, validated markup makes your page eligible for video rich results, but Google decides whether to show them based on query, relevance, and quality. Think of schema as a requirement you must meet rather than a switch you flip. Pages with valid markup, a crawlable thumbnail, a working video sitemap, and genuinely useful video content are far more likely to earn the thumbnail than pages missing any one of those pieces.

Do I need video schema if my video is on YouTube?

YouTube generates its own structured data for videos hosted on youtube.com, so you don't mark those up. You add VideoObject schema on your own domain — for videos you self-host or embed on your pages — so those pages can earn video thumbnails in Google Search. If you embed a YouTube video on your site and want the embedding page to be eligible, you can mark it up with embedUrl pointing at the YouTube player.

Keep reading