Video Sitemap Generator for Video Rich Results
A video sitting on a page can stay invisible to search unless the page tells Google what the clip is. A video sitemap carries that description: one url entry per page, with a video:video block holding the thumbnail, title, description, duration, and upload date for each clip. This page builds that file from rows you paste, one video per line, and hands back XML in the format Google reads.
The rows stay in this tab the whole time. Durations typed as 2:30 or PT1M30S come out as the same ISO values, rows sharing a page URL are grouped into one entry, and anything that fails a check is listed by row number. Leave the sample rows in place to see the shape of the output, or clear the box and paste your own list.
Build a Video Sitemap From Page Rows
One video per line, header first. Publication date and content URL may be left blank.
How It Works
The box is read as comma-separated rows, one video per line. The header line is skipped, blank lines are ignored, and each remaining line is checked column by column before any XML is written. Rows that share a page URL are then collected together, so the grouping does not depend on the order you paste in.
- Paste one video per line. The header page,thumbnail,title,description,duration,publication_date,content_url goes first, followed by one row per video. Rows for the same page URL can sit anywhere in the list.
- Complete the required fields on every row. Page, thumbnail, title, description, and duration all have to be present; a row missing one of them is skipped and listed by number. Durations can be typed as 2:30, 1:12:05, or PT1H30M and come out as ISO values in the file.
- Set the URL tags, then press Build video sitemap. Last modified, changefreq, and priority apply to every page entry in the file, and all three can stay empty; the priority box starts at 0.8.
- Copy or download the finished file. The XML lands in the output box, the summary counts video entries against page URLs, and the download button saves video-sitemap.xml. Warnings about missing dates, long titles, and mixed content styles are listed with a Note: prefix.
Before and After
page,thumbnail,title,description,duration,publication_date,content_url
https://example.com/videos/tea-brewing/,https://cdn.example.com/thumbs/tea-brewing.jpg,How to Brew Loose Leaf Tea,Water temperature and steeping times for four common teas,2:30,2026-03-12,https://cdn.example.com/videos/tea-brewing.mp4
https://example.com/videos/tea-brewing/,https://cdn.example.com/thumbs/tea-storage.jpg,Storing Tea After Opening,Where to keep an opened pouch so the leaf stays dry,PT1M30S,,
https://example.com/videos/garden-tour/,https://cdn.example.com/thumbs/garden-tour.jpg,Spring Garden Tour 2026,A walk through the raised beds after the first planting week,21:05,2026-04-02, <?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://example.com/videos/tea-brewing/</loc>
<priority>0.8</priority>
<video:video>
<video:thumbnail_loc>https://cdn.example.com/thumbs/tea-brewing.jpg</video:thumbnail_loc>
<video:title>How to Brew Loose Leaf Tea</video:title>
<video:description>Water temperature and steeping times for four common teas</video:description>
<video:content_loc>https://cdn.example.com/videos/tea-brewing.mp4</video:content_loc>
<video:publication_date>2026-03-12</video:publication_date>
<video:duration>PT2M30S</video:duration>
<video:family_friendly>yes</video:family_friendly>
</video:video>
<video:video>
<video:thumbnail_loc>https://cdn.example.com/thumbs/tea-storage.jpg</video:thumbnail_loc>
<video:title>Storing Tea After Opening</video:title>
<video:description>Where to keep an opened pouch so the leaf stays dry</video:description>
<video:player_loc>https://example.com/videos/tea-brewing/</video:player_loc>
<video:duration>PT1M30S</video:duration>
<video:family_friendly>yes</video:family_friendly>
</video:video>
</url>
<url>
<loc>https://example.com/videos/garden-tour/</loc>
<priority>0.8</priority>
<video:video>
<video:thumbnail_loc>https://cdn.example.com/thumbs/garden-tour.jpg</video:thumbnail_loc>
<video:title>Spring Garden Tour 2026</video:title>
<video:description>A walk through the raised beds after the first planting week</video:description>
<video:player_loc>https://example.com/videos/garden-tour/</video:player_loc>
<video:publication_date>2026-04-02</video:publication_date>
<video:duration>PT21M5S</video:duration>
<video:family_friendly>yes</video:family_friendly>
</video:video>
</url>
</urlset> Use Cases
| Developer | Production | Workflow |
|---|---|---|
| Course pages with one lesson clip each | A channel page holding three uploads | Press kits shipped with video markup |
| Two video rows grouped under one page | Publication date on every upload | Thumbnails hosted on the CDN |
| Durations normalized to the ISO form | Row numbers checked after each build | File downloaded as video-sitemap.xml |
| Blank content URL falls back to player_loc | Warning counts read before submission | XML never leaves the laptop |
Common Mistakes
- Leaving publication_date blank on new uploads. The build goes through, but a Note: warning counts the videos without a date, and Google uses that field when it judges recency.
- Mixing filled and blank content_url columns down the file. Half the videos then point at the file and half at the player page, and the tool lists the split as a warning.
- Typing durations like 90s or 1h30m. Only MM:SS, H:MM:SS, and PT-style values pass the check, and anything else is reported on its row along with the accepted forms.
- Dropping the description column to save space. Description is required on every row; a video row without one is skipped and the row number is listed under the box.
Best Practices
- Put the concrete subject in the title and the details in the description: what the video shows and what a viewer gets from it. Google reads both strings when it builds the search snippet.
- Fill publication_date for every video with a real upload date. The tool counts missing dates after each build, so the notes under the output say what to fix.
- Pick content_url or player_loc once per site and keep the column consistent down the file, so every video in the sitemap points at the same kind of target.
- Work through the counts in the warning notes before submitting. Long titles and oversized descriptions get truncated or dropped by Google, and a second crawl over a corrected file costs time.
Frequently Asked Questions
What does Google ask for in a video sitemap?
Google looks for a page URL, a thumbnail image, a title, a description, the upload date, and the duration of the clip. This tool requires page, thumbnail, title, description, and duration on every row, and it writes the publication date whenever that column is filled. With those fields present, the video can qualify for a search result that shows its thumbnail.
Which duration formats are accepted?
The duration column takes MM:SS like 2:30, H:MM:SS like 1:12:05, and the ISO form PT1H30M. All three are normalized to the ISO shape in the output, so 2:30 and PT2M30S end up as the same video:duration tag. A blank duration, a zero value, or something like 90s is reported on that row and the row is skipped.
What do publication_date and content_url control?
Publication date becomes video:publication_date, and this tool treats it as optional, though Google leans on the upload date when it judges how recent a video is. Content URL becomes video:content_loc and points at the video file itself; leave the column blank and the tool writes video:player_loc with the page URL instead. Both columns accept blank values on rows where they do not apply.
How does grouping by page work?
Rows that share a page URL are collected under one url entry, and each row becomes its own video:video block inside it. The page URL is written once, the videos keep the order they had in the box, and each new page starts its own url entry in the order it first appears.
Should a row use content_url or player_loc?
content_url points at the file a crawler can fetch directly, while player_loc points at the page where the player lives. This tool emits content_loc whenever a row has a content URL and falls back to player_loc when the column is empty. A mix of both styles in one file draws a warning, since one style per site keeps the output predictable.
What are the size limits and warning caps?
The sitemaps.org protocol stops one file at 50,000 URLs and 50 megabytes uncompressed, and this tool warns once a build passes 1,000 page URLs. It also counts titles over 100 characters, descriptions past 2,048 characters, and rows with no publication date. Every count is listed under the output so it can be fixed before submission.
Do my rows leave the browser?
No. Parsing, duration normalization, and XML assembly all run in this tab, and the file you download is built from a local blob URL. The rows are not sent anywhere, and reloading the page clears the box.