Table of contents
Video is the content format that AI search is prioritizing more than ever. Perplexity cites video in its answers, ChatGPT with search links to YouTube, and Google AI Overviews embeds video clips. But for AI to "see" and "understand" your video — you need VideoObject schema.
This is the complete guide to declaring VideoObject schema correctly, from basic fields to advanced Key Moments.
Why VideoObject Schema Matters for AEO
When AI reads your web page, it sees two types of information about video:
| Without Schema | With VideoObject Schema | |
|---|---|---|
| AI recognizes video | Must guess from HTML | Clear and precise |
| Video title | Taken from h1 or title tag | From name — exact |
| Duration | Unknown | ISO 8601 duration |
| Upload date | Uncertain | uploadDate — confirmed |
| Video content | Guessed from surrounding text | description — complete |
| Key moments | None | Clips with timestamps |
| Google rich results | Unlikely | Qualifies for Video Carousel |
VideoObject schema is not just good for SEO — it is the language that allows AI to parse video content in a structured way.
All VideoObject Fields — Priority Levels
| Field | Type | Priority | Notes |
|---|---|---|---|
name | Text | Required | Video title |
description | Text | Required | 150–300 words, describes content |
thumbnailUrl | URL | Required | 1280x720 or larger, JPG/PNG |
uploadDate | Date (ISO 8601) | Required | YYYY-MM-DD |
duration | Duration (ISO 8601) | Required | PT5M30S |
contentUrl | URL | Very high | Direct URL to video file |
embedUrl | URL | Very high | Iframe embed URL |
author | Person/Organization | High | Who created the video |
publisher | Organization | High | Who published it |
dateModified | Date | High | Most recent update date |
inLanguage | Language | Medium | vi, en, zh |
regionsAllowed | Text | When needed | If region-restricted |
hasPart | Clip[] | Advanced | Key moments/chapters |
interactionStatistic | InteractionCounter | Low | View count |
keywords | Text | Low | Related keywords |
Complete VideoObject JSON-LD
{
"@context": "https://schema.org",
"@type": "VideoObject",
"@id": "https://example.vn/blog/aeo-la-gi#video",
"name": "AEO là gì? Tối ưu cho AI Search trong 10 phút",
"description": "Video hướng dẫn đầy đủ về Answer Engine Optimization (AEO): định nghĩa, tại sao quan trọng với doanh nghiệp Việt Nam năm 2026, và 3 bước đầu tiên để bắt đầu tối ưu cho ChatGPT, Perplexity và Google AI Overviews.",
"thumbnailUrl": "https://example.vn/images/aeo-la-gi-thumb.jpg",
"uploadDate": "2026-08-10",
"duration": "PT10M45S",
"contentUrl": "https://example.vn/videos/aeo-la-gi.mp4",
"embedUrl": "https://www.youtube.com/embed/dQw4w9WgXcQ",
"author": {
"@type": "Person",
"@id": "https://example.vn/tac-gia/tran-minh-duc",
"name": "Trần Minh Đức"
},
"publisher": {
"@type": "Organization",
"@id": "https://example.vn",
"name": "AEO Saigon",
"logo": {
"@type": "ImageObject",
"url": "https://example.vn/icon.svg"
}
},
"dateModified": "2026-08-10",
"inLanguage": "vi",
"hasPart": [
{
"@type": "Clip",
"name": "AEO là gì?",
"startOffset": 0,
"endOffset": 90,
"url": "https://www.youtube.com/embed/dQw4w9WgXcQ?start=0"
},
{
"@type": "Clip",
"name": "Tại sao AI search quan trọng năm 2026",
"startOffset": 91,
"endOffset": 240,
"url": "https://www.youtube.com/embed/dQw4w9WgXcQ?start=91"
},
{
"@type": "Clip",
"name": "3 bước tối ưu AEO đầu tiên",
"startOffset": 241,
"endOffset": 480,
"url": "https://www.youtube.com/embed/dQw4w9WgXcQ?start=241"
},
{
"@type": "Clip",
"name": "Công cụ đo lường AI visibility",
"startOffset": 481,
"endOffset": 645,
"url": "https://www.youtube.com/embed/dQw4w9WgXcQ?start=481"
}
],
"interactionStatistic": {
"@type": "InteractionCounter",
"interactionType": "https://schema.org/WatchAction",
"userInteractionCount": 1500
}
}
ISO 8601 Format for Duration
This is the field most commonly declared incorrectly:
| Actual Duration | Correct Format | Common Mistake |
|---|---|---|
| 30 seconds | PT30S | P0DT0H0M30S |
| 5 minutes | PT5M | PT5M0S (not wrong, but redundant) |
| 5 minutes 30 seconds | PT5M30S | PT5:30 |
| 1 hour | PT1H | PT60M |
| 1 hour 15 minutes | PT1H15M | PT75M |
| 2 hours 3 minutes 45 seconds | PT2H3M45S | P2H3M45S (missing T) |
Rule: P starts it, T separates days from hours/minutes/seconds. If there are no days — use PT followed by hours (H), minutes (M), and seconds (S).
Thumbnail Optimization for Video Rich Results
Google has stricter thumbnail requirements than you might expect:
Minimum dimensions:
- Recommended: 1280×720 (16:9)
- Minimum: 640×360
- Other ratios (4:3, 1:1) are accepted but will be cropped
Thumbnail content:
- Must be an actual frame from the video (not a promotional banner)
- Text overlays must not cover more than 30% of the image area
- Must match the video content — Google checks this
- Avoid clickbait thumbnails (fake surprised faces, random arrows)
Technical requirements:
- Host the image on the same domain as the website (avoid third-party CDN when possible)
- Stable URL — do not change the thumbnail URL after indexing
- Declare
widthandheightin ImageObject if using an object instead of a URL string
Implementation in Next.js App Router
// app/[lang]/blog/[slug]/page.tsx
import { type VideoObject, type WithContext } from "schema-dts";
function generateVideoSchema(video: VideoData): WithContext<VideoObject> {
return {
"@context": "https://schema.org",
"@type": "VideoObject",
"@id": `${siteUrl}/blog/${video.slug}#video`,
name: video.title,
description: video.description,
thumbnailUrl: video.thumbnailUrl,
uploadDate: video.uploadDate,
duration: video.duration, // ISO 8601
embedUrl: video.youtubeEmbedUrl,
author: {
"@type": "Person",
"@id": `${siteUrl}/tac-gia/${video.authorSlug}`,
name: video.authorName,
},
publisher: {
"@type": "Organization",
"@id": siteUrl,
name: "AEO Saigon",
},
dateModified: video.dateModified,
inLanguage: lang,
...(video.clips && {
hasPart: video.clips.map((clip) => ({
"@type": "Clip" as const,
name: clip.name,
startOffset: clip.start,
endOffset: clip.end,
url: `${video.youtubeEmbedUrl}?start=${clip.start}`,
})),
}),
};
}
Testing VideoObject Schema
Required tools:
-
Rich Results Test — checks whether the video qualifies for rich results, shows specific errors and warnings
-
Schema Markup Validator — validates JSON-LD syntax, detects format errors
-
Google Search Console — the "Video" section under Enhancement reports, shows which videos have been indexed and any issues
Common errors:
| Error | Cause | Fix |
|---|---|---|
| "Thumbnail not accessible" | Thumbnail URL blocked by robots.txt or requires authentication | Allow Googlebot to crawl the thumbnail |
| "Duration format invalid" | Incorrect ISO 8601 format | Check against the table above |
| "Upload date in future" | uploadDate timezone error | Use UTC or specify timezone explicitly |
| "Video not prominent" | Video is too small or placed at the bottom of the page | Place video in the first viewport |
| "Thumbnail doesn't match video" | Thumbnail is unrelated to content | Use an actual frame from the video |
Video on Landing Pages vs Blog Posts
VideoObject schema works best when:
Landing page (one main video):
- Video explaining a product/service → standalone VideoObject
- Combine with Product or Service schema via
subjectOf - Thumbnail = most impactful frame, not a logo
Blog post with attached video:
- Article = Article schema, video = VideoObject schema
- Link via: Article
video→ VideoObject - Video should complement the article, not just be an embedded YouTube for show
FAQ page with video answers:
- FAQPage schema + VideoObject in each Answer
- This is a format AI search particularly favors — question + video answer
The clearer the video's structure (chapters, timestamps, transcript), the easier it is for AI to cite and display it. VideoObject schema is the first step — after that, it comes down to the actual quality of the content in the video.
Frequently asked questions
Is VideoObject schema required for video to appear on Google?
Not required — Google can detect video without schema. But VideoObject schema significantly increases the chance of appearing in Video rich results (thumbnail + title + duration right on the results page), and is a requirement to qualify for Video Carousel. For AI search: Perplexity and ChatGPT prioritize citing videos with schema because they are easier to parse.
Do YouTube videos need VideoObject schema?
YouTube automatically declares VideoObject schema for your videos — you don't need to and can't add schema to YouTube pages. But if you embed a YouTube video on your own website, you SHOULD add VideoObject schema to that page. This helps Google and AI understand that your website is the primary source of information about that video.
Which fields in VideoObject schema are most important?
In priority order: (1) name — exact title; (2) thumbnailUrl — high-quality thumbnail (at least 1280x720); (3) uploadDate — upload date in ISO 8601; (4) description — 150–300 word description; (5) duration — in ISO 8601 format (PT5M30S = 5 minutes 30 seconds). Missing any of these 5 fields may prevent the video from qualifying for Video rich results.
What are Clip schema and SeekToAction, and are they necessary?
Clip schema and SeekToAction allow Google to display 'Key moments' (important timestamps) in the video right on the results page — users can jump directly to the section they need. This is an advanced feature, not required, but very effective for videos over 5 minutes. Key moments significantly increase CTR (especially on mobile) and help AI understand the structural content of the video.
How should schema be declared for a page with multiple videos?
If the page has one main video — place VideoObject in an ItemList or standalone. If the page is a gallery of multiple videos — use an ItemList containing multiple VideoObjects. Note: Google typically only indexes videos that appear prominently on the page, not small embedded videos at the bottom. Ensure the main video is visible in the first viewport.
AEO Saigon
An Answer Engine Optimization agency in Ho Chi Minh City — helping business websites get cited by AI. About AEO Saigon →
Want your website to be cited by AI like this?
Free Audit