Skip to content
GEO AI
AnalyzerCLIDocumentationSpecificationContact
Documentation

Getting Started

  • Introduction
  • Quick Start
  • Choose Your Package

GEO Specification

  • Overview
  • llms.txt
  • AI Metadata
  • Crawler Rules
  • Structured Signals
  • Scoring
  • Recommendations

Packages

  • GEO AI Core
  • GEO AI Next
  • GEO AI Woo
  • GEO AI Shopify

Analyzer

  • Overview
  • Scoring
  • Recommendations

CLI

  • GEO AI CLI

Integrations

  • NestJSsoon
  • Laravelsoon

Reference

  • Configuration
  • API Reference
  • FAQ
DocsSpecificationAi Metadata

AI Metadata Specification

The set of <head> tags that tell AI search engines what your page is about — four critical fields that determine your metadata score, plus nine supplemental fields that improve context and social sharing.

Critical fields

The Analyzer evaluates four tags as critical. All four must be present for a pass status. Missing any one of them produces a warn; missing all four produces a fail.

FieldSelectorCriticalityPurpose
Page titletitleCriticalPrimary label used by AI engines to identify and cite the page
Meta descriptionmeta[name="description"]CriticalPlain-text summary used in AI-generated answers and search snippets
OG titlemeta[property="og:title"]CriticalOpen Graph title — used by AI crawlers that parse OG data for page context
OG descriptionmeta[property="og:description"]CriticalOpen Graph description — reinforces the meta description for OG-aware crawlers

Why Open Graph tags are critical

Many AI crawlers parse Open Graph metadata in addition to standard HTML meta tags. A page with a <title> and meta[name="description"] but no OG equivalents will still receive a warn from the Analyzer.

Non-critical fields

The nine non-critical fields do not affect the CheckStatus result, but missing them is reported as low-severity issues. They improve how AI engines and social platforms represent your content.

FieldSelectorCriticalityPurpose
Canonical URLlink[rel="canonical"]Non-criticalPrevents duplicate-content issues by declaring the authoritative URL
Robots directivemeta[name="robots"]Non-criticalControls indexing and following behavior for all crawlers
OG URLmeta[property="og:url"]Non-criticalCanonical URL for Open Graph — used when the page is shared or cited
OG typemeta[property="og:type"]Non-criticalContent type hint (website, article, product) for OG-aware consumers
OG imagemeta[property="og:image"]Non-criticalPreview image used in social shares and AI-generated rich results
Twitter cardmeta[name="twitter:card"]Non-criticalCard format for Twitter/X previews (summary, summary_large_image, etc.)
Twitter titlemeta[name="twitter:title"]Non-criticalTitle override for Twitter/X card display
Twitter descriptionmeta[name="twitter:description"]Non-criticalDescription override for Twitter/X card display
Twitter imagemeta[name="twitter:image"]Non-criticalImage override for Twitter/X card display

Complete example

The following <head> block includes all thirteen fields — four critical and nine non-critical — populated with realistic values.

index.html
<head>
  <!-- Critical fields -->
  <title>Widget Pro — Professional-Grade Widgets</title>
  <meta name="description" content="Widget Pro is the fastest, most reliable widget for modern development teams. Free shipping on orders over $50." />
  <meta property="og:title" content="Widget Pro — Professional-Grade Widgets" />
  <meta property="og:description" content="Widget Pro is the fastest, most reliable widget for modern development teams. Free shipping on orders over $50." />

  <!-- Non-critical fields -->
  <link rel="canonical" href="https://example.com/products/widget-pro" />
  <meta name="robots" content="index, follow" />
  <meta property="og:url" content="https://example.com/products/widget-pro" />
  <meta property="og:type" content="product" />
  <meta property="og:image" content="https://example.com/images/widget-pro-og.jpg" />
  <meta name="twitter:card" content="summary_large_image" />
  <meta name="twitter:title" content="Widget Pro — Professional-Grade Widgets" />
  <meta name="twitter:description" content="The fastest, most reliable widget for modern development teams." />
  <meta name="twitter:image" content="https://example.com/images/widget-pro-twitter.jpg" />
</head>

Keep title and OG title in sync

The <title> and meta[property="og:title"] values do not need to be identical, but they should describe the same page. Significant divergence can confuse AI engines that compare both fields.

Analyzer checks

The checkMetadata function parses the homepage HTML using Cheerio and evaluates the presence of the four critical tags:

ConditionStatusRecommendation code
All four critical tags presentpass—
At least one critical tag present, but not all fourwarnCOMPLETE_CRITICAL_METADATA
All four critical tags absentfailADD_CRITICAL_METADATA
Empty or unparseable HTMLunknown—

Non-critical tag gaps are reported as low-severity issues and may trigger the IMPROVE_SUPPLEMENTAL_METADATA recommendation when the overall status is warn, but they do not change the CheckStatus value.

Common mistakes

  • Missing OG tags on pages that have a title and description. A page with <title> and meta[name="description"] but no meta[property="og:title"] or meta[property="og:description"] still returns warn. All four critical tags must be present.
  • Empty content attributes. A tag like <meta name="description" content=""> is present in the DOM but has no value. The Analyzer treats an empty content attribute as absent and counts it as a missing field.
  • Duplicate tags with conflicting values. Some CMS plugins inject a second <title> or meta[name="description"]. Cheerio selects the first occurrence; if the first tag is empty and the second has content, the Analyzer will still report the field as missing.
  • Metadata injected only by JavaScript. The Analyzer fetches raw HTML before any client-side rendering. Tags added by React, Vue, or other frameworks after hydration are not visible to the checker. Use server-side rendering or static generation to ensure tags are present in the initial HTML response.
  • No <head> element. If the HTML response has no <head> element — for example, a bare JSON response or a redirect page — the Analyzer returns unknown and cannot evaluate any metadata fields.
Previousllms.txtNextCrawler Rules

On this page

  • Critical fields
  • Non-critical fields
  • Complete example
  • Analyzer checks
  • Common mistakes
GEO AI

AI Search Optimization

AnalyzerCLIDocumentationSpecificationContact

© 2026 GEO AI · Open Source · GPL-2.0 License