Rich Results Schema.org Tester
Pricing
from $0.01 / 1,000 results
Rich Results Schema.org Tester
Test any URL for Google Rich Results eligibility. Validate structured data, identify schema errors & get recommendations. Batch test multiple pages for SEO audits.
Pricing
from $0.01 / 1,000 results
Rating
0.0
(0)
Developer
The Howlers
Maintained by CommunityActor stats
0
Bookmarked
25
Total users
0
Monthly active users
5 days ago
Last modified
Categories
Features
Share
Google Rich Results Tester
Check whether your pages can earn rich results in Google Search. The actor loads each URL in a real browser (so markup added by JavaScript is included, as it is for Google), reads every structured data item on the page in JSON-LD, microdata and RDFa, and checks each one against the required and recommended properties in Google's structured data documentation.
For every URL you get the items found, the rich result types they are eligible for, errors (missing or invalid required properties, which block the rich result) and warnings (missing recommended properties, which do not block it).
Note: this actor runs in Demo Mode by default, so a default run returns sample results from three built-in sample pages and charges no URL tests. Nothing is fetched in Demo Mode, so sample rows have testStatus sample and demo: true, and the run's OUTPUT record reports totalTested: 0. Set demoMode to false to test your own URLs.
This is an independent tool. It is not made by Google and does not call Google's Rich Results Test. It follows Google's published requirements, so results usually match Google's own test, but Google can still decide not to show a rich result for reasons markup alone does not show (site quality, policies, crawl access).
Quick Start
Test with Demo Mode (free sample output)
{"demoMode": true}
Test your own pages
{"demoMode": false,"urls": ["https://www.example.com/products/blue-widget","https://www.example.com/recipes/easy-pancakes"],"userAgent": "smartphone"}
What it checks
| Rich result | Schema.org types |
|---|---|
| Article | Article, NewsArticle, BlogPosting and other Article types |
| Breadcrumbs | BreadcrumbList |
| Carousel | ItemList of Recipe, Course, Restaurant or Movie items |
| Course list | Course |
| Dataset (Dataset Search only) | Dataset |
| Discussion forum | DiscussionForumPosting, SocialMediaPosting |
| Employer aggregate rating | EmployerAggregateRating |
| Event | Event and its subtypes |
| Image metadata | ImageObject with license or credit details |
| Job posting | JobPosting |
| Local business | LocalBusiness and all its subtypes (Restaurant, Dentist, Plumber and so on) |
| Merchant listing | Product with an Offer (a Car also needs Product in @type, see below) |
| Movie | Movie |
| Organization | Organization and its subtypes |
| Product snippet | Product and its subtypes, including ProductGroup variants (a Car also needs Product in @type, see below) |
| Product variants | ProductGroup |
| Profile page | ProfilePage |
| Q&A | QAPage |
| Recipe | Recipe |
| Review snippet | Review and AggregateRating, on their own or nested in a reviewable item |
| Site name | WebSite |
| Software app | SoftwareApplication, MobileApplication, WebApplication, VideoGame |
| Video | VideoObject |
Besides missing properties, it flags values Google cannot read: dates that are not ISO 8601, prices with currency symbols, currency codes that are not three-letter ISO 4217 codes, ratings outside their scale, durations that are not ISO 8601, JSON-LD that does not parse, and JSON-LD without a schema.org @context.
Retired features
Markup for features Google no longer shows is still detected and reported with status retired, so you know it no longer earns anything:
- FAQ (FAQPage): Google stopped showing FAQ rich results on May 7, 2026.
- How-to (HowTo): retired in September 2023.
- Fact check (ClaimReview), special announcement and estimated salary: retired in 2025.
- Vehicle listing (Car, Vehicle, Motorcycle, BusOrCoach, MotorizedBicycle): retired in 2025, and Google removed its documentation on September 9, 2025. These items are still checked as products, because they can still earn product snippets and merchant listings. Google's product documentation says Car is not read as a Product on its own, so a Car without Product in
@typeis reported with an error asking you to add it, as in["Product", "Car"]. The other vehicle types get a warning instead, because the documentation names only Car. - Sitelinks search box (WebSite SearchAction): retired in November 2024.
Input Parameters
| Parameter | Type | Default | Required | Description |
|---|---|---|---|---|
demoMode | boolean | true | No | Return labeled sample results. No URLs are fetched and no URL tests are charged. |
urls | array | - | No | Pages to test. |
userAgent | string | "smartphone" | No | Browser window size: smartphone or desktop. |
includeScreenshots | boolean | false | No | Save a screenshot of each rendered page to the key-value store. |
validateSchemaTypes | array | - | No | Only report pages that include one of these schema.org types anywhere in their structured data, nested items included (for example a Product in WebPage.mainEntity or inside an @graph node). Subtypes match too, so LocalBusiness matches Dentist or Restaurant. Other pages are listed as skipped and not charged. |
proxyConfiguration | object | - | No | Optional proxy for sites that block requests from Apify servers. |
webhookUrl | string | - | No | URL that receives a POST with a results summary when the run finishes. |
Output
One dataset row per URL. The main fields:
| Field | Description |
|---|---|
url | The URL you asked to test. |
testStatus | tested, failed (the page could not be loaded), skipped, or sample (a Demo Mode row built from a sample page, nothing was fetched). |
eligible | true when at least one item is eligible for a rich result. |
eligibleRichResultTypes | Rich result types with at least one valid item, for example ["Product snippet", "Breadcrumbs"]. |
detectedRichResultTypes | Every rich result type found, including invalid and retired ones. |
richResults | One entry per rich result type: status, item counts, errors, warnings and notes. |
schemaTypes | Top-level schema.org types found on the page. |
allSchemaTypes | Every schema.org type on the page, nested items included. validateSchemaTypes matches against this list. |
schemaItems | Every item checked: its types, format (json-ld, microdata or rdfa), status, errors, warnings, notes, structured issues and the item's own properties. |
itemsDetected | Number of items checked. |
errors, totalErrors | Problems that block a rich result, prefixed with the item type. |
warnings, totalWarnings | Missing recommended properties and other non-blocking issues. |
notes | Plain explanations, such as a retired feature or self-serving review stars. |
rawJsonLd, microdata, rdfa | The structured data as read from the page. |
httpStatus, finalUrl, pageTitle | What the page returned. |
fetchMethod | browser, http when the page was read without a browser after the browser could not load it, or sample in Demo Mode. |
screenshot, screenshotUrl | Key and link of the screenshot, when requested. |
Example row (shortened):
{"url": "https://www.example.com/products/blue-widget","testStatus": "tested","eligible": true,"eligibleRichResultTypes": ["Product snippet", "Merchant listing", "Breadcrumbs"],"schemaTypes": ["Product", "BreadcrumbList"],"totalErrors": 0,"totalWarnings": 3,"warnings": ["Product: Missing recommended property: a product identifier (gtin, mpn or isbn) (Merchant listing)","Product: Missing recommended property: offers.shippingDetails (or a shipping policy on your Organization) (Merchant listing)","Product: Missing recommended property: review (Product snippet)"]}
Pricing
This actor uses pay-per-event billing:
| Event | When it is charged | Price |
|---|---|---|
| Actor start | Once when the run starts, one event per GB of memory (minimum one). At the default 4 GB of memory a run starts at $0.40 | $0.10 per GB |
| URL Tested | Once per URL that loaded and was checked | $0.03 |
| Result | Each item written to the default dataset | $0.00001 |
You are not charged a URL test for pages that fail to load, return an HTTP error, come back empty or show a bot check, for pages skipped by validateSchemaTypes, or for anything in Demo Mode. The run stops testing new URLs when it reaches the maximum total charge you set.
Troubleshooting
A URL shows testStatus: failed
The page could not be loaded, returned an HTTP error, came back empty or showed a bot check. The errors field says which. A page only counts as a bot check when the site served its challenge or block page instead of the real one. Pages that simply load a bot protection script are tested as normal. For sites that block Apify servers, try again with a proxy in proxyConfiguration.
Errors I did not expect
Each error names the property and the rich result it belongs to, for example Missing required property: offers.priceCurrency (Merchant listing). Google lists the same requirements on its structured data documentation page for that feature.
No structured data found
The page has no JSON-LD, microdata or RDFa that the browser could see. If your markup is added by a plugin or tag manager, check that it loads on the live page.
Built by John Rippy | Actor Arsenal