Structured Data
Questo controllo pesa il 6% del punteggio.
How to add JSON-LD structured data for AI agents: missing blocks, invalid JSON, schema.org context, @graph, entity types, and BreadcrumbList.
No JSON-LD found
Your homepage has no <script type="application/ld+json"> blocks. JSON-LD is the preferred format for structured data because it's embedded in HTML but completely separate from the visual content, making it easy for AI agents to parse.
Add a JSON-LD block to your <head>:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebSite",
"name": "Your Site Name",
"url": "https://your-site.com"
},
{
"@type": "Organization",
"name": "Your Company",
"url": "https://your-site.com",
"logo": "https://your-site.com/logo.png"
}
]
}
</script>Invalid JSON in block
One of your JSON-LD blocks contains invalid JSON syntax. Common issues include:
- Trailing commas after the last property
- Single quotes instead of double quotes
- Unescaped special characters in strings
- Missing commas between properties
Validate your JSON-LD at validator.schema.org or use a JSON linter in your IDE.
All blocks invalid
Every JSON-LD block on your page has invalid JSON. This means AI agents can't extract any structured data from your site. Fix the JSON syntax errors using the guidance in the section above.
Missing @context
Your JSON-LD doesn't include @context referencing schema.org. Without it, AI agents can't interpret the vocabulary of your structured data.
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Your Company"
}The context can be a string ("https://schema.org") or an object with @vocab. Both http and https are accepted, with or without a trailing slash.
No @graph array
Your JSON-LD uses single-entity format. While valid, using an @graph array allows you to define multiple related entities in a single block, giving AI agents a richer understanding of your site.
{
"@context": "https://schema.org",
"@graph": [
{ "@type": "WebSite", "name": "...", "url": "..." },
{ "@type": "Person", "name": "...", "jobTitle": "..." },
{ "@type": "WebPage", "name": "...", "url": "..." }
]
}Few key entity types
ax-audit checks for 5 key entity types: Person, Organization, WebSite, WebPage, and ProfilePage. Your site has only 1 of these. Adding more types gives AI agents a more complete picture.
For a personal portfolio, a good combination is:
Person: your identity, job title, social linksWebSite: site name, URL, search actionWebPageorProfilePage: the current page
For a company site, use Organization instead of Person.
No key entity types
Your JSON-LD has no recognized @type values. Every entity in your structured data should have a type from the schema.org vocabulary. See the section above for recommended types.
No BreadcrumbList
Adding a BreadcrumbList entity helps AI agents understand your site's navigation hierarchy: which pages are parents of which.
{
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://your-site.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Blog",
"item": "https://your-site.com/blog"
}
]
}No author
An assistant deciding whether to cite a page weighs where it came from. Declare author as a Person or Organization, not a bare string: a name in a string is a label, an object is an entity.
"author": {
"@type": "Person",
"name": "Ada Lovelace",
"url": "https://example.com/authors/ada"
}No sameAs
sameAs is what turns a name into an entity. Link your Organization or Person to Wikidata, LinkedIn, GitHub or Crunchbase, and a model can connect this page to everything it already knows about you rather than treating you as a new string.
"sameAs": [ "https://www.wikidata.org/wiki/Q123456", "https://github.com/example", "https://www.linkedin.com/company/example" ]
No publisher
An article has a writer and an outlet, and a citation usually wants both. Declaring only the author leaves an assistant naming a person with no institution behind them, which reads as weaker sourcing than it is.
No dates
Assistants weigh recency when they answer time-sensitive questions, and a page with no date cannot be weighed at all. It is not treated as old; it is treated as unknown, which for a question about this year is the same outcome.
"datePublished": "2026-01-15", "dateModified": "2026-09-04"
Add dateModified to anything that changes, and make it the real modification time rather than the build time, or every page on the site claims to have been updated today.
A date that is not ISO 8601
03/04/2026 is March in one country and April in another. Use 2026-09-04 or 2026-09-04T12:00:00Z; anything else is either ignored or misread, and misread is worse.
A date in the future
A future dateModified reads as a mistake or as an attempt to look fresher than you are, and both cost trust. Usually a timezone bug or a scheduled-publishing field written before the schedule ran.
Nothing modified in a long time
Informational, and not a defect: a reference page that was right in 2021 is still right. It matters because an assistant answering "what is the current" anything weighs recency heavily, so an accurate old page loses to a newer worse one.
If the content is current, say so by updating dateModified when you review it. If it is not, this is the page telling you.
Markup that does not match the visible page
Your JSON-LD names a headline, a price or a rating that does not appear in the served text. This is Google's one explicit requirement for structured data and AI features: the markup must match what a reader sees.