Guide
Structured data: the one place you state facts
Prose implies. JSON-LD asserts. Which types earn their keep for agent readiness, why validity matters more than volume, and the failure mode where markup and page disagree.
Last reviewed 27 August 2026
Everything else on a page is interpretation. A price in prose might be a discount, a competitor's figure, or last year's. A price in an Offer is a claim you are making, in a form that cannot be misread.
That is the whole argument for structured data in an agent context, and it is why validity matters far more than coverage: a block that does not parse is not a weaker signal, it is no signal at all.
The types that earn their keep
| Page | Type | What it settles |
|---|---|---|
| Product | Product + Offer | Price, currency, availability, identifier |
| Service | Service | What is provided, to whom, where |
| Location | LocalBusiness | Address, hours, phone, geo |
| Article | Article / NewsArticle | Author, publication date, publisher |
| FAQ | FAQPage | Question and answer pairs an agent can lift |
| Instructions | HowTo | Ordered steps with tools and supplies |
| Organisation | Organization | Identity, logo, sameAs links |
| Any page | BreadcrumbList | Where this sits in the hierarchy |
Two of those are underrated for agent work specifically. FAQPage gives an assistant text it can quote without paraphrasing, which reduces the chance of being cited inaccurately. HowTo gives it an ordered plan, which is close to a procedure it can follow.
JSON-LD, in the head, one block per subject
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Lelit Bianca V3",
"sku": "LB-V3-2026",
"description": "Dual-boiler espresso machine with manual flow control.",
"brand": { "@type": "Brand", "name": "Lelit" },
"width": { "@type": "QuantitativeValue", "value": 31, "unitCode": "CMT" },
"offers": {
"@type": "Offer",
"price": "1899.00",
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock",
"url": "https://example.com/machines/lelit-bianca-v3"
}
}
</script>Note the width expressed as a QuantitativeValue with a unit code. That is the difference between an agent knowing the machine is 31 centimetres wide and an agent reading 31 somewhere in a specification table and hoping.
Where it goes wrong
- Invalid JSON. A trailing comma or an unescaped quote and the whole block is discarded silently. Our check counts malformed blocks separately and fails a page whose only structured data does not parse.
- Markup that disagrees with the page. The visible price says €1,699 and the
Offersays €1,899. An agent will act on the markup, then a customer will arrive expecting the other number. - Type that does not match the page.
Organizationon a product page tells an agent nothing about the product. - Copied templates with placeholders left in.
"name": "Product Name"shipped to production is more common than it should be. - Injected only after hydration. If the block is added by JavaScript, most agent crawlers never see it. Render it server-side — see content without JavaScript.
The disagreement failure is a synchronisation problem, and synchronisation problems are solved by having one source. Emit JSON-LD from the same data that renders the page. Hand-written blocks in a template are a promise to update two places forever, and that promise is always broken eventually.
Open Graph is not a substitute
Open Graph tags describe how a link looks when shared. They carry a title, an image and a short description — useful, and not the same thing. og:price has no availability, no currency guarantee, no identifier and no relationship to anything else on the page. Ship both; do not treat one as the other.
How we grade it
6 points, in the readability pillar. A page passes when JSON-LD parses cleanly and declares at least one recognised type. Malformed blocks alongside valid ones score partial, because something is being ignored. Valid JSON that declares no @type also scores partial — it parses, but it asserts nothing.
Sources
Primary documents, checked on 27 August 2026
- schema.org
- W3C — JSON-LD 1.1
- Google — structured data general guidelines
- Google — Rich Results Test — Validates a page's blocks against supported types
- Open Graph protocol
Keep reading
Check your own site against this
The Agent Readiness Score measures exactly what this article describes, and shows the evidence behind every finding.
Run the check →