Product schema validator and JSON-LD builder
Check the Product markup you have, or build a complete block from a form.
Check your Product JSON-LD, three ways
Start from an example
Or paste your own markup below.
Paste the script block or just the JSON inside it. The checker reads JSON-LD only; Google’s Rich Results Test also reads microdata and RDFa.
How it reads
What it describes
Graded: the first Product.
Google requires (merchant listings)5 of 5 met
- Passes: name
- Passes: image
- Passes: offers, as an Offer (not only an AggregateOffer)
- Passes: a price greater than zero, in price or priceSpecification.price
- Passes: priceCurrency as a three-letter ISO 4217 code
Google recommends5 of 5 met
- Passes: availability
- Passes: gtin, mpn or sku
- Passes: brand.name
- Passes: description
- Passes: itemCondition
Our DISC-004 reads6 of 6 met
- Passes: a Product, or a ProductGroup with Product variants, at the top level or in @graph
- Passes: name, as text
- Passes: an identifier: sku, gtin or mpn (on a ProductGroup, on every variant)
- Passes: offers.price on every offer
- Passes: offers.priceCurrency on every offer
- Passes: offers.availability on every offer
Checked in your browser against Google’s merchant-listing rules and our DISC-004’s own code. Nothing you paste is sent.
A Product JSON-LD builder
Filled in with an invented product to start. Type the price as your page shows it; the builder writes it the way schema.org asks, with a full stop and no symbol.
The product
Addresses
The offer
Your Product JSON-LD22 lines
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Northwind Linen shirt",
"image": "https://example.com/images/linen-shirt.jpg",
"description": "A relaxed shirt in washed European linen.",
"brand": {
"@type": "Brand",
"name": "Northwind Linen"
},
"sku": "NL-SHIRT-01",
"offers": {
"@type": "Offer",
"url": "https://example.com/products/linen-shirt",
"price": "59.00",
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition"
}
}
</script>What it describes
Graded: the first Product.
Google requires (merchant listings)5 of 5 met
- Passes: name
- Passes: image
- Passes: offers, as an Offer (not only an AggregateOffer)
- Passes: a price greater than zero, in price or priceSpecification.price
- Passes: priceCurrency as a three-letter ISO 4217 code
Google recommends5 of 5 met
- Passes: availability
- Passes: gtin, mpn or sku
- Passes: brand.name
- Passes: description
- Passes: itemCondition
Our DISC-004 reads6 of 6 met
- Passes: a Product, or a ProductGroup with Product variants, at the top level or in @graph
- Passes: name, as text
- Passes: an identifier: sku, gtin or mpn (on a ProductGroup, on every variant)
- Passes: offers.price on every offer
- Passes: offers.priceCurrency on every offer
- Passes: offers.availability on every offer
Copy puts the whole script block on your clipboard; the download is the JSON alone. Put the block in the HTML your server sends, not in a script that adds it later, and keep every value the same as the page. Built in your browser; nothing is sent.
Check the rest of your store.
Free, no account, about five minutes.
What the validator checks
Paste the JSON-LD from one of your product pages and the validator grades it two ways, side by side: against the fields Google’s merchant listing rules require and recommend, and against what our product data check, DISC-004, reads. Copy the block from View source, not Inspect, so you see what your server sent rather than what a script added later. Five examples are there to start from. The last has a missing comma, which is all it takes to make a whole block unreadable.
What a complete block needs
Google requires a name, an image and an offer, and on the offer a price above zero and a three-letter currency code. Our check asks for a little more: an identifier (a SKU, GTIN or MPN) and an availability on every offer. Write the price as a number with a full stop, "59.00", and the currency as a code, "EUR". A euro sign inside the price is a puzzle no program wants to solve. If the product comes in sizes or colours, give each variant its own offer, with its own price, stock and URL.
No markup yet? Use the builder
Under the validator, the builder writes a complete Product block from a form. It starts with an invented linen shirt; type your own product over it, copy the block, and put it in the HTML your server sends, so a reader that runs no scripts still gets it. Keep every value the same as the page shows, because an agent that finds two prices cannot tell which one to believe. Most platforms write this markup for you, so check what yours already prints before you add a second block.
Limits
It reads JSON-LD only. Google’s Rich Results Test also reads microdata and RDFa, and the Schema Markup Validator checks plain schema.org without Google’s rules, so use them alongside this one. It grades one block, where our scan samples up to three product pages. Nothing you paste is sent.
Frequently asked questions
Do AI agents need special product markup?
No. Google says there is no special schema.org markup for generative AI search. The usual Product markup still helps, because it states the price and stock in a form a program can read without guessing.
Which fields does Google require for a product?
For merchant listings: name, image and offers, and on the offer a price above zero and a currency code. Availability, brand, description and identifiers are recommended.
Why is my markup missing here when I can see it in Inspect?
Inspect shows the page after its scripts ran. If a script adds the JSON-LD, View source does not have it, and neither does a reader that runs no JavaScript. Google recommends putting Product markup in the initial HTML.
Is this the same as Google’s Rich Results Test?
No. It checks JSON-LD only, against Google’s merchant listing fields and our own DISC-004 side by side. The Rich Results Test also reads microdata and RDFa.
The full guide
Product structured data for AI agents
Which schema.org Product properties a store’s pages need, what Google requires and what our checks read, with a JSON-LD builder and a checker for the markup you have.