What the validator checks, and what it doesn't
The validator parses each application/ld+json block, then checks JSON syntax, @context and @type, the required and recommended properties Google documents for about 20 common types, value formats (coordinates, times, dates, prices, URLs), @id consistency and references to @ids that are never defined. It doesn't fetch pages, run JavaScript, read Microdata or RDFa, or check every schema.org property.
Step by step
- Find the blocks. If you paste HTML, every
<script>whose type containsld+jsonis read. If you paste JSON that starts with{or[, it is treated as one block. - Parse the JSON. Syntax errors are reported with a line and column where the browser gives one, plus hints for the usual causes: curly quotes, trailing commas, comments, single-quoted keys.
- Check @context. Every top-level object needs
"@context": "https://schema.org"(http and a trailing slash are accepted). - Collect nodes. Every object with an
@typeor@id, including items inside@graphand nested values, is checked. An object holding only an@idis treated as a reference to another node. - Check @type. Missing types are errors. Type names are case-sensitive, so
Localbusinessis flagged with the correct spelling. - Apply Google's property rules for the most specific type that has one (a
Dentistgets the LocalBusiness rules). - Check @id. Relative identifiers, an @id identical to an organization's url, the same @id defined with conflicting types, names or URLs, organizations with the same url but different @ids, and references to @ids never defined.
Property rules and their sources
| Type | Required (error if missing) | Extra checks | Source |
|---|---|---|---|
| LocalBusiness and subtypes | name, address | address parts, phone country code, geo 5+ decimals, priceRange under 100 characters, self-serving review markup, menu/servesCuisine for food | Local business |
| Organization and subtypes | none (Google has no required properties) | logo URL, address, self-serving review markup | Organization |
| WebSite | name, url | retired SearchAction | Site names |
| BreadcrumbList | itemListElement; each item needs position, name, and item (except the last) | positions run 1, 2, 3… | Breadcrumb |
| Article, BlogPosting, NewsArticle | none | ISO 8601 dates with timezone, author as Person/Organization with url, one author per entry | Article |
| Product | name, plus one of offers, review or aggregateRating | price is a number, availability value, priceValidUntil not in the past | Product snippet |
| Review / AggregateRating | author and reviewRating / ratingValue plus ratingCount or reviewCount | rating within worst–best, itemReviewed when not nested | Review snippet |
| Event | name, startDate, location (with address) | start time present, physical location | Event |
| SoftwareApplication | name, offers.price | notes that Google's rich result also needs a real rating or review | Software app |
| ProfilePage | mainEntity | Profile page | |
| FAQPage, HowTo | mainEntity / name and step | notes that the Google rich results were retired | Search Central updates |
Person, Service, WebPage, PostalAddress, GeoCoordinates and OpeningHoursSpecification get basic schema.org checks. Missing recommended properties are warnings; for Organization they are notes, because Google says to add only the ones that apply.
Limits
- No fetching. It checks what you paste. Markup injected by JavaScript won't be in "view source"; Google's Rich Results Test renders the page.
- JSON-LD only. Microdata and RDFa are not read.
- Not the whole vocabulary. It knows about 300 common types and doesn't check every property name. The Schema Markup Validator checks against all of schema.org.
- It can't see policy problems. Whether reviews are genuine or content is visible is for you to confirm; the tool can only remind you.
- Google decides. Passing every check doesn't guarantee a rich result.
Privacy
The validator and generator are static JavaScript files. They make no network requests with your input, set no cookies, and have no analytics.