# Structured Data Validator: Schema & Rich Results (`offerastudio/structured-data-validator`) Actor

Bulk-check pages for Schema.org structured data: JSON-LD (incl. @graph), Microdata and RDFa. Each Product, Review, Article, Breadcrumb, Organization, LocalBusiness, Event, Recipe, JobPosting, Video and Software app item is checked against Google's documented required and recommended properties.

- **URL**: https://apify.com/offerastudio/structured-data-validator.md
- **Developed by:** [Offera Studio](https://apify.com/offerastudio) (community)
- **Categories:** SEO tools, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 page checkeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Structured Data Validator do?

**Structured Data Validator** checks up to **1,000 web pages per run** for **Schema.org structured data** and tells you, item by item, whether it meets **Google's documented requirements for rich results**. For every page you get:

- 🔎 every **JSON-LD** block (including `@graph` and `@id` references), **Microdata** item and basic schema.org **RDFa** item, and the list of **types found**
- ✅ for each **Product, Offer, AggregateRating, Review, Article / NewsArticle / BlogPosting, BreadcrumbList, FAQPage, Organization, LocalBusiness, Event, Recipe, JobPosting, VideoObject and SoftwareApplication** item: **errors** (missing required properties, invalid values), **warnings** (missing recommended properties) and an **`eligibleForRichResult`** flag (`likely` / `unlikely`) with the reason and a **link to Google's documentation**
- 🧯 **JSON syntax errors** (with the text around the error), **invalid dates and durations**, **prices without currency** or with currency symbols, **ratings outside the scale** and **URLs that aren't absolute**
- 📦 the **raw extracted data** as JSON (up to 20,000 characters per page)
- 💬 a **one-sentence plain-English summary**

Paste your URLs, click **Start**, and download the results as JSON, CSV or Excel, or schedule the check after every release.

> **Honest scope.** The rules are encoded from **Google Search Central's structured data documentation** (required and recommended properties per feature, checked on 1 October 2026). This Actor is **not Google's Rich Results Test** and doesn't use it. Google can still decide not to show a rich result (content guidelines, site quality, indexing), and it may accept or reject edge cases differently. Use the results to find and fix problems at scale, then confirm important pages in Google's own tools.

### Who is this schema checker for?

- **SEO agencies and consultants**: audit a client's product, article or location pages in bulk and hand over a fix list with documentation links.
- **E-commerce teams**: make sure every product page has a valid `Product` with `offers.price` and currency, ratings that fit the scale and absolute image URLs, before Google Search Console complains.
- **Developers and QA**: add a structured data check to your release routine; a broken JSON-LD block or a template change that drops a required property shows up right away.
- **Publishers**: check that articles have `headline`, `image`, `author` and valid ISO 8601 dates.
- **Local businesses and franchises**: check `LocalBusiness` markup (address, opening hours, geo coordinates) across all location pages.

### What is checked?

| Type | Google feature | Required (errors when missing) | Source |
| --- | --- | --- | --- |
| Product (and ProductGroup) | Product snippet | `name`; one of `review`, `aggregateRating`, `offers` | [product-snippet](https://developers.google.com/search/docs/appearance/structured-data/product-snippet) |
| Offer / AggregateOffer | Product snippet | Offer: `price`; AggregateOffer: `lowPrice`, `priceCurrency` | same page |
| Review / AggregateRating | Review snippet | `author`, `reviewRating.ratingValue` / `ratingValue`, `ratingCount` or `reviewCount`; `itemReviewed` + name when not nested | [review-snippet](https://developers.google.com/search/docs/appearance/structured-data/review-snippet) |
| Article, NewsArticle, BlogPosting | Article | none (recommended: headline, image, author, dates) | [article](https://developers.google.com/search/docs/appearance/structured-data/article) |
| BreadcrumbList | Breadcrumb | `itemListElement`; each ListItem `position`, `name`, `item` (not for the last one) | [breadcrumb](https://developers.google.com/search/docs/appearance/structured-data/breadcrumb) |
| FAQPage | FAQ (retired) | `mainEntity`, Question `name`, `acceptedAnswer.text` | [Google changelog](https://developers.google.com/search/updates#removing-faq-rich-result) |
| Organization | Organization | none (recommended: name, url, logo, sameAs, …) | [organization](https://developers.google.com/search/docs/appearance/structured-data/organization) |
| LocalBusiness and subtypes | Local business | `name`, `address` | [local-business](https://developers.google.com/search/docs/appearance/structured-data/local-business) |
| Event and subtypes | Event | `name`, `startDate`, `location`, `location.address` | [event](https://developers.google.com/search/docs/appearance/structured-data/event) |
| Recipe | Recipe | `name`, `image` | [recipe](https://developers.google.com/search/docs/appearance/structured-data/recipe) |
| JobPosting | Job posting | `title`, `description`, `datePosted`, `hiringOrganization`, `jobLocation` (or remote + `applicantLocationRequirements`) | [job-posting](https://developers.google.com/search/docs/appearance/structured-data/job-posting) |
| VideoObject | Video | `name`, `thumbnailUrl`, `uploadDate` | [video](https://developers.google.com/search/docs/appearance/structured-data/video) |
| SoftwareApplication, MobileApplication, WebApplication | Software app | `name`, `offers.price`, `aggregateRating` or `review` | [software-app](https://developers.google.com/search/docs/appearance/structured-data/software-app) |

Also built in from the docs: **FAQ rich results were retired by Google on 7 May 2026**, so FAQPage items are always `unlikely` (the markup is still checked); **online-only events** aren't eligible; **VideoGame alone** isn't eligible; a remote job needs `applicantLocationRequirements`; `nutrition.calories` needs `recipeYield`; geo coordinates need 5 decimals; review stars aren't shown for **self-serving reviews** of a business by itself.

`eligibleForRichResult` is `likely` when the item has no errors, and `unlikely` when it has at least one error or the feature was retired. Warnings never change it.

### How to check structured data in bulk

1. Click **Try for free** and sign in to Apify (the free plan is enough to start).
2. Paste one or more URLs into **Website URLs**, or upload a text file with one URL per line.
3. Optional: set **Pages per website** to check up to 20 pages per site (the start page plus pages linked from it).
4. Click **Start**. The **Overview** tab shows one row per page; **Items** shows one row per item with its errors and warnings; **Syntax and page issues** lists broken JSON-LD blocks.

### Input example

```json
{
    "startUrls": [{ "url": "https://www.example.com/product/123" }, { "url": "shop.example.org" }],
    "maxPagesPerSite": 5
}
```

### Output example

A real row from a run on 1 October 2026 (shortened):

```json
{
    "url": "https://apify.com/",
    "httpStatus": 200,
    "hasStructuredData": true,
    "formatsFound": ["json-ld"],
    "typesFound": ["Organization", "ImageObject", "PostalAddress", "ContactPoint", "WebSite", "SoftwareApplication", "Offer", "CreativeWork"],
    "itemsCount": 2,
    "eligibleItemsCount": 1,
    "errorsCount": 1,
    "richResultsLikely": ["Organization"],
    "richResultsUnlikely": ["Software app"],
    "summary": "2 rich result items: Organization (likely eligible), SoftwareApplication (unlikely: 1 error). Other types: WebSite.",
    "items": [
        {
            "type": "Organization",
            "format": "json-ld",
            "feature": "Organization",
            "name": "Apify",
            "errors": [],
            "warnings": [],
            "eligibleForRichResult": "likely",
            "eligibilityNote": "Organization markup has no required properties; Google uses it to understand your organization (logo, name, contact details), not as a rich result on its own.",
            "docsUrl": "https://developers.google.com/search/docs/appearance/structured-data/organization"
        },
        {
            "type": "SoftwareApplication",
            "format": "json-ld",
            "feature": "Software app",
            "name": "Apify",
            "errors": ["Missing required property \"aggregateRating or review\" (Software app)."],
            "warnings": [],
            "missingRequired": ["aggregateRating or review"],
            "eligibleForRichResult": "unlikely",
            "eligibilityNote": "Fix the 1 error first: Missing required property \"aggregateRating or review\" (Software app).",
            "docsUrl": "https://developers.google.com/search/docs/appearance/structured-data/software-app"
        }
    ],
    "pageIssues": [],
    "jsonLdBlocksCount": 3,
    "extractedJson": "{\"jsonLd\":[{\"@context\":\"https://schema.org\",\"@type\":\"Organization\",\"@id\":\"https://apify.com/#organization\",\"name\":\"Apify\", …"
}
```

Typical messages on other pages look like `offers.price "$19,99" is not a plain number; use a value like 19.99 …`, `offers.price has no currency: add priceCurrency …`, `uploadDate "2026-10-32" is not a valid ISO 8601 date …`, `image "/img/kettle.jpg" is not an absolute URL …` or `JSON-LD block 2: Expected double-quoted property name in JSON at position 167 (line 6 column 79) Near: "…"`.

Pages that can't be checked get a row with an `error` code (`invalid-url`, `blocked-by-robots-txt`, `http-404`, `http-403`, `not-html`, `request-failed`, …) and cost nothing.

### How much does it cost?

This Actor uses **pay per event**. You pay only for pages that were actually checked:

| Event | Price |
| --- | --- |
| Page checked | **$0.003** per page (with or without structured data) |
| Page that failed, was blocked by robots.txt or returned an error | **free** |

- 100 pages cost **$0.30**; 1,000 pages cost **$3**.
- Apify also charges a tiny standard start fee per run ($0.00005 per GB of memory, so $0.00005 at the default 1 GB).
- Apify's free plan includes $5 of monthly usage, enough for over 1,500 checked pages a month.
- Set **Maximum cost per run** in the run options and the Actor stops when it is reached.

### Limitations

- **Not Google's Rich Results Test.** The rules follow Google's public documentation; Google's own parser and policies decide in the end. Content guidelines (e.g. reviews must be visible on the page, no self-serving reviews) can't be fully checked automatically.
- **Static HTML only.** Structured data injected by JavaScript after the page loads (some tag managers, client-side apps) isn't seen. Google renders JavaScript, so such markup can still work for Google.
- **Only Google rich result types are checked in depth.** Other types (WebSite, WebPage, Person, Book, Movie …) are listed in `typesFound` but not validated. Merchant listing (Shopping) requirements beyond product snippets are only partly covered (missing image, missing currency).
- **Organization**: Google lists about 30 optional properties "if applicable"; only the core ones (name, url, logo, sameAs, description, address, contact) are reported as warnings.
- **RDFa**: basic schema.org RDFa (vocab, typeof, property, resource, `schema:` prefix). Other vocabularies and full RDFa processing are out of scope. Open Graph tags are not structured data for rich results and are ignored.
- **Bot protection.** Some large sites block automated visitors (HTTP 403/429); those pages get a free error row. The Actor respects robots.txt, uses no proxy and waits at least one second between requests to the same site.
- At most 100 items are reported per page (`itemsTruncated` tells you when there were more), and the extracted JSON is capped at 20,000 characters.

### FAQ

#### Is this the same as Google's Rich Results Test?

No. It applies the required and recommended properties that Google documents for each feature, plus common value checks, to many pages at once. Google's own test and Search Console remain the final word for a single page.

#### Why is my FAQ markup "unlikely"?

Google stopped showing FAQ rich results on 7 May 2026 and removed the documentation. The Actor still checks the markup, but no FAQ rich result will appear.

#### Why is an Organization or Article "likely" with no required properties?

Google documents no required properties for them; the markup helps Google understand your organization or article. The warnings list the recommended properties that are missing.

#### Does it support @graph and @id references?

Yes. Items in `@graph` are checked one by one, and references like `"author": {"@id": "#person"}` are followed to the full node on the same page.

#### Can I check a whole site?

Set **Pages per website** up to 20 to follow links from each start URL, or paste up to 1,000 URLs (for example from your sitemap) per run.

### More tools from the same developer

All pay-per-result, no proxy or login needed, built and maintained by the same developer:

**Website audits**

- [Website Accessibility Checker: WCAG 2.2 & EAA](https://apify.com/offerastudio/website-accessibility-audit): accessibility issues with fixes, SEO basics and security headers.
- [Cookie & Tracker Audit: GDPR Consent Checker](https://apify.com/offerastudio/cookie-tracker-audit): cookies and tracking tags that load before consent.
- [AI Crawler Access Checker: robots.txt & llms.txt](https://apify.com/offerastudio/ai-crawler-access-audit): which AI crawlers a site allows, plus llms.txt.
- [Website Change Monitor: Diffs, Prices & Alerts](https://apify.com/offerastudio/website-change-monitor): get a row only when a page changes, with a clean diff.
- [Policy Change Monitor: Privacy & Terms Tracker](https://apify.com/offerastudio/policy-change-monitor): privacy policy and terms changes, classified clause by clause.
- [SaaS Pricing Monitor: Track Competitor Plans](https://apify.com/offerastudio/saas-pricing-monitor): competitor pricing plans as structured data, with price-change diffs.
- [Sitemap Change Monitor: New & Removed URLs](https://apify.com/offerastudio/sitemap-change-monitor): new, removed and changed URLs from a site's sitemaps.
- [Site SEO Crawler: Broken Links & On-Page Audit](https://apify.com/offerastudio/site-seo-crawler-audit): site-wide crawl for broken links, redirects and on-page SEO issues.
- [Website Tech Stack Detector: Bulk Lead Filters](https://apify.com/offerastudio/website-tech-stack-detector): technologies used by websites, with filters for lead lists.
- [Domain Availability & Expiry Checker (RDAP)](https://apify.com/offerastudio/domain-whois-availability): domain availability, registrar and expiry dates from RDAP.
- [Status Page SLA Monitor: Uptime & Incidents](https://apify.com/offerastudio/status-page-sla-monitor): SaaS vendor uptime, incidents and a monthly SLA table from public status pages.

**Company data and compliance**

- [Company Contact Finder: Emails, Phones & Socials](https://apify.com/offerastudio/company-contact-finder): contact details published on company websites.
- [UK New Companies Feed: Companies House Daily](https://apify.com/offerastudio/uk-new-companies-feed): newly incorporated UK companies with sector filters.
- [EU VAT Number Validator: Bulk VIES Checker](https://apify.com/offerastudio/eu-vat-number-validator): bulk VAT checks with name, address and consultation number.
- [LEI Corporate Tree: GLEIF Parents & Subsidiaries](https://apify.com/offerastudio/gleif-lei-corporate-tree): LEI lookup with parents, subsidiaries and a KYC summary.
- [UK Company Distress Watch: Insolvency Alerts](https://apify.com/offerastudio/uk-company-distress-watch): administrations, liquidations and winding-up petitions from The Gazette.
- [IBAN Validator: Bulk Check & Bank Lookup](https://apify.com/offerastudio/iban-bank-validator): IBAN format and checksum, plus bank name and BIC where open data exists.
- [Sanctions Screening: OFAC, EU, UN & UK Lists](https://apify.com/offerastudio/sanctions-screening): names screened against official sanctions lists, with match scores.
- [OSHA & EPA Violation Monitor: Fines by Company](https://apify.com/offerastudio/osha-epa-violation-monitor): US OSHA and EPA enforcement cases and penalties by company.
- [Email List Precheck: Syntax, MX & Disposable Check](https://apify.com/offerastudio/email-list-precheck): cheap email list hygiene before a real verification.
- [UK Company Officer Changes: Director & PSC Alerts](https://apify.com/offerastudio/uk-company-officer-changes): director, owner, address and status changes for a watchlist of UK companies.
- [FDA Warning Letters Monitor: By Company & Subject](https://apify.com/offerastudio/fda-warning-letters-monitor): FDA warning letters by company and subject, with cited regulations.
- [Supplier Risk Report: Sanctions, VAT & Insolvency](https://apify.com/offerastudio/supplier-risk-report): one risk row per supplier from eight official registers, with changes since last run.
- [Brand Impersonation Domain Monitor: Look-alikes](https://apify.com/offerastudio/brand-impersonation-domain-monitor): look-alike domains and certificates that imitate your brand, with a risk score.

**Media and AI**

- [Audio & Video Transcriber: Podcasts, SRT, Speakers](https://apify.com/offerastudio/audio-video-transcriber): audio, video, podcasts and social links to text, SRT and VTT.
- [Podcast Mention Alerts: Brand Mentions by Second](https://apify.com/offerastudio/podcast-mention-alerts): where your brand is said in new podcast episodes, with the exact second.
- [News Brand Mentions Monitor: New Articles Only](https://apify.com/offerastudio/news-brand-mentions-monitor): new news articles about your brand, people or topics.
- [YouTube Channel Monitor: New Videos & Growth](https://apify.com/offerastudio/youtube-channel-monitor): new videos and view growth of the channels you watch.

**Market signals**

- [US WARN Layoff Notices: 12 States Daily Feed](https://apify.com/offerastudio/us-warn-layoff-notices): layoff and plant closure notices from official state sources.
- [US Product Recalls Monitor: FDA & CPSC Feed](https://apify.com/offerastudio/us-product-recalls-monitor): FDA and CPSC recalls in one feed, with severity.
- [EU Tenders Feed: TED Public Procurement Alerts](https://apify.com/offerastudio/eu-tender-feed): EU public tenders from TED with CPV, country and value filters.
- [Liquor License Openings: New Bars & Stores (US)](https://apify.com/offerastudio/liquor-license-openings): new US liquor licences from official state open data.
- [Clinical Trials Change Monitor: Status & Updates](https://apify.com/offerastudio/clinicaltrials-change-monitor): status, enrollment and results changes on ClinicalTrials.gov studies.
- [Career Site Jobs Monitor: ATS Jobs & New Roles](https://apify.com/offerastudio/career-site-jobs-monitor): open roles from company career sites, with new and closed roles since the last run.
- [App Reviews Monitor: App Store & Google Play](https://apify.com/offerastudio/app-store-reviews-monitor): app reviews from both stores, only new ones in monitor mode.
- [US Federal Contracts Feed: SAM.gov & USAspending](https://apify.com/offerastudio/us-federal-contracts-feed): SAM.gov contract opportunities with the buyer's award history.
- [Grants.gov Opportunities: US Federal Grants Feed](https://apify.com/offerastudio/grants-gov-opportunities): US federal grant opportunities by keyword, eligibility and agency.
- [Federal Register Monitor: US Rules & Notices Feed](https://apify.com/offerastudio/federal-register-monitor): new US rules, proposed rules and notices by agency or topic.
- [B2B Sales Trigger Feed: Hiring + Tech Leads](https://apify.com/offerastudio/b2b-sales-trigger-feed): companies hiring for a role and using (or not using) a technology, with contacts.
- [Local Business Leads: OpenStreetMap, No Website](https://apify.com/offerastudio/local-business-leads-osm): local businesses by city and category, including those with no website.
- [Solana Token Pair Monitor: New & Trending Pairs](https://apify.com/offerastudio/solana-token-pair-monitor): new and trending Solana pairs with liquidity, volume and safety flags.

### Feedback

Found a false alarm, or missing a type or rule? Open an issue on the **Issues** tab with the page URL.

# Changelog

This Actor's version history is a separate document: https://apify.com/offerastudio/structured-data-validator/changelog.md

# Actor input Schema

## `startUrls` (type: `array`):

Pages to check, up to 1,000 per run. Bare domains such as example.com work too. Each page becomes one row in the results. You can also upload a text file with one URL per line.

## `maxPagesPerSite` (type: `integer`):

1 = check only the URLs you entered. Set up to 20 to also follow links on the same website (same hostname) and check those pages too, for example product, category and blog pages. Every checked page is billed as one page.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://apify.com"
    },
    {
      "url": "https://developers.google.com/search/docs/appearance/structured-data/breadcrumb"
    }
  ],
  "maxPagesPerSite": 1
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `items` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://apify.com"
        },
        {
            "url": "https://developers.google.com/search/docs/appearance/structured-data/breadcrumb"
        }
    ],
    "maxPagesPerSite": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("offerastudio/structured-data-validator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [
        { "url": "https://apify.com" },
        { "url": "https://developers.google.com/search/docs/appearance/structured-data/breadcrumb" },
    ],
    "maxPagesPerSite": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("offerastudio/structured-data-validator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://apify.com"
    },
    {
      "url": "https://developers.google.com/search/docs/appearance/structured-data/breadcrumb"
    }
  ],
  "maxPagesPerSite": 1
}' |
apify call offerastudio/structured-data-validator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,offerastudio/structured-data-validator"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/jLkj9oD4pMkgO9uMZ/builds/Aw50g2zh5gyhyvCHA/openapi.json
