Schema reference

Schema examples and supported types.

Working JSON-LD for the eight types that matter most for AI citation, the mistakes that quietly stop each one being read, and exactly what our audit detects, scores and can generate.

How schema support works

Schema support in our audit happens at three levels. It's important to distinguish them:

1. Detection, every schema.org type

The audit parses all JSON-LD on your pages: single objects, arrays, nested entities, and @graph knowledge-graph structures. Whatever types you use, mainstream or specialized. They're read and listed in your report.

2. Scoring: the five core families

Your Schema Markup score weights the five type families with the strongest AI-citation impact for most businesses (table below), plus datePublished/dateModified freshness. Scoring is deterministic, same input, same score, every time.

3. Fix code, any type your content calls for

Fix code is generated for your site's actual content, not from fixed templates, so it can produce any schema.org type, including specialized ones like Event, Course, Dataset, or HowTo when your pages warrant them.

Core types (scored)

Type familyWhy AI engines weight itScore weight
Organization / LocalBusinessTells AI who you are, name, logo, contact, social profiles. The anchor for brand entity recognition and disambiguation.25
ProductWhat you sell, price, availability. Required for AI shopping answers and product recommendations.20
Article / BlogPosting / NewsArticleMarks editorial content with authorship and dates, the freshness signals AI engines weight heavily.20
FAQPageQuestion-and-answer pairs in the exact shape AI assistants lift into responses. The highest citation-per-effort type.20
BreadcrumbListPage-trail context that helps AI understand your site structure and each page's place in it.15

Plus datePublished / dateModified anywhere in your JSON-LD: scored separately as content-freshness signals.

Working examples, with the parts that break

Eight types, each with JSON-LD you can paste and the errors that quietly stop it working. Structured data is how an assistant reads you as an entity rather than as prose it has to interpret. None of it guarantees a citation: markup makes a page legible, which is the precondition, not the outcome.

Jump to: Organization, LocalBusiness, Product, FAQPage, Article, BreadcrumbList, Service, SoftwareApplication

Organization schema

Who needs it: Every business, on the homepage. This is the one to add first if you add nothing else.

What it does for AI citation: It is how an assistant learns you are an entity rather than a string of words. Without it, a model has to infer who you are from prose, and it will happily confuse you with a similarly named company. The sameAs array is the part that does the disambiguating: it ties your site to profiles the model already has an entity for.

Paste this into a <script type="application/ld+json"> tag in your page head and replace the values. It is valid as written.

{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Example Co",
  "url": "https://example.com",
  "logo": "https://example.com/logo.png",
  "description": "One sentence saying what you do, in the words a buyer would use.",
  "foundingDate": "2019-04-01",
  "sameAs": [
    "https://www.linkedin.com/company/example-co",
    "https://x.com/exampleco",
    "https://www.crunchbase.com/organization/example-co"
  ],
  "contactPoint": {
    "@type": "ContactPoint",
    "contactType": "customer support",
    "email": "support@example.com"
  }
}

What actually goes wrong

  • Leaving sameAs out. It is the field that does the disambiguation work, and it is the one most often skipped because it looks decorative.
  • A logo URL that 404s or points at an SVG. Google's guidance wants a raster image it can fetch.
  • Putting Organization on every page instead of once on the homepage, then wondering why the entity looks fragmented.
  • Using the legal entity name when every customer knows you by a trading name. Use the name people search for, and put the legal one in legalName.

LocalBusiness schema

Who needs it: Anyone with a physical location or a defined service area.

What it does for AI citation: Assistants answering 'best X near me' need a machine-readable address, hours and geo. Prose on a contact page is not enough, and the hours in particular are asked for constantly and almost never marked up correctly.

Paste this into a <script type="application/ld+json"> tag in your page head and replace the values. It is valid as written.

{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": "Example Clinic",
  "url": "https://example.com",
  "telephone": "+1-555-0100",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "12 Example Street",
    "addressLocality": "Austin",
    "addressRegion": "TX",
    "postalCode": "78701",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 30.2672,
    "longitude": -97.7431
  },
  "openingHoursSpecification": [{
    "@type": "OpeningHoursSpecification",
    "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
    "opens": "09:00",
    "closes": "17:30"
  }]
}

