Schema markup validator
Check every JSON-LD block on a page against the required and recommended properties for its type.
Free, no sign-up, and the whole result is shown. Nothing is stored.
What this checks, and what it does not
The validator fetches the page you give it, pulls out every <script type="application/ld+json"> block, and checks each one against the property table below. It reports three kinds of finding and nothing else:
- Error — the block is not valid JSON, has no
@contextor@type, or is missing a property that is required for that type. A required property missing means the markup is not eligible for the rich result it is aiming at. - Warning — a recommended property is missing. The markup still works; it says less.
- Pass — every property in the table is present.
There is no score. A score would need a weighting, and any weighting we put on "missing dateModified" against "missing headline" would be a number we made up. Each finding names the exact type and property instead, so you can fix it directly.
Limits worth knowing. The tool reads the HTML the server returns. Structured data injected by client-side JavaScript after page load will not be seen — which is also true of some crawlers, so a block that only exists after hydration is a real finding, not a false negative. Microdata and RDFa attributes are counted but not validated. Types outside the table below are checked for syntax only, and the report says so rather than guessing at their requirements.
The property table this tool validates against
Required and recommended properties follow Google's published structured data documentation for each rich result type. This is the whole rule set — nothing is applied that is not listed here.
| Type | Required | Recommended |
|---|---|---|
| ArticleArticle rich results in search and AI answers. | headline | author, datePublished, dateModified, image |
| BlogPostingArticle rich results for blog posts. | headline | author, datePublished, dateModified, image |
| NewsArticleArticle rich results for news. | headline | author, datePublished, dateModified, image |
| ProductProduct rich results, price and availability. | name | image, description, offers, brand, aggregateRating |
| OfferPrice and availability inside a Product. | price, priceCurrency | availability, url, priceValidUntil |
| OrganizationEntity identity — who publishes this site. | name | url, logo, sameAs, contactPoint |
| LocalBusinessLocal business rich results and map listings. | name, address | telephone, openingHoursSpecification, url, geo |
| WebSiteSite name and the sitelinks search box. | name, url | potentialAction, publisher |
| WebPagePage-level identity and freshness. | name | description, url, dateModified, breadcrumb |
| BreadcrumbListBreadcrumb trail in the result snippet. | itemListElement | — |
| FAQPageQuestion and answer pairs AI systems quote directly. | mainEntity | — |
| HowToStep-by-step instructions. | name, step | totalTime, supply, tool, image |
| EventEvent rich results. | name, startDate, location | endDate, description, offers, performer, image |
| RecipeRecipe rich results. | name, image, recipeIngredient, recipeInstructions | author, cookTime, prepTime, nutrition, aggregateRating |
| VideoObjectVideo rich results and key moments. | name, thumbnailUrl, uploadDate | description, duration, contentUrl, embedUrl |
| JobPostingJob listing rich results. | title, description, datePosted, hiringOrganization | jobLocation, baseSalary, employmentType, validThrough |
| SoftwareApplicationSoftware listing, including free web tools. | name | applicationCategory, operatingSystem, offers, url |
| PersonAuthor identity — the signal behind an expertise claim. | name | url, sameAs, jobTitle, image |
| ItemListOrdered or unordered list of entities. | itemListElement | numberOfItems, itemListOrder |
| QAPageA single user-submitted question with answers. | mainEntity | — |
Why structured data matters for AI answers
A language model reading your page has to work out what is a fact, what is navigation and what is marketing. JSON-LD removes that guesswork: it states, in a machine-readable form, that this string is the author, this one is the publication date, this one is the price. When an assistant assembles an answer and needs to attribute a claim, unambiguous markup is the difference between being quoted with your name on it and being paraphrased without attribution.
The three that do the most work, in order:
- Organization — establishes who publishes the site. Without it, a model has no stable entity to attach your content to, and your brand name is just a string that happens to recur.
- Article or BlogPosting with
authoranddateModified— freshness and authorship are two of the signals that decide whether a page is used as a source or skipped for a newer one. - FAQPage — question and answer pairs are the shape an assistant can lift directly. A well-marked FAQ answer is close to ready-to-quote text.
Markup does not make a weak page strong. It makes a strong page legible.
How to fix the common failures
- Block is not valid JSON. Usually a trailing comma, a smart quote pasted from a document, or an unescaped quotation mark inside a string. The whole block is discarded when this happens — one stray character costs you all the markup on the page.
- No
@context. Every top-level node needs"@context": "https://schema.org". Without it the block is arbitrary JSON, not JSON-LD, and is ignored. - Missing
authoron an Article. Use a nestedPersonorOrganizationobject with anameand, ideally, aurlpointing at a real bio page. A bare string works but carries less. - Missing
dateModified. Emit it from your CMS, in ISO 8601. Do not hardcode it, and do not bump it on every deploy — a date that always says today tells a crawler nothing. - Missing
offerson a Product. Nest anOfferwithprice,priceCurrencyandavailability. Price without currency is not usable. - Markup that contradicts the page. Not something this tool can detect, but worth stating: the values in your JSON-LD must match what a reader sees. Marking up a rating you do not display is a policy violation, not a shortcut.
Questions people ask about this check
My page passes here but Google's Rich Results Test flags it. Why?
Different scope. This tool checks property presence against the documented required and recommended sets. Google additionally checks value formats, image dimensions, and eligibility rules that change per feature and per country. Use this to catch structural problems quickly, then confirm eligibility in Google's own tester.
Should I use JSON-LD, microdata or RDFa?
JSON-LD, in nearly every case. It lives in one block in the head or body rather than being interleaved with your markup, which means it survives template changes and is far easier to generate correctly from a CMS. This tool counts microdata and RDFa items so you know they are there, but validates JSON-LD only.
Does structured data get me cited by ChatGPT or Claude?
Not on its own, and anyone claiming a direct causal link is guessing. What it does is make the facts on your page unambiguous — who wrote it, when it was updated, what entity it is about. That is a prerequisite for being used as a source, not a guarantee of it. The page still has to be worth citing, and the crawler still has to be allowed in, which is a robots.txt question.
How many JSON-LD blocks should a page have?
As many as it has distinct things to describe. One block per entity is fine, and so is a single block with an @graph array. What matters is that each node is complete and that you are not describing the same entity twice with conflicting values.
Do you store the pages I check?
No. The page is fetched, parsed in the request, and the result is returned to your browser. There is no account, no email field and no saved history — the shareable link simply re-runs the check against the same URL.
Where to go next
- Check whether AI crawlers can reach the page at allPerfect markup on a page GPTBot cannot fetch changes nothing. Generate robots.txt rules for the AI crawlers first.
- Validate the sitemap that points at this pageA page with good schema that is missing from your sitemap is a page crawlers may never revisit.
- Check the heading hierarchy on the same pageStructured data states the facts; the heading structure decides which passage gets quoted.
- How crawler logs show which AI bots actually fetched a pageMarkup is an input. Crawler logs are the evidence of what the AI crawlers did with it.
- Glossary of AI search and structured data termsDefinitions for JSON-LD, entity, citation and the rest of the vocabulary on this page.
- Track which prompts mention your brandOnce the markup is right, the question becomes whether assistants are naming you. That is what prompt tracking measures.