Schema Markup & JSON-LD Validator avatar

Schema Markup & JSON-LD Validator

Pricing

$0.05 / 1,000 page audits

Go to Apify Store
Schema Markup & JSON-LD Validator

Schema Markup & JSON-LD Validator

Validate schema markup on public pages. Extract JSON-LD, Microdata, RDFa, Open Graph, Twitter Cards, meta tags, schema.org types, issue counts, and rich-result readiness signals.

Pricing

$0.05 / 1,000 page audits

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

3

Monthly active users

34 minutes ago

Last modified

Share

🔎 Schema Markup & JSON-LD Validator for structured data

SEO specialists, developers, and site owners can use Schema Markup & JSON-LD Validator to check public pages. It saves one audit row for each page it successfully fetches and checks. Each row returns schema.org types, JSON-LD, Microdata, RDFa, issue details, page metadata, and rich-result readiness signals, so you can find structured-data problems before a release or during an SEO audit.

🎯 Use cases

📊 Returned data

The results output field links to an Apify dataset. Each saved row is one page audit. Full, Schema.org, and JSON-LD focus use the same top-level row shape; fields that do not apply can be empty or null.

🧾 Output fields

FieldTypeWhat it does
requestedUrlstringURL sent in the HTTP request before redirects.
urlstringFinal URL of the audited page after redirects.
titlestring or nullHTML title text, or null when it is not available.
canonicalUrlstring or nullCanonical URL declared by the page, or null when absent.
statusCodeintegerHTTP status code returned for the fetched page.
contentTypestring or nullHTTP content type returned for the page, or null when unavailable.
crawlDepthintegerDepth from the submitted URL: 0 for submitted pages and higher for same-site discoveries.
auditedAtdate-time stringTime when the page audit finished.
schemaTypesarray of stringsSchema.org type names found in all markup formats.
markupSummaryobjectCounts and presence flags for structured-data and metadata surfaces.
markupSummary.hasStructuredDatabooleanWhether JSON-LD, Microdata, or RDFa markup is present.
markupSummary.jsonLdBlocksintegerNumber of JSON-LD blocks found.
markupSummary.microdataItemsintegerNumber of Microdata items found.
markupSummary.rdfaItemsintegerNumber of RDFa items found.
markupSummary.openGraphPropertiesintegerNumber of Open Graph properties found.
markupSummary.twitterCardPropertiesintegerNumber of Twitter Card properties found.
markupSummary.metaTagsintegerNumber of general meta tags found.
validationStatusstringPage-level status: valid, warning, or error.
issueCountsobjectIssue totals grouped by severity.
issueCounts.errorsintegerNumber of errors found.
issueCounts.warningsintegerNumber of warnings found.
issueCounts.infointegerNumber of informational findings.
issuesarray of objectsFindings that explain what to fix and where it was found.
issues[].severitystringSeverity of the finding: error, warning, or info.
issues[].codestringStable code for the finding type.
issues[].messagestringShort explanation of the finding and what to fix.
issues[].formatstring or nullMarkup format linked to the finding, or null.
issues[].schemaTypestring or nullSchema.org type linked to the finding, or null.
issues[].propertystring or nullMarkup property linked to the finding, or null.
issues[].evidencestring or nullShort source detail that helps locate the finding, or null.
jsonLdarray of objectsParsed JSON-LD blocks with status, types, and issues.
jsonLd[].indexintegerOne-based position of the JSON-LD block.
jsonLd[].validbooleanWhether the JSON-LD block passed its checks.
jsonLd[].contextstring, array, object, or nullJSON-LD context value, or null when missing.
jsonLd[].typesarray of stringsSchema.org types found in the block.
jsonLd[].dataobjectParsed JSON-LD value from the block. It keeps the source fields found in that block.
jsonLd[].issuesarray of stringsIssue codes linked to the block.
microdataarray of objectsMicrodata items with types, properties, and issues.
microdata[].indexintegerOne-based position of the Microdata item.
microdata[].typesarray of stringsSchema.org types found in the Microdata item.
microdata[].propertiesobjectProperties parsed from the Microdata item. It keeps source fields.
microdata[].issuesarray of stringsIssue codes linked to the Microdata item.
rdfaarray of objectsRDFa items with types, properties, and issues.
rdfa[].indexintegerOne-based position of the RDFa item.
rdfa[].typesarray of stringsSchema.org types found in the RDFa item.
rdfa[].propertiesobjectProperties parsed from the RDFa item. It keeps source fields.
rdfa[].issuesarray of stringsIssue codes linked to the RDFa item.
metadataobjectOpen Graph, Twitter Card, and meta tag values found on the page.
metadata.openGraphobjectOpen Graph names and values found on the page.
metadata.twitterCardobjectTwitter Card names and values found on the page.
metadata.metaTagsobjectGeneral meta tag names and values found on the page.
richResultsobjectRich-result checks based on the markup and its issues.
richResults.readinessobjectOverall rich-result readiness level and its reasons.
richResults.readiness.levelstringReadiness level: ready, needsFixes, or notDetected.
richResults.readiness.reasonsarray of stringsReasons for the readiness level.
richResults.candidatesarray of objectsRich-result candidates found in the markup.
richResults.candidates[].typestringSchema.org type used for the candidate.
richResults.candidates[].eligiblebooleanWhether the Actor's known required fields are present.
richResults.candidates[].requiredMissingarray of stringsRequired properties that are missing.
richResults.candidates[].recommendedMissingarray of stringsRecommended properties that are missing.
richResults.candidates[].issueCodesarray of stringsIssue codes linked to the candidate.

