VideoObject Schema

How to implement VideoObject schema for Google's video rich results across search, the Video tab, Images, and Discover — required vs. recommended properties, the two ways to add key moments (SeekToAction vs. Clip), and the BroadcastEvent LIVE badge.

First published: Jul 1, 2026 · Last updated: Jul 18, 2026 · Advanced
demand #22 in Structured Data#51 in On-Page#240 in Technical SEO#324 on the site

VideoObject schema (schema.org/VideoObject) marks up a page's video so Google can show video rich results — thumbnail, duration, and key moments — across four surfaces, not one: the main search results page, the Video tab, Google Images, and Google Discover. That multi-surface reach is broader than most people assume and makes this one of the two highest-payoff rich-result types in the cluster (alongside Recipe). Only three properties are required — name, thumbnailUrl, and uploadDate — with contentUrl, description, duration, embedUrl, expires, interactionStatistic, and region eligibility all recommended. Two features cause most of the confusion. Key moments (the chapter timestamps) can be done two ways: automatically via SeekToAction/potentialAction if your video URLs already accept a timestamp parameter, or manually via Clip markup (name, startOffset, and url are required; endOffset is recommended) when you want publisher-specified labels and timestamps instead of Google's automatic picks. And the LIVE badge isn't a separate schema — it's BroadcastEvent (isLiveBroadcast, startDate, endDate — required once you're adding BroadcastEvent at all) documented on the same page and used alongside VideoObject. The most common miss is omitting uploadDate or writing it in an inconsistent date format. As always, valid markup only makes you eligible — Google, and the video being crawlable, still decide whether it shows.

TL;DR — schema.org/VideoObject markup (usually JSON-LDJSON-LD (JavaScript Object Notation for Linked Data) is a script-based structured data format, typically paired with the schema.org vocabulary to describe page content for search engines and AI systems. Google recommends it over Microdata and RDFa because it's the easiest format to implement and maintain at scale — but all three work, and structured data isn't a ranking signal.) makes a video eligible for video rich resultsRich results (formerly 'rich snippets') are enhanced search listings — stars, images, prices, breadcrumbs, video thumbnails, and more — that Google and Bing build from structured data. They're a display feature, not a ranking factor, and eligibility never guarantees they'll show. across four Google surfaces — main search, the Video tab, Google Images, and Google DiscoverGoogle Discover is a personalized, mobile-first content feed built into the Google app, Chrome's mobile New Tab page, and google.com that surfaces articles and videos based on a user's interests and activity — not a response to a search query. There's nothing to 'rank' for in the traditional sense; eligibility is governed by Discover's content policies plus the same helpful-content, image, and page-experience signals Google Search already uses.. Required: name, thumbnailUrl, uploadDate. Recommended: contentUrl, description, duration, embedUrl, expires, interactionStatistic, and regionsAllowed/ineligibleRegion. Key moments have two mechanisms — automatic via SeekToAction/potentialAction (if your URLs accept a timestamp parameter Google can infer) or manual via Clip (name, startOffset, and url required per chapter; endOffset recommended). The LIVE badge is BroadcastEvent (isLiveBroadcast, startDate, endDate) used alongside VideoObject, documented on the same page — not a separate system. The most common miss is omitting uploadDate or using an inconsistent date format. Valid markup only earns eligibility; Google still decides whether to show it, and the video has to be crawlable and indexable. This is one of the two highest-payoff types in the cluster alongside Recipe — worth doing properly.

Evidence for this claim Schema.org VideoObject defines vocabulary for a video media object; being valid Schema.org does not by itself guarantee a Google video feature. Scope: Schema.org type definition, distinct from Google eligibility. Confidence: high · Verified: Schema.org: VideoObject Evidence for this claim Google's VideoObject documentation requires name, thumbnailUrl, and uploadDate for video structured-data eligibility and recommends additional properties. Scope: Current Google video structured data requirements; eligibility is not a display guarantee. Confidence: high · Verified: Google Search Central: Video structured data

What VideoObject schema does — one markup, four surfaces

Most guides flatten VideoObject into “get a thumbnail in search.” The reach is wider than that, and it’s worth leading with because it changes the ROI calculation. Google’s own framing: “Videos can appear in several different places on Google, including the main search results page, Video mode, Google Images, and Google Discover.” That’s four distinct surfaces from one block of markup — which is why I rank this, with Recipe, as one of the two genuinely high-payoff types in the whole structured-data cluster. (It’s no coincidence the two overlap: many Recipe pages embed a cooking video via the recipe’s video property, and that video is itself a VideoObject.)

The vocabulary is schema.org/VideoObject, and Google’s Video guide covers three related types on a single page: VideoObject itself, Clip (key moments), and BroadcastEvent (the LIVE badge). Worth knowing: there is no separate “media-clip” doc page — the URL you might guess at returns a 404. Clip and segment markup for video is folded into the same Video guide as VideoObject, so don’t go hunting for a dedicated page that doesn’t exist.

Required — the minimum for any video rich result:

PropertyWhat it is
nameThe video’s title
thumbnailUrlURL to a representative thumbnail image
uploadDateThe date the video was first published (ISO 8601)

Recommended — add as many as apply; they make the result richer and more reliable:

PropertyWhy it matters
contentUrlDirect URL to the media file — helps Google fetch the video
descriptionThe video’s description (plain text)
durationISO 8601 duration (e.g. PT4M12S) — powers the runtime badge
embedUrlURL to the player embed
expiresWhen the video is no longer available (omit if it doesn’t expire)
interactionStatisticView count via WatchAction interaction type
regionsAllowed / ineligibleRegionWhere the video may / may not be shown

Provide either contentUrl or embedUrl (both is better) so Google has a way to reach the actual video — a thumbnail with no reachable video is a common reason a result never appears. The three URLs that come up here are not interchangeable: contentUrl is the video file’s actual content bytes (Google’s own docs call it the most effective way for Google to fetch the video); embedUrl is the player, not the file; and neither one is the watch page URL — the page the video is embedded on. A common mistake is pointing contentUrl at the watch page instead of the raw media file.

TIP Check whether the VideoObject exists in the HTML at all

This result is deliberately narrow: no VideoObject JSON-LD was found in the raw response. It does not validate every property or prove what Google rendered.

Run the watch page through my Video SEO Checker to separate missing markup from thumbnail, key-moment, and embed-loading problems. Video SEO Checker Free

  1. Confirm a VideoObject block is present in the raw HTML rather than only after client-side rendering.
  2. Check thumbnailUrl and either contentUrl or embedUrl independently from the schema-presence result.
  3. Validate the complete rendered object in Google’s Rich Results Test before release.
A schema-presence check is the first gate, not a complete video eligibility verdict.

Key moments: SeekToAction vs. Clip

Key moments are the chapter-style deep links under a video result that jump the viewer to a specific timestamp. There are two mechanisms, and confusing them is the single biggest source of implementation trouble on this type.

1. Automatic — SeekToAction / potentialAction. You tell Google, via a potentialAction of type SeekToAction, the URL pattern your player uses to jump to a timestamp (the startOffset-input placeholder). If your video URLs already accept a timestamp parameter, Google can infer the key moments itself from your on-page chapter structure. Use this when your URL structureURL structure is how the parts of a web address — scheme, domain, path, query string, and fragment — are organized and formatted. It mostly affects crawling, usability, and how engines understand a page, not rankings directly. supports timestamps and you’re happy letting Google pick the moments.

{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "How to tie a bowline knot",
  "thumbnailUrl": "https://example.com/thumbs/bowline.jpg",
  "uploadDate": "2026-05-01T08:00:00-05:00",
  "description": "A step-by-step guide to tying a bowline.",
  "duration": "PT4M12S",
  "contentUrl": "https://example.com/video/bowline.mp4",
  "embedUrl": "https://example.com/embed/bowline",
  "potentialAction": {
    "@type": "SeekToAction",
    "target": "https://example.com/watch/bowline?t={seek_to_second_number}",
    "startOffset-input": "required name=seek_to_second_number"
  }
}

2. Manual — Clip markup. You define each chapter explicitly as a Clip. Google’s Clip table splits this the same way as VideoObject itself: requiredname, startOffset (in seconds), and a url that deep-links to that moment; recommendedendOffset (in seconds), so the clip has a defined end as well as a start. Use this when you want to supply your own labels and timestamps rather than the moments Google’s automatic detection would otherwise pick.

{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "How to tie a bowline knot",
  "thumbnailUrl": "https://example.com/thumbs/bowline.jpg",
  "uploadDate": "2026-05-01T08:00:00-05:00",
  "hasPart": [
    {
      "@type": "Clip",
      "name": "Make the loop",
      "startOffset": 30,
      "endOffset": 75,
      "url": "https://example.com/watch/bowline?t=30"
    },
    {
      "@type": "Clip",
      "name": "Thread the tail",
      "startOffset": 75,
      "endOffset": 130,
      "url": "https://example.com/watch/bowline?t=75"
    }
  ]
}

Which to use? Automatic SeekToAction is less work if your URLs already support timestamp parameters and you trust Google to pick the moments. Manual Clip is the right call when you want to name and bound each chapter yourself. Don’t stack both mechanisms for the same purpose on the same video — pick one. The decision tree in the Resources group walks this fork.

LIVE badges with BroadcastEvent

For livestreams, the red LIVE badge is enabled by adding a BroadcastEvent to your VideoObject via the publication property. It is not a separate, unrelated schema type — it’s documented on the same Video guide and layered onto the VideoObject you already have. BroadcastEvent as a whole isn’t required for a plain video rich result, but once you add it for the LIVE badge, Google’s Clip-style table treats isLiveBroadcast, startDate, and endDate as required together:

  • isLiveBroadcast: true
  • startDate — when the broadcast starts or is scheduled to start. A startDate in the future signals a scheduled broadcast; in the past or present, it signals the stream has actually started.
  • endDate — when it ends or is expected to end. Google is explicit that once the stream has actually finished, you must update endDate to a real value — an endDate in the future signals a scheduled end, in the past or present it signals the stream has ended. If you don’t know the end time up front, an approximate endDate is fine to start; just correct it once the stream actually wraps.

Nesting startDate/endDate this way lets Google infer three lifecycle states — scheduled, live, ended — from the same two fields, which is also why a stale endDate (not corrected after the stream stops) is the main way a lingering LIVE badge happens. None of this guarantees the badge appears at any particular time; it only supplies the timing Google’s systems use to decide.

{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "Launch livestream 2026",
  "thumbnailUrl": "https://example.com/thumbs/launch.jpg",
  "uploadDate": "2026-06-30T09:00:00-05:00",
  "publication": {
    "@type": "BroadcastEvent",
    "isLiveBroadcast": true,
    "startDate": "2026-07-01T14:00:00-05:00",
    "endDate": "2026-07-01T15:30:00-05:00"
  }
}

You also need to call Google’s Indexing APIThe Google Indexing API lets site owners notify Google directly when a URL is added, updated, or removed. Google officially supports it only for pages with JobPosting or BroadcastEvent (livestream) structured data — not for general content. for livestream videos so the LIVE badge appears and disappears in a timely way — the badge is time-sensitive in a way a normal on-demand video isn’t.

Common implementation mistakes

  • Omitting uploadDate or using a sloppy date format. It’s one of only three required fields. Use a consistent ISO 8601 value (a full date-time with offset is safest). This is the single most common miss on the type.
  • A thumbnail with no reachable video. Provide contentUrl and/or embedUrl so Google can actually fetch the video the thumbnail represents.
  • Marking up a video that Google can’t crawl or indexStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed.. Structured dataStructured data is a standardized way of labeling page content (using the schema.org vocabulary in JSON-LD, Microdata, or RDFa) so search engines can understand its meaning. It's not a direct ranking factor — its value is rich results and entity understanding. can’t rescue a video hidden behind a login, blocked in robots.txtA plain-text file at the root of a host that tells crawlers which URLs they may and may not request. It controls crawling, not indexing — a blocked URL can still be indexed if it's linked from elsewhere., or loaded in a way the crawlerA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index. can’t see. Markup describes the video; it doesn’t make it accessible.
  • Stacking both key-moment mechanisms. Pick automatic SeekToAction or manual Clip for a given video, not both.
  • Forgetting to close out a livestream. Set endDate and update the markup once the stream ends, or the LIVE badge can linger.
  • Treating valid markup as a guaranteed result. As with every rich-result type, valid VideoObject markup only makes the page eligible — Google’s systems still decide whether to show it.

Where this sits, and video SEO more broadly

VideoObject is the structured-data layer for video, and it lives here alongside its siblings — Recipe (whose pages so often embed a cooking video) and Article (where a video is embedded inside a written piece, and the VideoObject describes that embed). But the markup is only one slice of getting video to perform in search: hosting, sitemapsA sitemap is a file that lists the pages, images, videos, and other files on your site so search engines can discover them. It helps discovery, but submitting a sitemap doesn't guarantee crawling or indexing., thumbnails, transcripts, page speed around the player, and how you embed all matter too. Those broader video SEO topics sit outside this structured-data article — this page is deliberately scoped to the schema itself.

For where VideoObject fits in the wider structured-data picture, see the Schema Markup and Structured Data hubs this article nests under.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.