# Product Schema Checker – Rich Results & AI Shopping, Bulk (`fast_data_asap/product-schema-checker`) Actor

Bulk-validate schema.org Product JSON-LD on product pages: price, availability, GTIN, reviews, shipping. 0–100 score + fix hints. $2 per 1,000.

- **URL**: https://apify.com/fast_data_asap/product-schema-checker.md
- **Developed by:** [Fast Data](https://apify.com/fast_data_asap) (community)
- **Categories:** E-commerce, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.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

## Product Schema Checker – JSON-LD & AI Shopping Readiness

Check any product page for **schema.org Product structured data** and find out whether it has what **Google merchant listings** and **AI shopping agents** (ChatGPT Shopping, Perplexity, Gemini, Copilot) need. You get a **0-100 score**, the missing fields and short fix hints for each URL.

### What it does

For every URL you give it, the actor:

1. Fetches the public HTML over plain HTTP. It uses no browser, no login and no bot-protection bypass, so it is fast and cheap.
2. Extracts **all** structured data: JSON-LD (including `@graph`), microdata, RDFa and Open Graph.
3. Finds the main `Product` or `ProductGroup`, including its variants, `AggregateOffer` and `priceSpecification`.
4. Validates the fields Google and AI agents rely on:
   - **Required:** `name`, `image`, `offers.price`, `offers.priceCurrency`, `offers.availability`
   - **Recommended:** `brand`, `gtin`/`mpn` (+ `sku`), `description`, `aggregateRating`, `review`, `itemCondition`, `shippingDetails`, `hasMerchantReturnPolicy` (on the offer or on the Organization), `url`
5. Returns one flat, AI-friendly row per URL with the score, grade, missing fields and copy-paste fix hints.

### Who it's for

- **Shopify, WooCommerce, Magento and other store owners** who want their products shown in Google Shopping and AI shopping answers
- **SEO agencies** auditing product pages for many clients at once
- **Developers** adding a structured-data check to CI or monitoring
- **Competitive research**: see how big retailers mark up their products

### Why use this instead of the alternatives

- **Bulk.** Google's Rich Results Test checks one URL at a time by hand. This actor checks hundreds with one API call.
- **Built for AI shopping readiness.** It checks shipping details, return policy and GTINs, which AI agents need to compare products across stores. Generic metadata scrapers don't check these.
- **Flat output.** Every field is a column, ready for Sheets, BI tools, n8n or an LLM.
- **Fair price.** You pay only for pages where a Product was found and checked. Pages without product markup, 404s, timeouts and bot-challenge pages are free.

### Input example

```json
{
  "startUrls": [
    "https://hydrogen.shop/products/the-full-stack",
    "https://www.apple.com/shop/buy-iphone/iphone-16",
    "https://www.allbirds.com/products/mens-tree-runners"
  ],
  "maxConcurrency": 5
}
```

Optional: `maxRetries` (default 1) and `proxyConfiguration`, if a site rate-limits data-center IPs. Pages that need JavaScript to render their structured data, or that serve a bot challenge, are reported as `error` or score 0 and cost nothing when blocked.

### Output example

These values come from a real run:

```json
{
  "url": "https://www.allbirds.com/products/mens-tree-runners",
  "status": "ok",
  "httpStatus": 200,
  "schemaTypes": ["ProductGroup", "Brand", "Offer", "Product", "AggregateRating"],
  "syntaxesFound": ["json-ld", "opengraph"],
  "productType": "ProductGroup",
  "name": "Men's Tree Runner",
  "brand": "Allbirds",
  "sku": "MENS_TREE_RUNNERS",
  "gtin": null,
  "price": 100,
  "priceCurrency": "USD",
  "availability": "InStock",
  "hasShippingDetails": false,
  "hasReturnPolicy": false,
  "missingRequired": [],
  "missingRecommended": ["productIdentifier", "aggregateRating", "review", "shippingDetails", "hasMerchantReturnPolicy"],
  "score": 73,
  "grade": "C",
  "googleMerchantEligible": true,
  "fixHints": [
    "Only \"sku\" found: add \"gtin\" (or \"mpn\") so Google and AI agents can match the product across stores.",
    "Add \"aggregateRating\" with ratingValue and reviewCount (only if reviews are shown on the page).",
    "Add at least one \"review\" (only if reviews are shown on the page).",
    "Add \"shippingDetails\" (OfferShippingDetails with shippingRate, shippingDestination, deliveryTime) to the Offer.",
    "Add \"hasMerchantReturnPolicy\" (MerchantReturnPolicy with applicableCountry, returnPolicyCategory, merchantReturnDays) to the Offer or Organization."
  ]
}
```

Other results from the same run: the Shopify Hydrogen demo store snowboard scored **70** (no GTIN, shipping or return policy). Apple's iPhone 16 page scored **68**: it has shipping and return policy markup, but the offer has no `availability` and the product has no `brand`.

Other output fields: `finalUrl`, `productCount`, `isProductPage`, `ogType`, `ogPrice`, `mpn`, `itemCondition`, `offerCount`, `variantCount`, `imageCount`, `image`, `description`, `ratingValue`, `reviewCount`, `checkedAt`, `error`.

#### Scoring

Each required field is worth 12 points (60 in total). The recommended fields add up to 40 points: shipping details 8, return policy 7, GTIN/MPN 6, brand 5, rating 4, description 3, condition 3, review 2, url 2. Grades: A ≥ 90, B ≥ 75, C ≥ 60, D ≥ 40, F below that.

### Pricing

Pay per event: **$0.002 per checked product page** ($2 per 1,000 pages). Pages without Product markup and failed, blocked or unreachable URLs are not charged.

### Use via API, n8n or MCP

**API (synchronous, returns the items):**

```bash
curl -X POST "https://api.apify.com/v2/acts/fast_data_asap~product-schema-checker/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls":["https://www.allbirds.com/products/mens-tree-runners"]}'
```

**n8n / Make / Zapier:** use the Apify node or app, choose *Run Actor* with `fast_data_asap/product-schema-checker`, and pass `startUrls`. Then read the dataset items.

**MCP (Claude, Cursor, other AI agents):** add the server `https://mcp.apify.com?tools=fast_data_asap/product-schema-checker`. Your agent can then audit product pages on its own.

### Limits

The actor reads only publicly available HTML and collects no personal data. Some large retailers block automated HTTP requests or render their markup with JavaScript. Those URLs come back with `status: "error"` or a score of 0 and are free.

# Actor input Schema

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

Product pages to check. Each page is fetched as plain HTML (no browser) and all structured data (JSON-LD, microdata, RDFa, Open Graph) is validated.

## `maxConcurrency` (type: `integer`):

How many pages are fetched in parallel.

## `maxRetries` (type: `integer`):

Retries on network errors and 5xx/429 responses.

## `proxyConfiguration` (type: `object`):

Optional. Pages are fetched directly by default. Enable Apify Proxy if a site rate-limits data-center traffic.

## Actor input object example

```json
{
  "startUrls": [
    "https://hydrogen.shop/products/the-full-stack",
    "https://www.apple.com/shop/buy-iphone/iphone-16",
    "https://www.allbirds.com/products/mens-tree-runners"
  ],
  "maxConcurrency": 5,
  "maxRetries": 1,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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": [
        "https://hydrogen.shop/products/the-full-stack",
        "https://www.apple.com/shop/buy-iphone/iphone-16",
        "https://www.allbirds.com/products/mens-tree-runners"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fast_data_asap/product-schema-checker").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": [
        "https://hydrogen.shop/products/the-full-stack",
        "https://www.apple.com/shop/buy-iphone/iphone-16",
        "https://www.allbirds.com/products/mens-tree-runners",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("fast_data_asap/product-schema-checker").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": [
    "https://hydrogen.shop/products/the-full-stack",
    "https://www.apple.com/shop/buy-iphone/iphone-16",
    "https://www.allbirds.com/products/mens-tree-runners"
  ]
}' |
apify call fast_data_asap/product-schema-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fast_data_asap/product-schema-checker"
        }
    }
}
```

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/GIRM9NHQzq0jqAKkk/builds/OKsN2TZamFEDFul1Z/openapi.json