The data, properties, and metadata objects keep source fields that the page provides. Their extra field names can vary by page.

🧪 Example page audit

This complete row comes from a successful full audit of a public page with no detected structured data. It shows the empty arrays and null values that can appear in a real audit row.

{
"requestedUrl": "https://schema.org/docs/howwework.html",
"url": "https://schema.org/docs/howwework.html",
"title": "How we work - schema.org",
"canonicalUrl": null,
"statusCode": 200,
"contentType": "text/html",
"crawlDepth": 1,
"auditedAt": "2026-08-01T04:29:39.998Z",
"schemaTypes": [],
"markupSummary": {
"hasStructuredData": false,
"jsonLdBlocks": 0,
"microdataItems": 0,
"rdfaItems": 0,
"openGraphProperties": 0,
"twitterCardProperties": 0,
"metaTags": 2
},
"validationStatus": "valid",
"issueCounts": {
"errors": 0,
"warnings": 0,
"info": 0
},
"issues": [],
"jsonLd": [],
"microdata": [],
"rdfa": [],
"metadata": {
"openGraph": {},
"twitterCard": {},
"metaTags": {
"viewport": "width=device-width, initial-scale=1",
"description": "Schema.org is a set of extensible schemas that enables webmasters to embed\n structured data on their web pages for use by search engines and other applications."
}
},
"richResults": {
"readiness": {
"level": "notDetected",
"reasons": [
"No common rich-result candidate types were detected."
]
},
"candidates": []
}
}

🚀 Running the Actor

  1. Add one or more public page URLs in Page URLs.
  2. Choose Full structured-data audit, Schema.org markup only, or JSON-LD only.
  3. Choose Submitted URLs only for exact page checks, or Follow same-site links to discover more pages on the same site.
  4. Set Maximum pages when you want a work limit. Leave it empty to return all available page results until the source is exhausted.
  5. Run the Actor and open the dataset from the results output field.

The prefilled Schema.org Article and Product URLs are public pages you can use to inspect the output before adding your own pages.

⚙️ Input

🧾 Input fields

FieldTypeWhat it does
startUrlsarray of URL objectsAdd up to 1,000 public page URLs to check for structured data and rich-result signals.
startUrls[].urlstringURL in each page entry.
auditFocusstringChoose full, schemaOrg, or jsonLd to set how much structured data to check.
crawlScopestringChoose submittedUrls to check only added URLs, or sameSite to follow links on the same site.
maxPagesinteger, optionalStops after this many submitted and discovered pages. Leave it empty to return all available page results until the source is exhausted.

🧪 Input example

This example uses the public fields from a small full audit:

{
"startUrls": [
{
"url": "https://schema.org/Article"
},
{
"url": "https://schema.org/Product"
}
],
"auditFocus": "full",
"crawlScope": "sameSite",
"maxPages": 10
}

🎯 Audit focus

  • full checks JSON-LD, Microdata, RDFa, Open Graph, Twitter Cards, canonical data, and meta tags.
  • schemaOrg focuses on Schema.org markup in JSON-LD, Microdata, and RDFa.
  • jsonLd runs a focused JSON-LD check.

🧭 Pages to check

  • submittedUrls checks only the URLs in startUrls.
  • sameSite follows links on the same site from submitted pages while respecting maxPages.

💳 Pricing

This Actor uses pay-per-event pricing. A page-audit charge applies when a public page is fetched, audited, and saved to the dataset. The current price is shown in the Pricing tab.

🔌 Integrations

Use the Apify dataset or API to read saved audits and connect them to your workflow. For an Apify integrations walkthrough, see:

❓ FAQ

🧪 Does this run Google's official Rich Results Test?

No. The Actor checks markup in the fetched HTML. Use Google's official tool as the final authority for Google-specific eligibility.

⚙️ What happens when a page uses client-side JavaScript?

The Actor checks the initial public HTML response. Markup added later by client-side JavaScript or hidden behind a private login may not appear.

Use Submitted URLs only when your input list already contains every page to check. Use Follow same-site links when one or more public pages should lead to more pages on the same site within maxPages.

🧾 Which markup formats can it check?

A full audit checks JSON-LD, Microdata, RDFa, Open Graph, Twitter Cards, canonical data, and meta tags. A Schema.org audit focuses on Schema.org markup, and a JSON-LD audit focuses on JSON-LD.

🧮 What happens if I leave Maximum pages empty?

The Actor returns all available page results until the source is exhausted. Set a number when you want to limit submitted and discovered pages.

🛠️ Does it repair markup or return raw HTML?

No. It reports findings from fetched markup. It does not generate or repair Schema.org markup, and it does not save complete raw page HTML.

🔐 Can I audit private pages?

No. The input is for public page URLs. Pages behind a login are outside this Actor's scope.

⚠️ Why can a row have a warning status?

A warning is a finding in the page audit, not a missing row. Use issueCounts and issues to see the severity and details.

📝 Changelog

  • 0.2: Added requested and final URL provenance, audit timestamps, expanded page limits, and a clearer page-audit overview.
  • 0.1: Initial release.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré