Skip to content

Free tools

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

Jump to the result

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

Jump to the file

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.