Video Schema Generator

Create VideoObject structured data (JSON-LD) for any video, for free. Paste a YouTube link to fill in the fields automatically, then copy the markup into your page. No sign-up needed.
January 2026

Add the markup

<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

  1. Click Copy code above to copy it.
  2. Open the page’s HTML file or the template every page uses.
  3. Paste the code inside <head>, before the closing </head>.
  4. 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.

Before you go

Get video markup for every video automatically

See Video Gallery features →
Or share this free tool:
Elfsight Video Gallery

Get video markup for every video automatically

Video Gallery can add Schema.org video markup for all videos in your gallery — no JSON-LD to write or update when you publish new videos.
  • 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

VideoObject markup is a short block of JSON, but one typo stops search engines from reading any of it.
Feature
Writing JSON-LD by hand
This generator
Required fields
Easy to forget one of name, thumbnailUrl, uploadDate
Marked in the form, with a warning if one is missing
Duration
Write ISO 8601 yourself, like PT3M30S
Type mm:ss; converted for you
YouTube videos
Look up the thumbnail and player URLs
Paste the link to fill them in
Where Google gets the video
Nothing reminds you
Warns when both contentUrl and embedUrl are empty
Empty fields
Placeholders left in by mistake
Fields you leave blank are left out
Syntax
One missing comma or quote breaks the whole block
Valid JSON every time

Required fields

Writing JSON-LD by hand

Easy to forget one of name, thumbnailUrl, uploadDate

This generator

Marked in the form, with a warning if one is missing

Duration

Writing JSON-LD by hand

Write ISO 8601 yourself, like PT3M30S

This generator

Type mm:ss; converted for you

YouTube videos

Writing JSON-LD by hand

Look up the thumbnail and player URLs

This generator

Paste the link to fill them in

Where Google gets the video

Writing JSON-LD by hand

Nothing reminds you

This generator

Warns when both contentUrl and embedUrl are empty

Empty fields

Writing JSON-LD by hand

Placeholders left in by mistake

This generator

Fields you leave blank are left out

Syntax

Writing JSON-LD by hand

One missing comma or quote breaks the whole block

This generator

Valid JSON every time

How to use the Video Schema generator

  1. Enter video details

    Paste a YouTube link to autofill the thumbnail and embed URL, then add a title, description and upload date.

  2. Check required fields

    Google requires name, thumbnailUrl and uploadDate. Add a contentUrl or embedUrl too.

  3. Copy and validate

    Paste the script into the page’s <head> and test it with Google’s Rich Results Test.

VideoObject properties Google uses

Parameter
What it does
Example
name
Required. The video title. Use a different title for each video on your site.
"name": "How to fold a shirt"
thumbnailUrl
Required. One or more URLs of the video’s thumbnail image.
"thumbnailUrl": "https://example.com/thumb.jpg"
uploadDate
Required. When the video was first published, in ISO 8601. Add a time zone.
"uploadDate": "2026-03-31T08:00:00+08:00"
contentUrl
Recommended. The address of the video file itself. The most effective way for Google to fetch the video.
"contentUrl": "https://example.com/video.mp4"
embedUrl
Recommended. The address of the video player — the alternative when there’s no file URL.
"embedUrl": "https://www.youtube.com/embed/ID"
description
Recommended. What the video is about. Unique for each video; HTML tags are ignored.
"description": "…"
duration
Recommended. Length in ISO 8601.
"duration": "PT3M30S"
creator / author
Recommended. The person or organization that made the video, with a name and optionally a url.
"creator": {"@type": "Organization", "name": "…"}
expires
Recommended if the video will stop being available. Leave it out otherwise.
"expires": "2027-01-01T00:00:00+00:00"
interactionStatistic
Recommended. Counts such as views (WatchAction), likes, comments or shares.
"userInteractionCount": 12345
regionsAllowed / ineligibleRegion
Recommended if the video is limited to some countries. Use one of the two, with ISO 3166-1 country codes.
"regionsAllowed": ["US", "CA"]
hasPart (Clip)
Recommended. Marks key segments for key moments: each Clip needs name, startOffset and url.
"startOffset": 30
potentialAction (SeekToAction)
Tells Google how your page links to a moment in the video, so it can find key moments itself.
"target": "https://example.com/video?t={seek_to_second_number}"
publication (BroadcastEvent)
Recommended for live streams: makes the video eligible for the LIVE badge.
"isLiveBroadcast": true

name

What it does

Required. The video title. Use a different title for each video on your site.

Example

"name": "How to fold a shirt"

thumbnailUrl

What it does

Required. One or more URLs of the video’s thumbnail image.

Example

"thumbnailUrl": "https://example.com/thumb.jpg"

uploadDate

What it does

Required. When the video was first published, in ISO 8601. Add a time zone.

Example

"uploadDate": "2026-03-31T08:00:00+08:00"

contentUrl

What it does

Recommended. The address of the video file itself. The most effective way for Google to fetch the video.

Example

"contentUrl": "https://example.com/video.mp4"

embedUrl

What it does

Recommended. The address of the video player — the alternative when there’s no file URL.

Example

"embedUrl": "https://www.youtube.com/embed/ID"

description

What it does

Recommended. What the video is about. Unique for each video; HTML tags are ignored.

Example

"description": "…"

duration

What it does

Recommended. Length in ISO 8601.

Example

"duration": "PT3M30S"

creator / author

What it does

Recommended. The person or organization that made the video, with a name and optionally a url.

Example

"creator": {"@type": "Organization", "name": "…"}

expires

What it does

Recommended if the video will stop being available. Leave it out otherwise.

Example

"expires": "2027-01-01T00:00:00+00:00"

interactionStatistic

What it does

Recommended. Counts such as views (WatchAction), likes, comments or shares.

Example

"userInteractionCount": 12345

regionsAllowed / ineligibleRegion

What it does

Recommended if the video is limited to some countries. Use one of the two, with ISO 3166-1 country codes.

Example

"regionsAllowed": ["US", "CA"]

hasPart (Clip)

What it does

Recommended. Marks key segments for key moments: each Clip needs name, startOffset and url.

Example

"startOffset": 30

potentialAction (SeekToAction)

What it does

Tells Google how your page links to a moment in the video, so it can find key moments itself.

Example

"target": "https://example.com/video?t={seek_to_second_number}"

publication (BroadcastEvent)

What it does

Recommended for live streams: makes the video eligible for the LIVE badge.

Example

"isLiveBroadcast": true

Source: Google Search Central: Video structured data

Video 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; use embedUrl, 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. Each Clip has a name, a startOffset in seconds, an optional endOffset, and a url that 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.

Frequently asked questions

Official documentation

More free tools

Related guides

How to optimize & compress video for website

Use MP4 (H.264/AAC), keep resolution at 1080p or less, compress to a sensible bitrate, add a poster image and lazy-load videos below the fold. Stream long videos from YouTube, Vimeo or a video CDN.How to optimize & compress video for website

How to embed a video on a website

Upload the video to YouTube or Vimeo and paste its embed code, use the HTML5 video tag for files you host yourself, or use a video gallery widget when you need several videos. Here’s how each method works and when to use it.How to embed a video on a website