← Back to blog
AEOScanaris Team · 5 min read · October 04, 2026

Structured data (schema.org): why AI cites some sites and not others

What structured data is

A machine reading your site sees text, but does not always understand what each thing is. Structured data puts labels on it: this is a product, this is its price, this is a frequently asked question, this is the author. The standard vocabulary is called schema.org and both search engines and AI models use it. This guide explains why it helps you get cited, which types to put on each page with complete examples, the mistakes that cost you credibility and how to check it is right.

JSON-LD, the easy way

There are several ways to write schema, but the recommended one is JSON-LD: a script block in JSON format that you place in the head or body of the page. It changes nothing the user sees and stays separate from the visible HTML, so it is easy to generate and review. If you use Cursor, Bolt or Lovable, asking your AI to generate the JSON-LD for a specific page is a one-prompt job. The alternative, microdata embedded in the HTML tags, works the same but is harder to maintain.

Why it helps you get cited

When a model has to summarize your page, schema reduces ambiguity. Instead of inferring that a number is a price, it knows. Instead of guessing who wrote the article, it reads it. Instead of deducing that "Scanaris" is a company and not a person, it has it declared. Less guessing means more trust, and more trust means a higher chance of being used as a source. Schema also connects your site to the rest of the internet: the sameAs field links to your profiles and the model understands that everything refers to the same entity.

Which types to add and with which properties

  • Organization on the home page: name, logo, URL, one-sentence description and sameAs with your public profiles.
  • SoftwareApplication (or Product) on the product or pricing page: name, description, category, operating system or platform, and offers with price and currency.
  • FAQPage where there are real, visible questions and answers.
  • Article or BlogPosting on posts, with author, publication date and modification date.
  • BreadcrumbList to give context on where each page fits.
  • WebSite on the home page, with the site name, which helps it appear correctly in results.

Do not add them all just because. Mark up only what is genuinely on the page.

A complete example for an app

This is what the home page block of a software product looks like, with the organization and the application in one graph:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://yourdomain.com/#org",
      "name": "Your Product",
      "url": "https://yourdomain.com",
      "logo": "https://yourdomain.com/logo.png",
      "description": "Your Product is a [what it is] for [whom] that [what it achieves].",
      "sameAs": [
        "https://github.com/yourproduct",
        "https://www.linkedin.com/company/yourproduct",
        "https://x.com/yourproduct"
      ]
    },
    {
      "@type": "SoftwareApplication",
      "name": "Your Product",
      "applicationCategory": "DeveloperApplication",
      "operatingSystem": "Web",
      "url": "https://yourdomain.com",
      "description": "Your Product is a [what it is] for [whom] that [what it achieves].",
      "publisher": { "@id": "https://yourdomain.com/#org" },
      "offers": {
        "@type": "Offer",
        "price": "24",
        "priceCurrency": "EUR",
        "url": "https://yourdomain.com/pricing"
      }
    }
  ]
}
</script>

Notice that the description is the same sentence in both blocks, and it should be the same one that appears on the home page, in the meta description and in llms.txt. That exact repetition is what models end up quoting.

And one for frequently asked questions

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Does Your Product modify my site?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No. It runs read-only checks on public information."
      }
    }
  ]
}
</script>

Every question in the JSON must exist, with the same text, in the visible part of the page.

The most common mistakes

  • Marking up what is not visible. FAQs that do not appear on the page, invented reviews, a price in the JSON different from the one on the page. It costs credibility and can earn you a manual action from Google.
  • Stale data. You change the price on the page and forget the schema. Generate the JSON-LD from the same data source as the page, not by hand.
  • Inconsistent name. "Your Product" on the home page, "YourProduct" in the schema, "your-product" on the profiles. Pick one spelling and use it everywhere.
  • Wrong type. A physical Product for a web service, or an Article on a pricing page.
  • Invalid JSON. One extra comma and the whole block is silently ignored.

Where to put it depending on your framework

In Next.js, a script element with type="application/ld+json" in the layout or the page, with the JSON serialized from an object. In Nuxt, with useHead and a script of the same type. In a Vite SPA, in index.html if the block is static, or injected during prerendering if it varies per page. What matters is that it arrives in the initial HTML: a JSON-LD that only exists after running JavaScript is not read by bots that do not render.

How to check it is right

Request your page with curl and look for the block:

curl -s https://yourdomain.com/ | grep -o 'application/ld+json' | wc -l

If it says zero, it does not arrive in the HTML. Then validate the content with Google's rich results test or the schema.org validator, which flag syntax errors and unknown properties. And read it yourself: does it say the same as the page? If not, one of the two is lying.

Scanaris reviews your schema

The AI visibility pillar of Scanaris detects whether you have structured data, of what type, whether it arrives in the HTML without JavaScript and whether it makes sense for the page, and gives you a fix prompt with the suggested JSON-LD to paste into your AI. It is a read-only check on your site's public HTML. It is part of the AEO guide and of the review of SEO and AEO on the same page.

Frequently asked questions

Does Google penalize incorrect schema?

Schema with syntax errors is simply ignored. Misleading schema (marking up reviews or questions that do not exist) can receive a manual action that removes your rich results. Mark up only what is visible.

JSON-LD or microdata?

JSON-LD. It is what Google and schema.org recommend, it is generated from data without touching the visible HTML and it is much easier to maintain.

Is it needed on every page?

On the public ones you want understood: home, product, pricing, blog, FAQ. The private dashboard does not need it because nobody external reads it.

How does your site do?

Run Scanaris and check it in 30 seconds, free.

Scan my site

Related checks