Fixing Hallucinated Properties in AI-Generated Schema
A language model asked to write structured data wants to hand back something complete. When the page does not say who wrote it, how many stars it has or what the phone number is, the model can quietly supply a believable answer instead of leaving the field out.
Those invented values pass every validator, because they are perfectly formed, and they are the most serious mistake generated markup can contain. This guide shows how to spot them, how to trace every value in a generated block back to a real source, and how to stop them reappearing on the next batch of pages.
What a hallucinated property looks like
In AI writing generally, a hallucination is a confident statement with nothing behind it. In generated JSON-LD it has a narrower meaning: a property whose value does not appear on the page and does not come from any system you control. The property name is real, the format is correct, and the value is simply made up.
Here is a typical case. A small bakery has a page about its sourdough class. The page gives the title, a description, the price and the Saturday date, and nothing else. The generated markup came back looking like this:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Course",
"name": "Beginners' sourdough class",
"description": "A three-hour hands-on class covering starters, shaping and baking.",
"provider": {
"@type": "Organization",
"name": "Crumb and Crust Bakery",
"telephone": "+44 1632 960123",
"sameAs": ["https://www.facebook.com/crumbandcrustbakery"]
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "127"
},
"instructor": { "@type": "Person", "name": "Hattie Brindlecombe" }
}
</script>
Only the name and description were on the page. The phone number, the Facebook address, the 4.8 rating from 127 reviews and the instructor were all produced by the model because Course and Organization blocks in its training examples usually have them. Every one of them validates. None of them is true, or at least nobody has checked whether it is.
Why the model does this
- Pattern completion. The model predicts what a complete block of this type normally contains. An empty slot where a rating usually sits looks like a mistake to it, so it fills the slot.
- Prompt pressure. Instructions such as "generate complete schema" or "include all recommended properties" push the model to produce a value for every field, whether or not the page supports it.
- Nearby text. A testimonial quote becomes a Review with an invented reviewer name; "hundreds of happy customers" becomes a review count; a town name in the footer becomes a full street address.
- Training memory. For a business the model has seen before, it may recall an old phone number, a former address or a profile that has since been deleted.
Why invented values matter more than broken ones
A syntax error or a missing required field is annoying but honest: the markup simply does not work, and the page loses a rich result it never had. An invented value works, which is the problem. It can put false information in front of searchers, and it breaks the rule at the centre of Google's structured data guidelines, which is that markup must describe content visible to the people reading the page.
| Invented property | What can go wrong | Severity |
|---|---|---|
aggregateRating, review | Stars shown in search for reviews that do not exist. Google treats this as misleading markup and it is a common reason for a structured data manual action. | Remove immediately |
offers.price, priceCurrency | A price in search that differs from the checkout, which also causes Merchant Center mismatches. | Remove or correct immediately |
telephone, address, openingHoursSpecification | Customers ring a wrong number or travel to a wrong address. Search engines and AI tools may repeat the wrong details. | High |
author, instructor, performer | A real-sounding person credited with work they did not do, or a real person's name attached to your content. | High |
sameAs | Your business linked to someone else's social profile, or to an address that returns an error. | Medium to high |
gtin, mpn, isbn | Product matched to a different item. Merchant Center can reject products with invalid identifiers. | Medium to high |
foundingDate, award, numberOfEmployees | False company facts that may be picked up and repeated by answer engines. | Medium |
cookTime, nutrition, duration | Plausible but wrong figures in recipe or course results. | Medium |
There is also a quieter cost. Structured data is one of the places where AI assistants and search features look for clean, machine-readable facts about a business. If your own markup states a wrong phone number or a founding year you never mentioned, you have published that error yourself, in the format most likely to be trusted. Nobody can promise that correcting your markup will change what a particular AI tool says about you, but there is no reason to feed it mistakes.
How to spot invented values quickly
The most reliable test is also the simplest: every literal value in the markup must be something you can point to. Either it is printed on the page, or it comes from a system you trust, such as your product database or your CMS author records. Values that meet neither condition are suspect, however reasonable they look.
Warning signs in the output
- Round, flattering numbers. Ratings of 4.7 to 4.9 with review counts in the low hundreds are a very common invented pattern.
- Names that are not in the byline. Any Person name you cannot find on the page, especially a common first and last name pairing.
- Tidy social links.
sameAsaddresses built from the business name, such asfacebook.com/businessname, which may belong to somebody else or not exist. - Phone numbers and postcodes you do not recognise. Also look for numbers in formats you never use on the site.
- Durations and quantities the page does not state. A prep time of exactly 15 minutes on a recipe that never mentions preparation time.
- Properties that are rare for the type. An
awardorknowsAboutlist on a small local business page is usually the model decorating.
A quick search routine
Open the live page in one window and the generated JSON-LD in a text editor in another. For each string or number in the markup, copy it and search the page with Ctrl+F (Cmd+F on a Mac). Search for a distinctive fragment rather than the whole value, so formatting differences do not hide a genuine match: the last six digits of a phone number, a surname, the digits of a price. Remember that text inside collapsed tabs and accordions is still on the page; expand them before searching, or search the page source instead.
JSON.stringify(data).match(/"[^"]{3,}"/g) to get a list
to work through. It is a checklist, not a verdict: you still have to look each value up.The fix, step by step
Step 1
Save the generated block next to the page
Before editing anything, copy the generated JSON-LD exactly as the AI Schema Generator returned it into a text file named after the page, and keep the live page open beside it. Working from a saved copy means you can compare later versions, see what the model added on each run, and prove to yourself which values were removed. If you are reviewing many pages, keep one file per URL in a single folder.
Step 2
List every literal value in the markup
Go through the block and write down each value that states a fact: names, numbers, prices,
dates, phone numbers, addresses, web addresses, durations and identifiers. Ignore structural parts such
as @context, @type and property names, because those describe the shape of
the data rather than claims about your business. On a typical page this list runs to between ten and
thirty entries, and it becomes your review checklist.
Step 3
Trace each value to a source
Next to every entry, note where it came from: the visible page, a named system such as your shop catalogue or CMS author profile, or nowhere you can find. Search the page text and source for each value, including collapsed sections. Check phone numbers, addresses and social profiles against your own records rather than your memory. A value that only matches something the model could have guessed from the business name counts as having no source.
Step 4
Delete what has no source
Remove
every property whose value has no source, together with any wrapper object left empty, such as an aggregateRating
with nothing inside. Do not replace an invented value with a vaguer one or a placeholder. Losing a star
rating or a recommended field costs far less than publishing a false claim, and required fields for a
rich result should be supplied from real content, never guessed, even when that means the page is not
eligible yet.
Step 5
Replace guessed values with real data
Where a property is useful and the true answer exists, put the real value in: the business phone number from your contact page, the author from the visible byline, the actual price from the catalogue. If the true value is not on the page yet, decide whether it should be. Adding a real opening hours table or a byline to the page and then marking it up is the honest route to a fuller block.
Step 6
Retest and record the page as reviewed
Paste the cleaned block into the Rich Results Test or the Schema Markup Validator to confirm it still parses and that nothing you deleted has left a broken structure. Then publish it, test the live URL, and mark the page as reviewed in whatever list you are keeping. For bulk work, note which invented properties appeared, because that pattern tells you what to watch on the next batch.
Which sources count, property by property
Some values can legitimately come from outside the visible page, as long as the page does not contradict them and the reader could find the same fact on your site. Others must be on the page itself. Use this as a rule of thumb when tracing values in step 3.
| Property | Acceptable source | Not acceptable |
|---|---|---|
| Ratings and reviews | Genuine reviews collected on your site and shown on this page | Totals from a third-party site not shown on the page; any figure the model produced |
| Price and availability | Your product catalogue, matching the price on the page | A price from an old version of the page or a competitor |
| Author or instructor | The visible byline or tutor name, and your author records | A name the model supplied because the byline was missing |
| Phone, address, hours | Your contact page or Google Business Profile, if they agree with each other | Directory listings you have not checked; anything recalled by the model |
sameAs profiles | Profiles you own and can log in to | Addresses built from your business name; profiles of similarly named firms |
| Product identifiers | Barcodes printed on the product or in the supplier's data | Numbers that merely look like a valid barcode |
| Logo and images | Files that exist on your server at that address | Addresses that follow your naming style but return a 404 |
Organisation-level facts, such as your logo, legal name and social profiles, are best defined once for the whole site and referenced from each page rather than regenerated page by page. That way there is a single place to check them, and the generator has no reason to reinvent them. The guide on reference loss explains how to link to those site-wide entities.
Reducing hallucinations before they happen
Review will always be needed, but you can make invented values much rarer by changing what the model is given and what it is asked to do.
- Make the facts visible. The model is most likely to invent a value when the page almost states it: a review quote with no reviewer, a class with no tutor named, a shop with no phone number in the footer. Put the real information on the page and the model has less reason to guess.
- Set the type yourself on ambiguous pages. A wrong type invites wrong properties. A page generated as a LocalBusiness will attract opening hours and a telephone number even when it is only a blog post about your business.
- Generate one type per page, not everything at once. Asking for an Organization, a Person and a Product in the same run gives the model many more empty slots to fill.
- Keep site-wide entities out of the generation. Let your SEO plugin or template own the Organization and author entities, and remove the generated copies. The less the model writes about your business as a whole, the less it can invent.
- Review in small batches. Generate five pages from a template, review them, and look for the invented properties that repeat. If every product page gains an invented rating, you know exactly which property to strip from the rest.
Harder cases
The value is true, but not on the page
Sometimes the model is right. It may know your real phone number or your founder's name from public sources. The rule still applies: markup should describe what the reader of this page can see. For contact details the better fix is usually to show them on the page, or to reference a site-wide Organization entity that is backed by your contact page. For anything you would not put on the page, leave it out of the markup.
Reviews that live on another platform
If your reviews are collected by a third-party service and displayed on your page through a widget, the ratings are on the page and can be marked up, usually by the widget itself. A rating total that only exists on an external review site, and is not shown on your page, should not be copied into your markup. Google's review snippet guidelines also exclude self-serving reviews of your own business on LocalBusiness and Organization markup, so check those guidelines before marking up any rating about your own firm.
Testimonials turned into reviews
A quote such as "Brilliant class, I will be back!" with a first name underneath may come back as a full Review with a rating the customer never gave. If you mark up a testimonial as a review at all, the reviewer name and any rating must match what the page shows. A testimonial with no star rating should not gain one.
Old facts the model remembers
For businesses that have moved, rebranded or changed number, the generator can produce the old details. These are easy to miss because they look familiar. Compare every contact detail with your current contact page, not with what you expect to see.
1. Why does AI-generated schema include information that is not on my page?
Language models produce the most likely continuation of a pattern. Blocks of Product, Course or LocalBusiness markup in the material they learned from usually include ratings, phone numbers and authors, so when your page lacks one of those the model may supply a plausible value rather than leaving the field empty. The output is well formed and passes validation, which is why the only reliable check is comparing each value with the page and your own records.
2. Will Google penalise my site for a fake rating in schema?
It can. Google's structured data guidelines require markup to describe content visible on the page, and ratings or reviews that do not exist are treated as misleading. The usual consequence is a manual action for spammy structured markup, reported in Search Console, which can remove rich results across the whole site until you clean up the markup and submit a reconsideration request. It is not guaranteed to happen, but the risk is not worth a few stars in search results.
3. Is it enough to run the markup through a validator?
No. Validators check that the JSON is readable, that the types and properties exist and that values have the right format. A made-up phone number, rating or author passes all of those checks because it looks exactly like a real one. Validation is still worth doing after you edit the block, since deleting properties can leave a broken structure, but it tells you nothing about whether the facts are true. Only comparing values with the page and your records does that.
4. What if the invented value happens to be correct?
Then it is a lucky guess, and the question becomes whether it belongs on this page. Markup should describe what a reader of the page can see, so a correct phone number that is not shown anywhere on the page is better added to the visible content first, or supplied through a site-wide Organization entity backed by your contact page. Keeping values that you cannot trace to a source makes the next review harder, because you can no longer tell checked facts from guesses.
5. Can I keep a rating from Google reviews or Trustpilot in my schema?
Only if the rating is displayed on the page itself, usually through a review widget that shows the score and the reviews. A total that exists only on an external site should not be copied into your markup. Google also does not show review stars for self-serving reviews on LocalBusiness and Organization markup, meaning reviews a business collects about itself and marks up on its own site. Read Google's review snippet guidelines before marking up any rating about your own business.
6. How do I check hundreds of generated pages without reading every line?
Focus on the properties that carry the most risk. Search all the generated blocks for aggregateRating, review, telephone, address, sameAs, gtin and author, and check those values first, because they cause the most harm when wrong. Then sample a few pages from each template in full. Invented values tend to repeat across similar pages, so a pattern found on five product pages will usually be on the rest, and you can remove it from all of them together.
7. Could hallucinated schema affect what AI assistants say about my business?
It is possible. Some AI search tools read structured data when they fetch pages, and markup is a tidy, machine-readable statement of facts, so a wrong phone number or founding date in your own markup is an error you have published in a format that is easy to reuse. How any given assistant weighs structured data is not publicly documented, so correcting it guarantees nothing, but it removes one source of wrong information that you control completely.
The AI Schema Generator reads your page content with an AI model, writes JSON-LD for the content type and validates it against schema.org and Google rich result criteria before delivery, so you can review the facts before you publish.
Open AI Schema Generator Fixes โ