Audit Schema Markup: Parse, Don't Claim
Audit schema markup to see if JSON-LD is present, parseable, and consistent. A valid block does not grant rich-result eligibility.
Author credentials: William Zhu is cofounder of InfiniSynapse (GitHub @allwefantasy · auto-coder). Desk: shipping SEO Health and the /en/tool/ visibility pages. No personal LinkedIn published. About: team / editorial standards.
Publisher credentials: InfiniSynapse has public profiles on GitHub, YouTube, and X. A 2026 WAIC Future Tech OPC excellence award covers the Agentic Data Infra entry (WAIC; third-party recap: Xinhua / Caohejing). That award does not review this page or SEO Health. Method CLI: infinitegrowth on npm. Archive: recognition and scope notes.

On this page
By William Zhu · Cofounder, InfiniSynapse · Last updated: 2026-09-24 · Last verified: 2026-09-11 · Methods: Fetched six public schema and publisher pages; extracted raw-HTML JSON-LD and recorded HTTP status, parsed blocks, and named types. Entity review keeps URL reachability, visible-subject match,
sameAsconsistency, and ownership evidence as separate findings. Evidence observed 2026-09-11; not an official Google score.
Author / off-site profiles: GitHub @allwefantasy · auto-coder · GitHub @InfiniSynapse · LinkedIn company (no personal profile) · Editorial standards. No personal LinkedIn or vendor badge.
Reviewed by: InfiniSynapse Data Team · method review 2026-09-11. First-party method review.
Trust / COI: About · Corrections · Publishing principles · Privacy · Terms. SEO Health is commercial. The CLI contract and dated public probe below are observed. The InfiniSynapse Data Team publishes this method.
TL;DR
Audit schema markup to see if JSON-LD is present, parseable, and consistent. A valid block does not grant rich-result eligibility. The Chrome extension already extracts structured data locally. JSON-LD parse is deterministic. A dead identifier, visible-subject mismatch, inconsistent sameAs, or unsupported ownership claim can become an InfiniSynapse punch list. Robots, GPTBot, and llms.txt are sibling jobs, not schema markup audit’s Target.
Direct answer: Run a schema markup audit to parse what the page ships. Markup is not eligibility. A valid block can still fail a rich-result tester. An empty block can still be a fine page.
What you'll learn:
- How a schema markup audit differs from an official rich-result test
- Why local JSON-LD parse is a lights-style check, not a Google 100
- When a missing type becomes a punch list instead of a vanity score
- A dated public probe with raw fields, status handling, and explicit limitations
- Failure modes that treat crawler files as schema markup audit
We evaluate local JSON-LD parses hands-on as the InfiniSynapse Data Team. Our hands-on role is to publish the raw type inventory and stop before a valid block is marketed as eligible.
What a schema markup audit is
Key Definition: A schema markup audit is a local, deterministic read of structured data on a URL: parse named types, record identifier reachability, compare each node with the visible subject, test sameAs consistency, and retain ownership evidence separately. It is not a rich-result admission ticket, not an official Google health score, and not a crawler-access audit.
Observed hub CLI (2026-09-11, infinitegrowth@0.1.1): seo-health check https://infinisynapse.com/contest/vibe-coding/results --format json --lang en exited 0. issues[].status listed warning on Title Length (30) and Meta Description (71). Image Alt Text was good (81/81). Process exit 0 is not a clean page. The dated public-page probe below reports raw observations.
Independent citation: According to [JSON-LD](https://en.wikipedia.org/wiki/JSON-LD), JSON-LD is a JSON syntax for Linked Data used in many Schema.org scripts. Wikipedia's JSON-LD page is the third-party rule this write-up holds to. The dated probe below is evidence, not that rule.
JSON-LD is the script-block encoding most product pages ship.
This hub stays on markup. Crawler policy is a sibling. Use the robots.txt checker when the question is allow or disallow, not @type. A schema markup audit that starts in robots.txt is already on the wrong file.
Chrome reads the script blocks and in-element encodings on the machine. The eight modules around that extract still matter: title, meta, headings, density, images, links, tech, and speed. Traffic lights are not an official Google score. A clean @type on a blocked or empty body is still a failed page. GSC overlays, when you need them later, stay limited to the export window you upload.
A local-parse audit framework
Keep parse local. Keep eligibility official. Keep narrative optional. A schema markup audit that mixes those three layers will sell a green parse as a rich result.
JSON-LD parse stays local
Chrome extracts structured data on the machine unless you start AI EEAT. The parse either succeeds or it fails. There is no “mostly valid” traffic light that is also a Google 100. A schema markup audit reports the type list, exact URL status, visible-subject mismatches, inconsistent sameAs links, and missing ownership evidence. It does not rewrite the page.
Run the page-health tool beside the schema markup audit to catch title, metadata, heading, image, link, technical, and speed defects that structured data cannot repair. Those lights still apply after a clean parse. An SEO health checker pass is the cheap companion, not a substitute for the type list.
Missing type becomes a punch list
The extract does not invent the missing Organization, Article, or Product block. It lists the gap. Credits and login apply when you ask for that narrative list. The parse itself does not spend the long-task budget.
Eight lights still apply after markup
A page can ship valid Article JSON-LD and still fail title, canonical, or speed. A schema markup audit that ignores the eight modules will celebrate a script tag on a soft 404.
Website indexation is the eligibility check for noindex and canonical collisions. Title copy is a different module.
A SEO title checker pass explains a CTR problem that markup never caused.
Site-wide type gaps belong in a sample, not a single URL. A website SEO audit draws 50–500 pages from the sitemap. The seo-health CLI (npm i -g infinitegrowth) can emit JSON for a gate. SEO CI/CD is how a pull request fails when the template drops @type.
Markup versus rich-result eligibility
Eligibility is Google’s tester and Google’s systems. A schema markup audit is your parse. Those objects share a vocabulary. They do not share a verdict.
JSON-LD, RDFa, and Microdata
Prefer one encoding per template. Mixed JSON-LD plus leftover Microdata is a common desk miss. The schema markup audit should say which encoding won and whether a second encoding contradicts it. Do not “fix” eligibility by adding a third copy of the same type.
Official testers versus this audit
Official testers answer “does this URL currently look eligible for a named rich result.” This schema markup audit asks whether the shipped types parse, whether identifiers respond, whether each node matches the visible subject, whether sameAs claims agree, and whether ownership claims have evidence. Keep both. Do not paste a green parse into a ticket titled “we should be in the carousel.”
Trust evidence is a different surface. An EEAT checker reads experience and author evidence. It does not score markup eligibility.
Cannot score EEAT is the honest sibling when the body is empty. Neither page replaces the type list.
Landscape of extractors and testers
How to run the local parse
Run the schema markup audit as four inspectable steps. JSON-LD parse is local. Preserve missing types, identifier reachability, visible-subject mismatches, sameAs conflicts, and ownership evidence as distinct observations.
Step 1 — Extract structured data in Chrome
Open the page in Chrome with the SEO Health extension. Confirm the extract happened on the machine. A schema markup audit that depends on a remote crawl for the first read is already past the product’s local path. After repairing a template, rerun the eight-light page check on the production URL so markup and page health share one timestamp.
Step 2 — Confirm the type and entity
List @type values. For each named node, record the identifier’s exact network result, compare its name and canonical URL with the visible organization, article, or product, check every sameAs target for the same subject, and attach ownership or account-control evidence when ownership is claimed. A stop at “JSON parsed” will miss a Product that points at a dead SKU or an Organization with a profile you cannot defend.
Step 3 — Separate siblings: robots, GPTBot, llms.txt
If the question is whether GPTBot or another public user agent may fetch the URL, leave this hub. The robots.txt checker is the live tool for allow and disallow. llms.txt and GPTBot allow lists are cluster notes under this pillar. A schema markup audit does not rewrite those files.
Step 4 — Turn gaps into an assignable list
Name the missing type, unreachable identifier, visible-subject mismatch, inconsistent sameAs, or unsupported ownership claim as its own ticket. Do not name a rich-result deadline. The schema markup audit ends at an assignable gap. Optional narrative of that list is a credited InfiniSynapse task. Chrome stays local unless you start AI EEAT.
When InfiniSynapse writes the punch list
Login and credits apply to EEAT, visibility, and GSC overlays, and to a long-task write-up of markup gaps. The schema markup audit parse does not need that budget. Do not present the punch list as an official Google score. Do not present a service-case traffic story as product proof for structured data.
If you later overlay a Performance file to see whether a type change moved queries, stay inside that export window. Sampling and anonymized queries stay in the file. The model must not rewrite cells. That overlay is a sister job, not a rich-result proof.
Independent citation 2: According to [RDFa](https://en.wikipedia.org/wiki/RDFa), RDFa is a way to embed structured data in HTML attributes. Wikipedia supplies the RDFa definition here; the six-URL extraction remains the article’s independent observed evidence.
Public-page audit sample: six URLs, two dimensions
Observed sample (2026-09-11, InfiniSynapse Data Team): We sent one raw-HTML GET to six public URLs with a desktop Chrome user-agent, extracted every application/ld+json block, and passed each block to Python json.loads. The two reported dimensions are fetch/parse status and the types actually named. This is a reproducible convenience sample, not a web-wide estimate and not evidence of rich-result eligibility.
| Public URL | HTTP | Blocks parsed / broken | Raw top-level type observations |
|---|---|---|---|
| Google structured-data introduction | 200 | 1 / 0 | BreadcrumbList, ListItem |
| Schema.org documents | 200 | 0 / 0 | none in raw HTML |
| Schema Markup Validator | 200 | 0 / 0 | none in raw HTML |
| BBC News | 200 | 1 / 0 | NewsMediaOrganization, WebPage |
| New York Times homepage | 200 | 2 / 0 | WebSite, NewsMediaOrganization, ItemList and nested nodes |
| Apple iPhone | 200 | 2 / 0 | Organization, Brand, ContactPoint |
What the raw fields establish
All six URLs returned HTTP 200, and every discovered block parsed. Three observations matter. First, a standards or validator page can ship no JSON-LD in raw HTML without being defective. Second, a page can contain multiple blocks and many nested types without receiving any eligibility verdict from this probe. Third, @type is an observation, not a recommendation: the schema markup audit records what the publisher emitted.
Reproduce and interpret the limits
Fetch each URL, regex-match script tags whose type is application/ld+json, HTML-unescape the body, then run json.loads. Record HTTP status separately from block count. The WHATWG script-element rules define the container being selected, while RFC 3986 supplies the URI vocabulary used when entity identifiers are checked. Raw HTML does not include client-injected markup, one user-agent is not every crawler, and six hand-selected pages are not a prevalence study. A 403 would mean the document was not inspected; it must never be relabeled “schema missing.” The chart plots URL count and parsed-block count by source group, preserving two dimensions without inventing outcomes.
A schema markup audit should preserve that raw node with the ticket. Repeat the schema markup audit after production templates deploy.
Selection scorecard
Use this scorecard to keep a schema markup audit inside its job. Each row is inspectable. None of the rows is an official Google health score.
| Test | Pass | Fail |
|---|---|---|
| Extract is local | Chrome or deterministic parse | Remote rewrite of the JSON |
| Type list is explicit | Named @type values | “Has schema” with no type |
| Entity evidence is separated | URL status + visible subject + sameAs + ownership | “Resolved” from one network response |
| schema markup audit scope | Parse + gaps | Eligibility promise |
| Sibling files left aside | robots / GPTBot / llms.txt elsewhere | schema markup audit edits robots |
A row that fails the last test is a crawler ticket. A row that fails the eligibility test is a sales slide.
Failure modes that confuse markup with eligibility
Most disappointment after a schema markup audit is a category error. The parse was never a ticket into a rich result.
Inventing eligibility from a valid parse
A valid FAQPage block can still be ineligible, unused, or later restricted. The schema markup audit should say “present and parseable.” It should not say “we will get the fold.” Do not attach an invented uplift percent.
Treating crawler files as this page's job.
robots.txt, GPTBot, and llms.txt change who may fetch. They do not change @type. Keep those notes in sibling cluster pages. This hub stays on structured data. Leave crawler files to their own tools and cluster notes.
Cluster guides for structured data and crawlers
This hub stays on the schema markup audit. A JSON-LD checker splits syntax from the entity. FAQ schema SEO, Organization schema, and Article schema SEO name types. The FAQ type page is the FAQ checker. rich result eligibility is the official tester book. schema check is the step list for how to validate schema. An llms.txt checker and llms.txt vs robots vs sitemap keep files apart. An AI crawler access audit, a GPTBot robots allow list, and Cloudflare blocking GPTBot stay on public user agents. structured data for AI search is extractable text, not a @type promise. An agent that must call a function needs a structured data tool for AI agents. The type list stays on this hub.
| Cluster | Job next to the parse |
|---|---|
| JSON-LD checker | Syntax versus the entity |
| FAQ schema SEO | Present markup, abuse risk intact |
| Organization schema | One entity you can defend |
| Article schema SEO | Dates and a named author |
| rich results eligibility | Official tester, separate book |
| llms.txt checker | A hint file, not a robots twin |
| llms.txt vs robots vs sitemap | Three files, three jobs |
| AI crawler access audit | Public user agents only |
| GPTBot robots allow list | Allow or disallow, then prove fetch |
| Cloudflare blocking GPTBot | CDN false positives first |
| schema check | Local parse, then official test |
| structured data for AI search | Extractable is not markup |
Query overlays after you ship a type still use Search Console. Keep this hub for the script block you shipped. Those notes will not retarget the live robots or sitemap hubs.
The seo-health CLI (npm i -g infinitegrowth) can emit JSON when a template drops @type in a pull request. That gate is a fail/pass on parse, not a promise that Google will draw a star. Re-paste the production URL after merge. Preview hosts often ship different script blocks than production.
At the foundation boundary, InfiniSynapse and its Server API do not replace the evidence above. Syntax, robots, and llms.txt observations remain deterministic SEO Health reads. A team may upload the parsed defect record server-side into an InfiniSynapse Server API long-task workspace, where the API layer turns missing types, dead identifiers, subject mismatches, and unsupported claims into a human-ready fix queue. This convenience sample does not prove prevalence, and that queue does not revalidate Google eligibility or prove crawler behavior.
Parse the markup before you claim eligibility
Extract structured data locally, then separate dead URLs, subject mismatches, inconsistent sameAs links, and unsupported ownership claims in the punch list.
Run SEO Health CheckerFrequently Asked Questions
Does a valid parse mean rich-result eligibility?
Bottom line: No. A schema markup audit parses what you shipped. Eligibility is a separate official test. Markup is not eligibility.
Is the parse an official Google score?
Bottom line: No. Traffic lights are eight modules on a pasted URL. The schema markup audit is a local type list. Neither object is an official Google health or EEAT score.
Do robots, GPTBot, or llms.txt belong in this audit?
Bottom line: No. They are siblings in this pillar. Use the robots tool for allow and disallow. Keep this schema markup audit on structured data.
When does InfiniSynapse write the punch list?
Bottom line: Parse stays on the machine. Optional task narration starts only after the local audit has saved the missing node and failed identifier. The schema markup audit does not spend that budget on the parse itself.
Conclusion
A schema markup audit earns trust when it reports types, resolution, and gaps—and stops before eligibility theater. Parse locally. List what is missing. Leave crawler files to their own tools. Use the InfiniSynapse web app only to prioritize the saved audit defects; the parse and entity responses remain authoritative. Then paste the live URL again and keep the eight lights honest.
William Zhu · Cofounder, InfiniSynapse · GitHub @allwefantasy
Desk-validated SEO Health methods. Corrections: zhuhl@infinisynapse.com · corrections policy.