What actually goes wrong

  • Using the generic LocalBusiness when a specific subtype exists. Dentist, Restaurant and LegalService all carry more meaning than the parent.
  • Opening hours written as a string like 'Mon-Fri 9-5:30'. It has to be openingHoursSpecification to be read.
  • An address that disagrees with your Google Business Profile. Conflicting signals are worse than one signal.
  • Latitude and longitude as strings rather than numbers.

Product schema

Who needs it: Ecommerce, and any SaaS with a discrete purchasable plan.

What it does for AI citation: Shopping questions are among the most common things people ask assistants, and an answer naming products needs price and availability it can trust. Unmarked prices force the model to scrape them out of prose, which it does unreliably and sometimes wrongly.

Paste this into a <script type="application/ld+json"> tag in your page head and replace the values. It is valid as written.

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Example Widget",
  "image": ["https://example.com/widget.jpg"],
  "description": "What it is and who it is for, in a sentence.",
  "sku": "EW-001",
  "brand": { "@type": "Brand", "name": "Example Co" },
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/widget",
    "priceCurrency": "USD",
    "price": "49.00",
    "availability": "https://schema.org/InStock"
  }
}

What actually goes wrong

  • A price that disagrees with the price rendered on the page. This is the single most common structured-data error and it is a trust problem, not a formatting one.
  • price as '$49' instead of '49.00' with priceCurrency separate. The symbol belongs in priceCurrency.
  • availability as the word 'In stock' rather than the schema.org URL.
  • Inventing aggregateRating for a product with no real reviews. Fabricated ratings are a manual-action risk and the reason Google tightened this in the first place.

FAQPage schema

Who needs it: Any page that genuinely answers a list of questions.

What it does for AI citation: It is the closest thing to handing an assistant a pre-formatted answer. A question-and-answer pair is exactly the shape a model wants to quote, which makes this the highest-leverage type per hour of work for AI citation specifically.

Paste this into a <script type="application/ld+json"> tag in your page head and replace the values. It is valid as written.

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [{
    "@type": "Question",
    "name": "How long does setup take?",
    "acceptedAnswer": {
      "@type": "Answer",
      "text": "About ten minutes. You add your domain, confirm the questions we suggest, and the first check runs immediately."
    }
  }]
}

What actually goes wrong

  • Marking up questions that do not appear visibly on the page. That is a guidelines violation, not a shortcut.
  • One-line answers. An answer too thin to stand alone is too thin to be quoted, which defeats the point.
  • Putting FAQPage on a page that is not an FAQ, in the hope of rich results.
  • HTML left unescaped inside the answer text, which breaks the JSON and silently kills the whole block.

Article and BlogPosting schema

Who needs it: Anything editorial: blog posts, guides, research, news.

What it does for AI citation: Freshness and authorship are two of the signals that decide whether an assistant will cite a page or pass over it. dateModified in particular is how a model tells a current answer from a stale one, and it is routinely wrong or absent.

Paste this into a <script type="application/ld+json"> tag in your page head and replace the values. It is valid as written.

{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "How assistants choose which sources to cite",
  "datePublished": "2026-08-01T09:00:00Z",
  "dateModified": "2026-08-20T14:30:00Z",
  "author": {
    "@type": "Person",
    "name": "Jane Example",
    "url": "https://example.com/about"
  },
  "publisher": {
    "@type": "Organization",
    "name": "Example Co",
    "logo": { "@type": "ImageObject", "url": "https://example.com/logo.png" }
  },
  "mainEntityOfPage": "https://example.com/blog/how-assistants-cite"
}

What actually goes wrong

  • dateModified bumped on every deploy. If it always says today, it carries no information and looks like manipulation.
  • author as a bare string instead of a Person with a url. The url is what lets the author be resolved to an entity.
  • headline that disagrees with the visible H1.
  • Missing dateModified entirely, which leaves an assistant to guess whether a two-year-old page is current.

Service schema

Who needs it: Agencies, consultancies, trades, and anyone selling work rather than a product.

What it does for AI citation: Service businesses are the ones assistants describe worst, because what they sell is only ever stated in prose. Marking up the service and its area makes you eligible for 'who does X in Y' answers that otherwise skip you entirely.

Paste this into a <script type="application/ld+json"> tag in your page head and replace the values. It is valid as written.

