Skip to content
Instant · runs in your browser

Video Sitemap Generator With Thumbnail, Title and Player Tags

thumbnail, title, description and content_loc - one url entry per page.

Video sitemap generator output fails in one specific way, and it is worth naming up front: a <video:video> block missing a required child element invalidates that entry, and some validators reject the whole file. Most generators paper over this by emitting empty tags. This one refuses to, tells you exactly which input lines are short, and leaves the page's <loc> in place with a comment naming the gap so nothing disappears silently.

Paste one page per line with its video metadata, and you get a file that either validates or tells you precisely why it does not yet.

One link per line is all you need. To set a date or priority for a specific page, add it after a vertical bar on that line - we work out which is which, so the order does not matter.

Resolves relative lines like /pricing and gives the sitemap index absolute file URLs.

Do not stamp today's date on every page. Google stops trusting a sitemap that claims the whole site changed this morning.

Dominate AI Search Using a Proven System

BlazeHive runs the whole system for you - finds the keywords buyers actually search, writes the pages end to end, and publishes them so you show up in Google and in AI answers. Free trial, no card.

Start with BlazeHive Free trial

The 4 things Google requires per video

For every video you list, 4 pieces of information are mandatory:

  • <video:thumbnail_loc>: a crawlable image URL for the thumbnail.
  • <video:title>: should match the visible title on the page.
  • <video:description>: up to 2,048 characters. Longer descriptions are truncated at that limit.
  • One of <video:content_loc> or <video:player_loc>: the raw media file, or the embeddable player URL. Supply either; supply both if you have both.

Here is a complete entry:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
  <url>
    <loc>https://www.example.com/watch/demo</loc>
    <video:video>
      <video:thumbnail_loc>https://cdn.example.com/thumb.jpg</video:thumbnail_loc>
      <video:title>Product demo</video:title>
      <video:description>A 90-second walkthrough of the editor.</video:description>
      <video:content_loc>https://cdn.example.com/demo.mp4</video:content_loc>
    </video:video>
  </url>
</urlset>

Everything else in the video extension is optional: duration, publication date, view count, family-friendly flags, restrictions. Optional tags are only worth adding when the value is accurate. A <video:duration> that disagrees with the file is worse than no duration at all, which is why this tool emits the required set cleanly and stays out of the rest.

Columns are recognized by their shape

The documented order is page url | Title | thumbnail | Description | video file, but you do not have to honor it. Each column after the first is classified by what it looks like:

  • A URL ending in an image extension (.jpg, .png, .webp, .avif, .svg and friends) becomes thumbnail_loc.
  • A URL ending in a video extension (.mp4, .mov, .webm, .m3u8 and friends) becomes content_loc.
  • Any other URL becomes player_loc. That is what an embed URL looks like, since embed endpoints rarely carry a file extension.
  • The first plain text column becomes the title, the second becomes the description.

So all of these produce the same entry:

https://www.example.com/watch/demo | Product demo | https://cdn.example.com/thumb.jpg | A 90-second walkthrough | https://cdn.example.com/demo.mp4
https://www.example.com/watch/demo | https://cdn.example.com/thumb.jpg | Product demo | https://cdn.example.com/demo.mp4 | A 90-second walkthrough

Tabs behave like pipes, so a spreadsheet or CSV export pastes in as is. Relative media paths resolve against the Base URL, or against the page's own origin when no base is set. If you only supply a title and no description, the title is reused as the description, which is a stopgap, not a good description.

One url entry per page, not per video

This is the structural mistake that costs the most. A <url> element identifies a page, and the <loc> is the page a viewer watches the video on. If one page hosts 3 videos, you write one <url> with 3 <video:video> blocks nested under it, not 3 <url> entries with the same <loc>.

Repeating a <loc> is a duplicate-URL validation error, and this tool removes duplicate lines before generating anything, so a per-video paste quietly loses videos. Build multi-video pages by nesting the blocks yourself after export, or list one representative video per page and let the page markup carry the rest.

The corollary matters too: never point <loc> at the raw .mp4. The video file is not the landing page. <loc> is where a person lands, content_loc is what plays.

What happens when a required field is missing

Rather than emitting <video:thumbnail_loc></video:thumbnail_loc>, which invalidates the entry, incomplete lines come out like this:

  <url>
    <loc>https://www.example.com/watch/onboarding</loc>
    <!-- fill in before publishing: missing thumbnail_loc, content_loc or player_loc -->
  </url>

The file stays parseable, the URL is not dropped, and the fix is visible in place. Above the output, the tool lists the input line numbers of every incomplete entry so you can go back to the source rather than hunting through XML. Fill the gaps and regenerate, or delete those <url> blocks before you publish. Do not ship the comments.

The fields on this page

  • URLs takes one page per line, plus the metadata columns described above. Lines starting with # are ignored, duplicate URLs are dropped, and unparseable lines are listed back with a reason.
  • Sitemap type is preset to video. The same engine also produces standard XML, image, news, HTML, WordPress and visual output.
  • Base URL resolves relative lines and supplies absolute locations for the sitemap index when the file has to split. Set it if you paste paths rather than full URLs.
  • Last modified governs <lastmod> on the page entry. changefreq and priority are not emitted here at all, since Google ignores them.

The usual sitemap limits still apply: 50,000 URLs and 50 MB uncompressed per file, whichever comes first. Video entries are verbose, so the byte limit is the one you are likely to meet. The tool packs against both and generates a sitemap_index.xml when it splits.

Before you publish

3 checks that catch most of the failures that survive validation:

  • The media must be fetchable. If robots.txt blocks your CDN path or your video directory, none of it gets processed. This is the single most common reason a valid video sitemap yields nothing.
  • The video should be visible on the page. A video sitemap describes what a visitor sees. Entries pointing at pages where the player is hidden behind a tab, a login, or a lazy-loaded script that never runs for a crawler will not earn video results.
  • Add the file to robots.txt and submit it in Search Console. Google retired the sitemap ping endpoint in 2023, so those are the 2 discovery paths that still work.

Keep the video sitemap alongside your standard sitemap rather than instead of it. BlazeHive automates SEO content end to end, but the media metadata has to come from whatever system actually stores your videos.

Dominate AI Search Using a Proven System

BlazeHive runs the whole system for you - finds the keywords buyers actually search, writes the pages end to end, and publishes them so you show up in Google and in AI answers. Free trial, no card.

Start with BlazeHive Free trial

Frequently Asked Questions

Do I need a video sitemap if I already have VideoObject schema?

Not strictly. On-page structured data and a video sitemap carry overlapping information, and Google accepts either. A sitemap helps when videos are added faster than pages get recrawled, or when the player is injected client side and the markup is hard for a crawler to see.

Can I list YouTube-hosted videos?

Yes, using player_loc with the embed URL, on the page where the video is embedded. You cannot claim video results for a video that only exists on someone else's site with no embed on yours.

What if one page has 10 videos?

One <url> with 10 nested <video:video> blocks. Do not repeat the <loc>.

Does the thumbnail have to be a specific size?

There is no hard requirement in the sitemap format, but a thumbnail too small to render usefully will not be used. Aim for at least 160x90 and prefer the largest still you have, in a common format, on a crawlable path.

Why is my description the same as my title?

Because only one text column was supplied. The generator reuses the title so the entry stays valid. Add a real description as a second text column.

Should I include duration, upload date and view count?

Only if the values are accurate and kept current. Optional tags that drift out of date are a liability. The required 4, correct and crawlable, do the real work.

Related free tools

All tools →