Skip to content
Issue docs

No VideoObject schema on a page with video

Importantvideoobject_schema_allIssue 98

What is this issue?

This issue reports a VideoObject schema block your page already declares that is missing a required property or carries an invalid date/duration — not a page with an embedded video and no VideoObject schema at all.

Checked once a page declares VideoObject schema:

  • name, description, thumbnailUrl and uploadDate are present
  • uploadDate, if present, is a valid ISO 8601 date
  • at least one of contentUrl or embedUrl is present
  • duration, if present, is a valid ISO 8601 duration

What this issue is not: it does not scan the page for <video> tags or video embeds. A page with an embedded YouTube or Vimeo player and no VideoObject JSON-LD is never reported.

Why it matters

VideoObject schema is important for video SEO and discoverability:

  • Google Video Search: Enables videos to appear in Google's dedicated Video Search
  • Video carousels: Videos with proper schema can appear in video carousels in search results
  • Rich results: Enables video thumbnail, duration, and upload date to appear in search results
  • Key moments: Adding Clip items enables chapter markers in Google Video results
  • AI search readiness: AI engines use VideoObject schema to understand and cite video content
  • User engagement: Video rich results have higher click-through rates

Resolving this issue improves your SEO health score by ensuring videos are properly structured for maximum visibility in search.

How to fix it

If this issue was raised, your page already declares a VideoObject missing a required property or value — open the finding for specifics. The steps below are for a page that declares none yet: worthwhile to add, and never reported as a defect while absent.

  1. Identify pages with video content: Look for pages with:

    • <video> tags
    • YouTube/Vimeo embeds (<iframe>)
    • Video player elements
  2. Add VideoObject JSON-LD structured data to the page's <head> or before </body>:

    {
      "@context": "https://schema.org",
      "@type": "VideoObject",
      "name": "How to Optimise Your Title Tags",
      "description": "A walkthrough of best practices for writing effective title tags for SEO.",
      "thumbnailUrl": "https://www.example.com/thumbnail.jpg",
      "uploadDate": "2024-03-01T08:00:00Z",
      "duration": "PT9M45S",
      "embedUrl": "https://www.youtube.com/embed/dQw4w9WgXcQ",
      "contentUrl": "https://www.example.com/videos/title-tags.mp4"
    }
  3. Include required properties:

    • name: Video title
    • description: Video description
    • thumbnailUrl: Video thumbnail image URL (required by Google)
    • uploadDate: ISO 8601 format (required by Google)
  4. Add recommended properties:

    • duration: In ISO 8601 format (PT9M45S = 9 min 45 sec)
    • contentUrl: For self-hosted videos
    • embedUrl: For YouTube/Vimeo embeds
    • hasPart: For key moments/chapters (Clip items)
  5. For long videos with chapters, add hasPart with Clip items:

    "hasPart": [
      { "@type": "Clip", "name": "Introduction", "startOffset": 0, "endOffset": 60, "url": "https://example.com/video?t=0" },
      { "@type": "Clip", "name": "Main Tutorial", "startOffset": 60, "endOffset": 540, "url": "https://example.com/video?t=60" }
    ]
  6. Validate with Google's Rich Results Test

Examples

Example 1: No Schema Declared — Not This Issue

<!-- Page with a video embed but no VideoObject schema -->
<html>
  <head>
    <title>SEO Tutorial Video</title>
  </head>
  <body>
    <h1>How to Optimise Title Tags</h1>
    <iframe src="https://www.youtube.com/embed/dQw4w9WgXcQ"></iframe>
    <p>Watch our tutorial on title tag optimization.</p>
  </body>
</html>

Nothing is reported. This check does not scan for <iframe> or <video> embeds.

Example 1b: The Same Page, With a Valid VideoObject (passes)

{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "How to Optimise Your Title Tags",
  "description": "A walkthrough of best practices for writing effective title tags for SEO.",
  "thumbnailUrl": "https://www.example.com/thumbnail.jpg",
  "uploadDate": "2024-03-01T08:00:00Z",
  "duration": "PT9M45S",
  "embedUrl": "https://www.youtube.com/embed/dQw4w9WgXcQ"
}

Example 2: Incomplete VideoObject Schema

Problematic state:

{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "SEO Tutorial"
}

Missing required properties: description, thumbnailUrl, uploadDate

Corrected state:

{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "How to Optimise Your Title Tags",
  "description": "A walkthrough of best practices for writing effective title tags for SEO.",
  "thumbnailUrl": "https://www.example.com/thumbnail.jpg",
  "uploadDate": "2024-03-01T08:00:00Z",
  "duration": "PT9M45S"
}

Example 3: Video with Chapters/Key Moments

Corrected state with hasPart:

{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "name": "Complete SEO Audit Guide",
  "description": "Learn how to perform a complete SEO audit for your website.",
  "thumbnailUrl": "https://www.example.com/audit-guide-thumb.jpg",
  "uploadDate": "2024-03-15T10:00:00Z",
  "duration": "PT15M30S",
  "hasPart": [
    {
      "@type": "Clip",
      "name": "Introduction",
      "startOffset": 0,
      "endOffset": 60,
      "url": "https://example.com/video?t=0"
    },
    {
      "@type": "Clip",
      "name": "Technical SEO Check",
      "startOffset": 60,
      "endOffset": 300,
      "url": "https://example.com/video?t=60"
    },
    {
      "@type": "Clip",
      "name": "Content Analysis",
      "startOffset": 300,
      "endOffset": 600,
      "url": "https://example.com/video?t=300"
    }
  ]
}

How PixyScan detects this

  1. Read the declared structured data: every JSON-LD block is parsed, and @graph wrappers are flattened.

  2. Select declared VideoObject entities: any schema block whose @type is VideoObject. A page that declares none is not examined — this check does not scan the HTML for <video> tags or YouTube/Vimeo <iframe> embeds.

  3. Check the required properties: name, description, thumbnailUrl and uploadDate must be present.

  4. Check the value rules, when present:

    • uploadDate — must be a valid ISO 8601 date
    • contentUrl or embedUrl — at least one must be present
    • duration — if present, must be a valid ISO 8601 duration (e.g. PT1M30S)
  5. This is reported when: the page declares a VideoObject missing a required property, or with an invalid uploadDate, duration, or neither contentUrl nor embedUrl. A page that embeds a video with no VideoObject schema at all is never reported.

What we store

Storage Level

Page Level — This issue is evaluated for each individual URL that contains structured data.


Database Table / Prisma Model

PageStructuredData


Stored Fields

Field Type Description
schemaType SchemaType The type of schema (e.g., Organization, Person)
schemaFormat SchemaFormat The format of the schema (JSON-LD, Microdata, RDFa)
schemaIdentifier String? Unique identifier for the schema
rawJson Json? The raw JSON-LD or structured data content
schemaErrors Json? Array of validation errors found in the schema
isValidSchema Boolean? Whether the schema is valid according to validation
missingFields Json? Reserved for future use — the crawler always writes null here today; no check currently populates it

Detection Dependencies

  • The following data sources are required to evaluate this issue:
  • HTML Document — The crawler parses the HTML to find structured data (JSON-LD, Microdata, RDFa)
  • Structured Data Validation — The extracted schema is validated against Schema.org definitions
  • Schema Parser — JSON-LD scripts, Microdata attributes, and RDFa markup are parsed

Further reading