Why You Are Here
Video markup earns visibility across more surfaces than almost any other structured data type. A correctly marked-up video can appear in the main search results with a thumbnail, in Google Images, in the dedicated Video tab, and in Discover. Add key moments and it gains clickable timestamps beneath the result, letting someone jump straight to the part they want.
That last feature is the one worth chasing. A result offering four labelled jump points takes up considerably more space than a plain link and answers the searcher's question before they have clicked.
The first situation is a site hosting or embedding video with no structured data, where Google has to infer that a video exists at all rather than being told.
The second is chasing key moments specifically, which needs more than a basic VideoObject and has prerequisites most pages do not list.
The third is fixing markup written before February 2026, when Google deprecated the property most guides still recommend for view counts.
What This Tool Does
The Video Schema Generator builds valid VideoObject JSON-LD from a simple form.
Enter the video title, thumbnail URL, upload date, description, duration, and content or embed URL, add key moment segments if you want them, and the tool assembles correctly structured JSON-LD with Clip objects nested where needed and the script tag included. Copy it and paste it into your page.
Only Three Properties Are Required
| Property | Required |
|
name |
REQUIRED |
|
thumbnailUrl |
REQUIRED |
|
uploadDate |
REQUIRED |
Those three establish eligibility. Everything beyond them improves what the result looks like and what features it can access.
The interactionCount Deprecation
This one is recent enough that most published guidance has not caught up.
Use interactionStatistic instead.
Old, deprecated
"interactionCount": "4521"
Current
"interactionStatistic": {
"@type": "InteractionCounter",
"interactionType": { "@type": "WatchAction" },
"userInteractionCount": 4521
}
Property Reference
| Property | Status | Notes |
|
name |
REQUIRED |
The video title |
|
thumbnailUrl |
REQUIRED |
Must be crawlable and indexable |
|
uploadDate |
REQUIRED |
ISO 8601 with timezone offset |
|
description |
Recommended |
What the video covers |
|
duration |
Recommended |
ISO 8601 duration, PT4M32S |
|
contentUrl |
Recommended |
Direct link to the video file |
|
embedUrl |
Recommended |
Player embed URL |
|
interactionStatistic |
Recommended |
View count, replaces interactionCount |
|
expires |
Recommended |
Only if the video genuinely expires |
|
hasPart |
Optional |
Clip objects for key moments |
|
potentialAction |
Optional |
SeekToAction for automatic key moments |
|
publication |
Optional |
BroadcastEvent for livestreams |
|
regionsAllowed |
Optional |
Where the video may be shown |
|
isFamilyFriendly |
Optional |
True or false |
contentUrl points at the actual video file, embedUrl at the player. Google's ability to fetch the file matters.
Marking a video as expired removes it from search results, and doing that by accident to evergreen content is a costly mistake.
Key Moments — Clip or SeekToAction
Key moments turn a single search result into several labelled jump points. There are two ways to get them, and they are not equivalent.
| Clip | SeekToAction | |
|
How it works |
You define each segment yourself |
Google identifies segments automatically |
|
Control |
Full: you set start, end, and label |
None: Google chooses |
|
What you supply |
Every segment explicitly |
Your URL timestamp pattern |
|
Language support |
ALL languages Google Search supports |
TWELVE languages only |
|
Best for |
Content where the sections matter |
Large libraries where manual work is impractical |
SeekToAction is supported in English, Spanish, Portuguese, Italian, Chinese, French, Japanese, German, Turkish, Korean, Dutch, and Russian. If you publish in Arabic, Hindi, Polish, Urdu, or any other language, SeekToAction will not produce key moments and Clip is your only route.
Three prerequisites apply to both
• The video must be at least 30 seconds long. Shorter videos are not eligible at all
• Your URL must support deep-linking to a timestamp, in the form example.com/video?t=30
• The VideoObject must sit on a page where the video can actually be watched
No two clips for the same video on the same page may share a start time.
You do not need either. Timestamps written in the YouTube description generate key moments on their own.
Including any Google generates automatically, use the nosnippet meta tag.
Example — VideoObject With Key Moments
{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "How to Repoint Brickwork: Full Tutorial",
"description": "A complete walkthrough of raking out and
repointing a brick wall.",
"thumbnailUrl": [
"https://example.com/thumbs/repointing-1x1.jpg",
"https://example.com/thumbs/repointing-16x9.jpg"
],
"uploadDate": "2026-05-12T09:00:00+01:00",
"duration": "PT14M22S",
"contentUrl": "https://example.com/videos/repointing.mp4",
"embedUrl": "https://example.com/embed/repointing",
"interactionStatistic": {
"@type": "InteractionCounter",
"interactionType": { "@type": "WatchAction" },
"userInteractionCount": 18420
},
"hasPart": [
{
"@type": "Clip",
"name": "Tools you will need",
"startOffset": 0,
"endOffset": 95,
"url": "https://example.com/videos/repointing?t=0"
},
{
"@type": "Clip",
"name": "Raking out the old mortar",
"startOffset": 95,
"endOffset": 412,
"url": "https://example.com/videos/repointing?t=95"
},
{
"@type": "Clip",
"name": "Mixing the mortar",
"startOffset": 412,
"endOffset": 640,
"url": "https://example.com/videos/repointing?t=412"
}
]
}
SeekToAction alternative
"potentialAction": {
"@type": "SeekToAction",
"target":
"https://example.com/videos/repointing?t={seek_to_second_number}",
"startOffset-input": "required name=seek_to_second_number"
}
// Tells Google where the timestamp sits in your URL pattern
// so it can build its own links.
// Use Clip OR SeekToAction, not both.
Google Must Be Able to Fetch the Video File
This requirement causes more silent failures than any other, because nothing warns you when it is not met.
This enables video previews and key moments. Not the page, not the player: the file itself.
• The video file directory is disallowed in robots.txt
• The player loads the file through JavaScript in a way Google cannot resolve
• The file sits behind authentication or a signed URL that expires
• A CDN configuration blocks Google's fetchers
Livestreams — The LIVE Badge
BroadcastEvent markup adds a red LIVE badge to a livestream's search result, which is a strong signal for real-time content.
"publication": {
"@type": "BroadcastEvent",
"isLiveBroadcast": true,
"startDate": "2026-08-14T19:00:00+01:00",
"endDate": "2026-08-14T21:00:00+01:00"
}
The LIVE badge depends on notifying Google through the Indexing API when the stream starts and ends. Markup alone will not produce it, because Google has no other way to know a stream has gone live at that moment.
Common Mistakes to Avoid
interactionCount was deprecated in Google's video documentation update of 13 February 2026, and the replacement is interactionStatistic with a nested InteractionCounter. Because the deprecation is recent, most published examples and many CMS templates still emit the old property. If your video markup predates 2026, this is the first thing to check.
Key moments require a video of at least 30 seconds, a URL that supports deep-linking to a timestamp, and a page where the video is actually watchable. Adding Clip markup to a 20-second video, or to a player whose URL cannot carry a timestamp, produces nothing at all. Check all three before writing the segments.
The expires property tells Google the video is no longer available after a given date, and Google removes expired videos from search results. Setting it on evergreen content, or letting a template populate it automatically, quietly removes videos from search once the date passes. Only use it when the video genuinely becomes unavailable.
Quick Reference
| Item | Detail |
|
Type |
VideoObject |
|
Rich result |
Search, Images, Video tab, Discover |
|
Required |
name, thumbnailUrl, uploadDate |
|
View counts |
interactionStatistic, not interactionCount |
|
Duration |
ISO 8601, PT4M32S |
|
Key moments |
Clip or SeekToAction |
|
Clip |
All languages, full control |
|
SeekToAction |
Twelve languages, automatic |
|
Minimum length for key moments |
30 seconds |
|
URL |
Must deep-link to a timestamp |
|
File access |
Google must be able to fetch it |
|
expires |
Only if it genuinely expires |
|
LIVE badge |
BroadcastEvent plus Indexing API |
|
Opt out |
nosnippet meta tag |
