What this structured data validator checks
Paste a JSON-LD block, or the entire source of a page, and this structured data validator reads it
back to you: which blocks parse and which do not, where exactly a broken one breaks, every node
that declares a @type, and which of the fields Google documents for that type are missing. It
runs in your browser against a copy of the vocabulary shipped with the page, so it works on a
staging site, on a draft nobody has published, and on markup you would rather not send anywhere.
Valid means three different things
The word does a lot of work, and most confusion about structured data comes from three questions being answered as if they were one.
Is it parsable JSON? A machine question with a yes or no answer. A trailing comma, a curly quote pasted from a document, a comment left behind by a template — any of these and the block is skipped in its entirety. Not the broken property: the whole block, silently.
Does it conform to schema.org? Are the types real, do the property names exist, and are the values the right shape — an absolute URL where a URL belongs, an ISO date where a date belongs, a plain number where a price belongs. This is where most markup that parses still fails to do anything.
Will Google show a rich result for it? A commercial judgement, not a technical one, and the only one this page cannot answer. Google decides it per URL, against the page as crawled, weighing things no validator sees: whether the marked-up content is genuinely visible to a visitor, whether the site has a history of accurate markup, whether the feature exists in your country. Its Rich Results Test is where that answer lives, and it needs a live address to give one.
Keep the three apart and the workflow is obvious. Fix syntax and conformance here, before publishing, as many times as it takes. Ask Google once, afterwards, about the page it can actually fetch.
The errors that come up again and again
A price written as a price. "price": "£3.50" fails because the property takes a number and
the currency is declared separately in priceCurrency. The same goes for "1,299".
A date in the local format. 05/09/2026 is unreadable as data — it is two different days
depending on which side of the Atlantic wrote it. Every date property wants ISO 8601.
A relative URL. "logo": "/logo.png" means nothing to a consumer that received the JSON
without the page it came from. Image, logo, URL and sameAs all want the full address.
Markup describing something the page does not show. Review stars for reviews that appear nowhere on the page, an FAQ block whose questions are not in the visible text. This is the one category a syntax check cannot catch and the one that draws a manual action, because it is the difference between describing your page and inventing it.
A missing @context. Without it the property names have no vocabulary behind them, and the
block is discarded before anything else is examined.
Where the requirements come from
The required and recommended fields are Google's documented lists for each type, not the full
schema.org definition. The two are different by design: schema.org describes what can be said about
a thing, and Google's documentation says what it needs in order to display a particular feature.
Article has no required properties at all in Google's list, which surprises people and is
correct — the article rich result depends on the page, not on the markup.
When you are producing the markup rather than checking it, the generators write blocks that pass this check by construction: Article, Product, FAQPage and LocalBusiness each have one.