What it checks
- JSON syntax, with the line and column of the first error. Trailing commas, single quotes, comments and unescaped quotes inside strings are the usual culprits; any of them makes the whole block invisible to search engines.
@contextis schema.org.- Every object with an
@type, including nested ones and those inside@graph, against the required and recommended properties in Google's Search Central documentation for that rich-result type. - Value formats: ISO 8601 dates, plain numeric prices, 3-letter currency codes, ratings within their scale, absolute URLs, breadcrumb positions in order.
This is a fast first pass that runs offline. It does not render your page, so it cannot see markup that JavaScript adds later, and it does not cover every type or every policy (for example, review markup must describe content visible on the page). Before relying on a rich result, also run Google's Rich Results Test on the live URL.
Types covered
| Type | Google requires | Notes |
|---|---|---|
| Product | name, and one of offers, review, aggregateRating | Offer needs price (a plain number) and should have priceCurrency. |
| Article, NewsArticle, BlogPosting | nothing | headline, image, datePublished, dateModified, author recommended. |
| BreadcrumbList | itemListElement of ListItems with position | Each crumb except the last needs item (its URL). |
| Event | name, startDate, location | |
| JobPosting | title, description, datePosted, hiringOrganization, jobLocation | Fully remote jobs use jobLocationType: TELECOMMUTE plus applicantLocationRequirements. |
| Recipe | name, image | |
| SoftwareApplication | name, offers, and aggregateRating or review | Ratings must be real reviews of the app. |
| VideoObject | name, thumbnailUrl, uploadDate | |
| LocalBusiness | name, address | |
| FAQPage | mainEntity of Questions with acceptedAnswer | Since August 2023 shown only for well-known government and health sites. |
| HowTo | Rich results discontinued in September 2023. |
Worked example
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Blue Widget",
"image": "https://acme.example/img/blue.jpg",
"offers": {
"@type": "Offer",
"price": "19.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}
Valid. Writing "price": "$19.99" or "price": "19,99" would fail: the currency goes in priceCurrency, and the price uses a dot as the decimal separator whatever your locale.
Common mistakes
- Markup that does not match the page. Ratings, prices and FAQs in JSON-LD must be visible to visitors. Hidden or invented values break Google's structured data policies and can lead to a manual action.
- Several disconnected blocks describing the same thing with different values (often from two plugins).
- Dates without time zones for events and jobs; add an offset such as
+01:00. - Relative URLs in
image,urloritem.