Video Schema Generator
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": "Big Buck Bunny 60fps 4K - Official Blender Foundation Short Film",
"description": "Big Buck Bunny, the Blender Foundation’s open movie, in 4K at 60 fps.",
"thumbnailUrl": [
"https://i.ytimg.com/vi/aqz-KE-bpKQ/maxresdefault.jpg"
],
"duration": "PT10M35S",
"embedUrl": "https://www.youtube.com/embed/aqz-KE-bpKQ"
}
</script>
<!-- Created with Elfsight: https://elfsight.com/tools/video-schema-generator/ -->Missing required: uploadDate
- Click Copy code above to copy it.
- Open the page’s HTML file or the template every page uses.
- Paste the code inside
<head>, before the closing</head>. - Save and upload the page.
Rather not write markup at all? Show your videos with the Video Gallery widget instead: YouTube, Vimeo, TikTok and more in one gallery, new videos from your channel appear by themselves, and the Schema.org markup is built in — set it up once and forget about it.
Get video markup for every video automatically
Auto-updates when you publish new videos
Carousel, grid, masonry or player with playlist
YouTube, Vimeo, TikTok, Instagram, Twitch and any video link
No coding — works on any website
Writing JSON-LD by hand vs. this generator
name, thumbnailUrl, uploadDatePT3M30ScontentUrl and embedUrl are emptyRequired fields
Writing JSON-LD by hand
name, thumbnailUrl, uploadDateThis generator
Duration
Writing JSON-LD by hand
PT3M30SThis generator
YouTube videos
Writing JSON-LD by hand
This generator
Where Google gets the video
Writing JSON-LD by hand
This generator
contentUrl and embedUrl are emptyEmpty fields
Writing JSON-LD by hand
This generator
Syntax
Writing JSON-LD by hand
This generator
How to use the Video Schema generator
Enter video details
Paste a YouTube link to autofill the thumbnail and embed URL, then add a title, description and upload date.
Check required fields
Google requires name, thumbnailUrl and uploadDate. Add a contentUrl or embedUrl too.
Copy and validate
Paste the script into the page’s <head> and test it with Google’s Rich Results Test.
VideoObject properties Google uses
name"name": "How to fold a shirt"thumbnailUrl"thumbnailUrl": "https://example.com/thumb.jpg"uploadDate"uploadDate": "2026-03-31T08:00:00+08:00"contentUrl"contentUrl": "https://example.com/video.mp4"embedUrl"embedUrl": "https://www.youtube.com/embed/ID"description"description": "…"duration"duration": "PT3M30S"creator / authorname and optionally a url."creator": {"@type": "Organization", "name": "…"}expires"expires": "2027-01-01T00:00:00+00:00"interactionStatisticWatchAction), likes, comments or shares."userInteractionCount": 12345regionsAllowed / ineligibleRegion"regionsAllowed": ["US", "CA"]hasPart (Clip)Clip needs name, startOffset and url."startOffset": 30potentialAction (SeekToAction)"target": "https://example.com/video?t={seek_to_second_number}"publication (BroadcastEvent)"isLiveBroadcast": truename
What it does
Example
"name": "How to fold a shirt"thumbnailUrl
What it does
Example
"thumbnailUrl": "https://example.com/thumb.jpg"uploadDate
What it does
Example
"uploadDate": "2026-03-31T08:00:00+08:00"contentUrl
What it does
Example
"contentUrl": "https://example.com/video.mp4"embedUrl
What it does
Example
"embedUrl": "https://www.youtube.com/embed/ID"description
What it does
Example
"description": "…"duration
What it does
Example
"duration": "PT3M30S"creator / author
What it does
name and optionally a url.Example
"creator": {"@type": "Organization", "name": "…"}expires
What it does
Example
"expires": "2027-01-01T00:00:00+00:00"interactionStatistic
What it does
WatchAction), likes, comments or shares.Example
"userInteractionCount": 12345regionsAllowed / ineligibleRegion
What it does
Example
"regionsAllowed": ["US", "CA"]hasPart (Clip)
What it does
Clip needs name, startOffset and url.Example
"startOffset": 30potentialAction (SeekToAction)
What it does
Example
"target": "https://example.com/video?t={seek_to_second_number}"publication (BroadcastEvent)
What it does
Example
"isLiveBroadcast": trueVideo markup errors and how to fix them
The Rich Results Test reports a missing field
Google requires name, thumbnailUrl and uploadDate. Fill in all three.
The upload date is flagged, or the date looks off by a day
Use ISO 8601 and add a time zone, for example 2026-03-31T08:00:00+08:00. Without one, Google uses Googlebot’s time zone.
The duration is invalid
Duration must be in ISO 8601: PT1M54S is one minute 54 seconds. Type mm:ss in the generator and it converts it.
The thumbnail isn’t picked up
Use a BMP, GIF, JPEG, PNG, WebP, SVG or AVIF image of at least 60 × 30 px (larger is better) that Googlebot can fetch — not blocked by robots.txt or a login.
The markup is valid but no video result appears
Put the markup on the page where the video plays, and make sure the video isn’t hidden behind other elements. Valid markup makes a page eligible; Google decides what to show.
Google can’t fetch the video
Add contentUrl (the video file itself) or, if you don’t have one, embedUrl (the player). Neither should point to the page the video is on.
Key moments don’t show
Add Clip or SeekToAction markup, or chapters in the YouTube description for YouTube videos. A nosnippet meta tag turns key moments off.
Required fields and why uploadDate matters
Google needs three properties before a video can appear with video features in search:
name — the video title. Each video on your site should have its own.
thumbnailUrl — the thumbnail image. It must be at least 60 × 30 px and reachable by Googlebot.
uploadDate — when the video was first published.
uploadDate tells Google when the video first went live. Write it in ISO 8601 and include the time zone, like 2026-03-31T08:00:00+08:00; without a time zone, Google assumes Googlebot’s. Use the original publish date, and don’t change it each time you edit the page.
Recommended properties make the markup more useful:
contentUrl or embedUrl — where Google can get the video. Google prefers
contentUrl, the file itself; useembedUrl, the player address, when there’s no file. Neither should be the address of the page.description and duration (ISO 8601, e.g.
PT3M30S).expires for videos that will be taken down, and regionsAllowed or ineligibleRegion for videos limited to some countries.
Put the markup on the page where the video can actually be watched, then check it with Google’s Rich Results Test. Full list: Google’s video structured data documentation.
Key moments and chapters
Key moments are the labelled segments Google can show under a video in search, so people jump straight to the part they need. There are three ways to get them:
Clip markup — you list the segments yourself in
hasPart. EachCliphas aname, astartOffsetin seconds, an optionalendOffset, and aurlthat opens the video at that point (the same page URL plus a time parameter, like?t=120). Google uses these labels before its own guesses.SeekToAction markup — you tell Google how your page links to a moment, with
{seek_to_second_number}where the time goes. Google then finds the moments itself. It must be able to fetch the video file, and it works in a limited set of languages.YouTube chapters — for videos hosted on YouTube, timestamps in the video description can work instead of markup.
YouTube’s rules for chapters in the description:
The first timestamp is
00:00.At least three timestamps, in ascending order, each on its own line with a label.
Each chapter is at least 10 seconds long.
A nosnippet meta tag turns key moments off. Details: Google: video structured data, YouTube Help: video chapters.