Structured Data Validator

Every JSON-LD block on the page, parsed, with the properties Google requires checked off.

0JSON-LD blocks
0Types found
0Errors
0Warnings

Results

    Parsed data

    This checks syntax and the properties Google documents as required or recommended for each type. It is a fast local pre-check, not a replacement for Google's own Rich Results Test, which is the authority on whether a rich result will actually appear.

    Runs in your browser. The HTML you paste is parsed in this tab with the browser's own DOMParser, which builds an inert document — scripts in your markup never run and nothing is requested from the pages it references. That means you can safely audit a staging site, a client page behind a login, or an unpublished draft.

    What the structured Data Validator does

    Structured data fails in two ways, and they need different tools. It can be malformed — a trailing comma, a smart quote pasted from a word processor, a missing brace — in which case search engines discard the whole block silently. Or it can be syntactically perfect but incomplete, missing a property Google requires for that type, in which case it is read and then ignored for rich results.

    This validator catches both. It extracts every application/ld+json block from your HTML, parses each one, and walks the whole object tree including nested entities — an Offer inside a Product, a Question inside an FAQPage, ListItems inside a BreadcrumbList. Each typed entity is checked against the properties Google documents as required and recommended for that type.

    Several specific traps are checked separately because they are common and silent. An AggregateRating with a ratingValue but no reviewCount or ratingCount is invalid, and it is the single most frequent reason star ratings do not appear. Currency codes must be three-letter ISO 4217 values, so £ or Pounds fails. Dates must be ISO 8601, so 7 September 2026 is not accepted where 2026-09-07 is.

    This is a fast local pre-check that runs as you type, which makes it useful while writing markup. Google's own Rich Results Test remains the authority on whether a rich result will actually be shown, and you should run the live URL through it before considering the job done.

    How to use it

    1. Paste your page's HTML, or just the JSON-LD if that is all you have.
    2. Fix red items first — invalid JSON means the entire block is discarded.
    3. Then add the missing recommended properties; several rich results will not appear without them.
    4. Finally, run the live URL through Google's Rich Results Test to confirm.

    A worked example

    The Product markup in the box above validates like this:

    ✓ Product              All required properties present.
    ! Product              Missing recommended: brand, description, sku
    ✓ Offer                All required properties present.
    ! Offer                Missing recommended: availability, url
    ✗ AggregateRating      Missing required: reviewCount or ratingCount

    The last line is the one that matters. The JSON is valid, the rating value is there, and it looks right — but without a review count Google will not render stars, and nothing on the page tells you why. Adding "reviewCount": "212" is a one-line fix that changes whether the rich result appears at all.

    Frequently asked questions

    Is this the same as Google's Rich Results Test?

    No, and it is not a substitute. This checks syntax and documented required and recommended properties, locally and instantly, which is useful while you are writing. Google's test runs the live URL against its own rules and is the authority on whether a rich result will show.

    Why does my valid markup not produce a rich result?

    Valid markup makes a rich result eligible, not certain. Google decides per query and per site, and it can take weeks after a recrawl. Missing recommended properties, low site quality signals, or simply Google choosing not to are all possible reasons.

    Can I have several JSON-LD blocks on one page?

    Yes. Multiple blocks are perfectly valid, and it is often cleaner than nesting everything into one. You can also combine them into a single block using an @graph array. This validator handles both.

    What breaks JSON-LD most often?

    A trailing comma before a closing brace, and smart quotes from a word processor replacing straight quotes. Both make the block unparseable, and both are invisible when you skim the code. This tool reports the parser's exact complaint.