{
  "@context": "https://schema.org",
  "@type": "Service",
  "serviceType": "AI search visibility consulting",
  "provider": { "@type": "Organization", "name": "Example Co", "url": "https://example.com" },
  "areaServed": { "@type": "Country", "name": "United States" },
  "hasOfferCatalog": {
    "@type": "OfferCatalog",
    "name": "Services",
    "itemListElement": [{
      "@type": "Offer",
      "itemOffered": { "@type": "Service", "name": "AI visibility audit" }
    }]
  }
}

What actually goes wrong

  • serviceType written in internal language rather than the words a buyer would search.
  • No areaServed, which quietly removes you from every location-qualified question.
  • One Service block covering six unrelated services, when each deserves its own page and its own markup.

SoftwareApplication schema

Who needs it: SaaS products, apps, browser extensions and developer tools.

What it does for AI citation: 'What is the best tool for X' is one of the highest-intent questions anyone asks an assistant. This type is how you become a candidate answer rather than prose the model has to interpret, and it is where the category and price live.

Paste this into a <script type="application/ld+json"> tag in your page head and replace the values. It is valid as written.

{
  "@context": "https://schema.org",
  "@type": "SoftwareApplication",
  "name": "Example App",
  "applicationCategory": "BusinessApplication",
  "operatingSystem": "Web",
  "url": "https://example.com",
  "description": "What it does, in the words someone would use to ask for it.",
  "offers": {
    "@type": "Offer",
    "price": "49.00",
    "priceCurrency": "USD"
  }
}

What actually goes wrong

  • applicationCategory invented rather than taken from schema.org's list.
  • operatingSystem omitted on a web app. 'Web' is a valid and useful answer.
  • A price that has moved since the markup was written. Structured data is a second place prices live, and the stale copy outlives the correct one.
  • aggregateRating with no reviews behind it.

Extended types (detected & generatable)

These are detected on your pages and can be produced by the fix code when your content calls for them:

ServiceWebSiteWebPageHowToEventCourseDatasetRecipeJobPostingVideoObjectSoftwareApplicationReviewAggregateRatingPersonOfferContactPointImageObject

Using a type not listed here? It's still detected, detection covers the entire schema.org vocabulary, including nested @graph linked-entity structures.

An honest note on schema and citations

Structured data makes your site easy for AI systems to read and trust. It's necessary, but not sufficient. AI citations also depend on content quality, freshness, topical depth, and third-party authority. No markup guarantees a mention, and Google's own guidance says no special markup is required to appear in its AI features.

That is why schema is only part of what we score, and why every workspace also runs a live AI visibility check each week: we put real buyer questions to ChatGPT, Perplexity, Gemini, Claude and Google AI Overviews and record whether your site is actually named, rather than assuming markup equals mentions.

Before you write any markup

Check the assistants can reach your pages at all. Perfect schema on a page blocked in robots.txt does nothing.

Free AI crawler check

Common questions

What schema types does Greater Than Services support?

Detection covers every schema.org type: the audit parses all JSON-LD on your pages, including arrays, nested entities, and @graph knowledge-graph structures. Scoring weights the five families with the strongest AI-citation impact, Organization/LocalBusiness, Product, Article/BlogPosting/NewsArticle, FAQPage, and BreadcrumbList, plus datePublished/dateModified freshness signals. Fix code is generated for your specific site and can produce any schema.org type, including specialized ones like Event, Course, Dataset, HowTo, Recipe, JobPosting, VideoObject, and SoftwareApplication.

Does Greater Than Services support advanced schema types like Dataset, Event, or Course?

Yes. The audit detects any schema.org type present on your pages, including Dataset, Event, Course, and complex @graph linked structures. Because fix code is generated for your site's actual context rather than from fixed templates, it can produce specialized types when your content calls for them. Deterministic scoring focuses on the five core families because they carry the most AI-citation weight for the vast majority of businesses.

Does adding structured data guarantee AI citations?

No, and any tool that promises that is overselling. Structured data makes your site easy for AI systems to read and trust, which is necessary but not sufficient. AI citations also depend on content quality, freshness, topical depth, and third-party authority (reviews, mentions, citations from other sites). Google's own guidance says no special markup is required to appear in its AI features. That's why we score a page on the full set of signals rather than schema alone, re-read it every week, and measure actual AI visibility, whether the assistants name your site, instead of assuming markup equals mentions.

Related

See which schema types you're missing.

Tracked pages are re-read every week and scored on the signals assistants use. Every gap comes with the exact JSON-LD to paste in.

Open the preview