---
title: Schema Markup Validator
description: 
url: https://moxseo.com/tools/schema-markup-validator
date_modified: 2026-07-26
author: Admin
language: en_US
---

.mox-sc{--mox-bg:#fff;--mox-panel:#fff;--mox-ink:#0e0f12;--mox-ink-soft:#525866;--mox-line:#e8e8ea;--mox-primary:#ff5a1f;--mox-primary-d:#e8470a;--mox-accent:#ff5a1f;--mox-dark:#0e0f12;--mox-dark-2:#181a1f;--mox-good:#16a077;--mox-warn:#e8a20c;--mox-risk:#e34d5b;--mox-r:18px;--mox-r-sm:12px;--mox-font-d:'Sora',sans-serif;--mox-font-b:'Inter',sans-serif;--mox-font-m:'IBM Plex Mono',monospace;font-family:var(--mox-font-b);background:var(--mox-bg);color:var(--mox-ink)}
.mox-sc *,.mox-sc *::before,.mox-sc *::after{box-sizing:border-box;margin:0;padding:0}
.mox-sc a{text-decoration:none}.mox-sc button{font-family:inherit}
.mox-sc .w{max-width:1180px;margin:0 auto;padding:0 22px}
.mox-sc .sec{padding:82px 0}
.mox-sc .sec--alt{background:#fafafb}
.mox-sc .sec--dark{background:var(--mox-dark)}
.mox-sc .sec--dark h2,.mox-sc .sec--dark h3,.mox-sc .sec--dark p,.mox-sc .sec--dark li{color:#f4f4f6}
.mox-sc .eyebrow{display:inline-flex;align-items:center;gap:8px;font-family:var(--mox-font-m);font-size:12px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--mox-primary);margin-bottom:16px}
.mox-sc .eyebrow::before{content:"";width:22px;height:2px;background:var(--mox-accent)}
.mox-sc h1{font-family:var(--mox-font-d);font-size:clamp(32px,4.6vw,54px);font-weight:800;line-height:1.12;letter-spacing:-.02em}
.mox-sc h2{font-family:var(--mox-font-d);font-size:clamp(26px,3.4vw,38px);font-weight:700;line-height:1.18;letter-spacing:-.015em;max-width:780px}
.mox-sc h3{font-family:var(--mox-font-d);font-weight:700}
.mox-sc .sub{font-size:17px;color:var(--mox-ink-soft);max-width:700px;margin-top:14px;line-height:1.7}
.mox-sc .btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font-family:var(--mox-font-d);font-weight:700;font-size:15px;padding:15px 28px;border-radius:999px;border:2px solid transparent;cursor:pointer;transition:transform .25s,background .2s}
.mox-sc .btn:hover{transform:translateY(-2px)}
.mox-sc .btn--p{background:var(--mox-primary);color:#fff;box-shadow:0 10px 26px rgba(255,90,31,.32)}
.mox-sc .btn--p:hover{background:var(--mox-primary-d)}
.mox-sc .btn--ghost{background:transparent;border-color:var(--mox-line);color:var(--mox-ink)}
.mox-sc .btn--dg{background:transparent;border-color:rgba(255,255,255,.25);color:#fff}
.mox-sc .trust{background:var(--mox-dark);padding:14px 0}
.mox-sc .trust__row{display:flex;flex-wrap:wrap;justify-content:center;gap:10px 28px;font-family:var(--mox-font-m);font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;color:#a7acb5}
.mox-sc .trust__row span{display:inline-flex;align-items:center;gap:8px}
.mox-sc .trust__row span::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--mox-accent)}
.mox-sc .hero{padding:80px 0 70px;background:radial-gradient(900px 500px at 85% -10%,rgba(255,90,31,.12),transparent 60%),radial-gradient(700px 420px at -10% 30%,rgba(255,90,31,.08),transparent 55%),var(--mox-bg)}
.mox-sc .hero__grid{display:grid;grid-template-columns:1.05fr .95fr;gap:56px;align-items:center}
.mox-sc .lead{font-size:18px;color:var(--mox-ink-soft);margin:20px 0 28px;max-width:560px;line-height:1.7}
.mox-sc .cta-row{display:flex;gap:14px;flex-wrap:wrap;margin-bottom:26px}
.mox-sc .ticks{display:flex;flex-wrap:wrap;gap:10px 22px;font-size:14px;color:var(--mox-ink-soft)}
.mox-sc .ticks span{display:inline-flex;align-items:center;gap:7px}
.mox-sc .ticks span::before{content:"\2713";color:var(--mox-good);font-weight:700}
.mox-sc .sample{background:var(--mox-dark);border-radius:24px;padding:30px;box-shadow:0 30px 70px rgba(14,15,18,.35);transform:rotate(1.2deg)}
.mox-sc .sample__tag{font-family:var(--mox-font-m);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--mox-accent);margin-bottom:18px}
.mox-sc .sample__score{display:flex;align-items:baseline;gap:14px;border-bottom:1px solid rgba(255,255,255,.12);padding-bottom:18px;margin-bottom:18px}
.mox-sc .sample__num{font-family:var(--mox-font-m);font-size:56px;font-weight:600;color:var(--mox-accent);line-height:1}
.mox-sc .sample__lbl{font-size:14px;color:#a7acb5;max-width:160px}
.mox-sc .sample__row{display:flex;justify-content:space-between;gap:16px;padding:9px 0;font-size:14px}
.mox-sc .sample__row b{color:#fff;font-weight:600}
.mox-sc .sample__row span{color:#85898f}
.mox-sc .sample__note{margin-top:16px;font-size:12.5px;color:#85898f;border-left:3px solid var(--mox-accent);padding-left:12px;line-height:1.6}
.mox-sc .g3{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:44px}
.mox-sc .g2{display:grid;grid-template-columns:repeat(2,1fr);gap:20px;margin-top:44px}
.mox-sc .card{background:var(--mox-panel);border:1px solid var(--mox-line);border-radius:var(--mox-r);padding:26px;transition:transform .3s,box-shadow .3s}
.mox-sc .card:hover{transform:translateY(-4px);box-shadow:0 18px 40px rgba(14,15,18,.08)}
.mox-sc .card h3{font-size:17px;margin:14px 0 8px}
.mox-sc .card p{font-size:14.5px;color:var(--mox-ink-soft);line-height:1.65}
.mox-sc .chip{display:inline-flex;font-family:var(--mox-font-m);font-size:11px;font-weight:600;letter-spacing:.08em;padding:5px 10px;border-radius:6px;background:rgba(255,90,31,.1);color:var(--mox-primary)}
.mox-sc .bands{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:44px}
.mox-sc .band{border-radius:var(--mox-r);padding:24px;background:var(--mox-panel);border:1px solid var(--mox-line);border-top:5px solid var(--mox-line)}
.mox-sc .band h3{font-size:15.5px;margin:8px 0}
.mox-sc .band p{font-size:13.5px;color:var(--mox-ink-soft);line-height:1.65}
.mox-sc .band__t{font-family:var(--mox-font-m);font-weight:600;font-size:20px}
.mox-sc .band--a{border-top-color:var(--mox-good)}.mox-sc .band--a .band__t{color:var(--mox-good)}
.mox-sc .band--b{border-top-color:var(--mox-warn)}.mox-sc .band--b .band__t{color:var(--mox-warn)}
.mox-sc .band--c{border-top-color:var(--mox-risk)}.mox-sc .band--c .band__t{color:var(--mox-risk)}
.mox-sc .tool{background:var(--mox-panel);border:1px solid var(--mox-line);border-radius:24px;padding:34px;box-shadow:0 20px 60px rgba(14,15,18,.06);margin-top:38px}
.mox-sc .form{display:flex;flex-wrap:wrap;gap:12px}
.mox-sc .form input{flex:1 1 320px;min-width:250px;font-family:var(--mox-font-b);font-size:16px;color:var(--mox-ink);background:#fbfbfc;border:1.5px solid var(--mox-line);border-radius:999px;padding:15px 22px;outline:none;transition:border .2s,box-shadow .2s}
.mox-sc .form input:focus{border-color:var(--mox-primary);box-shadow:0 0 0 4px rgba(255,90,31,.14)}
.mox-sc .hint{font-size:13px;color:var(--mox-ink-soft);margin-top:12px}
.mox-sc .faq{max-width:820px;margin:44px auto 0}
.mox-sc .faq details{border-bottom:1px solid var(--mox-line);padding:18px 0}
.mox-sc .faq summary{font-family:var(--mox-font-d);font-weight:700;font-size:16.5px;cursor:pointer;list-style:none;display:flex;justify-content:space-between;gap:16px}
.mox-sc .faq summary::after{content:"+";color:var(--mox-primary);font-size:20px;line-height:1}
.mox-sc .faq details[open] summary::after{content:"\2212"}
.mox-sc .faq p{font-size:15px;color:var(--mox-ink-soft);line-height:1.7;margin-top:12px}
.mox-sc .final{text-align:center;background:radial-gradient(700px 380px at 50% -20%,rgba(255,90,31,.16),transparent 60%),var(--mox-dark)}
.mox-sc .final h2{margin:0 auto}.mox-sc .final .cta-row{justify-content:center;margin-top:30px}
@media(max-width:900px){.mox-sc .hero__grid{grid-template-columns:1fr;gap:40px}.mox-sc .g3,.mox-sc .bands{grid-template-columns:1fr}.mox-sc .g2{grid-template-columns:1fr}.mox-sc .sec{padding:56px 0}.mox-sc .sample{transform:none}}

/* .mox-sc base: light surface */
.mox-sc h1,.mox-sc h2,.mox-sc h3,.mox-sc h4{color:var(--mox-ink)!important}
.mox-sc p,.mox-sc li,.mox-sc td{color:var(--mox-ink-soft)!important}
.mox-sc .sub,.mox-sc .lead,.mox-sc .hint{color:var(--mox-ink-soft)!important}
.mox-sc .card h3{color:var(--mox-ink)!important}
.mox-sc .card p{color:var(--mox-ink-soft)!important}
.mox-sc .band h3{color:var(--mox-ink)!important}
.mox-sc .band p{color:var(--mox-ink-soft)!important}
.mox-sc .faq summary{color:var(--mox-ink)!important}
.mox-sc .faq p{color:var(--mox-ink-soft)!important}
.mox-sc .eyebrow,.mox-sc .chip{color:var(--mox-primary)!important}
.mox-sc a{color:var(--mox-primary)!important}
.mox-sc .btn--p{color:#fff!important}
.mox-sc .btn--ghost{color:var(--mox-ink)!important}
.mox-sc .band--a .band__t{color:var(--mox-good)!important}
.mox-sc .band--b .band__t{color:var(--mox-warn)!important}
.mox-sc .band--c .band__t{color:var(--mox-risk)!important}
/* .mox-sc dark surfaces */
.mox-sc .trust__row,.mox-sc .trust__row span{color:#a7acb5!important}
.mox-sc .sec--dark h1,.mox-sc .sec--dark h2,.mox-sc .sec--dark h3,.mox-sc .sec--dark p,.mox-sc .sec--dark li{color:#f4f4f6!important}
.mox-sc .sec--dark .sub,.mox-sc .sec--dark .eyebrow{color:#a7acb5!important}
.mox-sc .final h1,.mox-sc .final h2,.mox-sc .final h3{color:#fff!important}
.mox-sc .final p,.mox-sc .final .sub{color:#a7acb5!important}
.mox-sc .final .eyebrow{color:var(--mox-accent)!important}
.mox-sc .final .btn--dg{color:#fff!important}
.mox-sc .sample__tag{color:var(--mox-accent)!important}
.mox-sc .sample__num{color:var(--mox-accent)!important}
.mox-sc .sample__lbl,.mox-sc .sample__note{color:#85898f!important}
.mox-sc .sample__row span{color:#85898f!important}
.mox-sc .sample__row b{color:#fff!important}
.mox-sc .ticks span{color:var(--mox-ink-soft)!important}

16 schema types validatedChecks required propertiesNo signupNothing stored

Free tool

# Find out what your structured data is actually telling Google

Paste any URL. We extract every JSON-LD block, list the entity types you are declaring, and flag the missing required properties that quietly disqualify you from rich results.

[Validate a URL](#mox-run)[All free tools](https://moxseo.com/tools/)
Detects invalid JSONFlags missing propertiesWorks on any public page

Sample result
78Structured data score for this page
JSON-LD blocks**3 found, 2 valid**
Entity types**9 declared**
Article**Missing author**
Organization**Valid**
One block contains malformed JSON. Search engines discard the entire block rather than the broken part — so everything inside it is invisible.

The problem

## Most structured data errors are silent. Nothing tells you the markup failed.

Schema either works or it does not, and there is no warning either way. A single trailing comma invalidates an entire block. A missing *author* property disqualifies an Article from rich results. Search Console only reports on the types it happens to support, which leaves most of your markup unchecked.

SYNTAX
### One broken block kills everything inside it

JSON-LD is parsed whole. If a block fails to parse, every entity declared in it is discarded — not just the offending line. Plugins and manual edits fighting over the same block is the usual cause.

COMPLETENESS
### Valid JSON is not the same as valid schema

Your markup can parse perfectly and still be ineligible. Article without an author, Product without a name, Event without a start date — syntactically fine, functionally rejected.

CONFLICT
### Competing entity declarations

When a theme, an SEO plugin and a page builder each emit their own Organization block, search engines have to guess which describes the business. Ambiguity here weakens everything downstream.

What gets checked

## Required properties for the sixteen types that matter most

### Content types

**Article, BlogPosting, NewsArticle** need headline, author and datePublished. Missing author is the single most common reason editorial markup fails — and the one most often introduced by a theme change.

### Business and entity types

**Organization** needs name and url. **LocalBusiness** and **ProfessionalService** additionally need a valid address. A malformed address here silently removes you from local eligibility.

### Commerce and events

**Product** needs a name. **Event** needs name, startDate and location. **JobPosting** needs title, hiringOrganization and datePosted.

### Navigation and media

**BreadcrumbList** needs itemListElement. **VideoObject** needs name, thumbnailUrl and uploadDate. **WebSite** needs url. **Person** needs name.

The tool

## Validate structured data on any URL

We fetch the page, extract every JSON-LD block, walk the full node tree including nested entities, and report what is declared and what is missing.

Validate schema

Reads the public HTML only. No crawling, no signup, nothing stored.

Reading your results

## How to read the severity levels

Error
### Fix this first

Invalid JSON or a missing required property. The affected markup is being ignored, so you are getting no benefit from it at all.

Warning
### Worth resolving

Missing @context, or competing entity declarations. Not fatal, but it introduces ambiguity that weakens how confidently your entity is understood.

Info
### Context, not a fault

Notes about how a type behaves in practice — such as FAQPage no longer producing rich results for most sites since Google narrowed eligibility in 2023.

The honest version

## Structured data is an eligibility requirement, not a ranking factor

### What it will not do

Schema does not raise rankings. Google has been explicit and consistent about this. Adding markup to a page nobody wants to read changes nothing. Anyone selling schema as a ranking lever is misrepresenting it.

### What it genuinely does

It makes you eligible for rich results, and it resolves ambiguity about what your entities are. That second part matters increasingly for AI systems, which lean on explicit structure when deciding what a page is about and whether to cite it.

Common questions

## Structured data, answered plainly

How is this different from Google's Rich Results Test?
Rich Results Test only reports on types Google supports for rich results, so most of your markup goes unexamined. This validates everything you declare, including nested entities, and flags conflicts between blocks that Google's tool does not surface.

Should I have multiple JSON-LD blocks or one?
Either works. What matters is that they do not contradict each other. Problems arise when a theme, an SEO plugin and a builder each emit their own Organization or Article block with different values.

Is FAQPage schema still worth adding?
For rich results, generally not — since 2023 Google shows FAQ rich results only for government and health sites. It is not harmful, and it may still help machines parse your content, but it will not produce the SERP feature most people add it for.

Does microdata still work?
Yes, Google supports microdata and RDFa. JSON-LD is the recommended format because it is separate from your markup and far easier to maintain. We flag when microdata is present so you know both formats are in play.

My score is low but Search Console shows no errors. Why?
Search Console only validates types eligible for rich results. If you declare types outside that set, or your markup fails in ways Google does not report on, it stays invisible there.

Next step

## Clean markup is the easy half. Being worth citing is the hard half.

Structured data makes you legible to machines. Whether they choose you as the source is a question of authority and evidence.

[SEO services](https://moxseo.com/services/seo/)[See all free tools](https://moxseo.com/tools/)

(function(){
  var inp=document.getElementById('sc-in'),btn=document.getElementById('sc-go'),out=document.getElementById('sc-out');
  if(!inp||!btn||!out)return;
  var SEV={error:'#e34d5b',warn:'#e8a20c',info:'#16a077'};
  var SL={error:'ERROR',warn:'WARNING',info:'INFO'};
  function esc(s){var d=document.createElement('div');d.textContent=s==null?'':s;return d.innerHTML;}
  function note(m,c){return ''+m+'';}
  function run(){
    var u=(inp.value||'').trim();
    if(!u){out.innerHTML=note('Enter a URL to validate.');return;}
    btn.disabled=true;btn.textContent='Validating...';
    out.innerHTML=note('Fetching and parsing '+esc(u)+'...');
    fetch('/wp-json/moxtools/v1/schema?url='+encodeURIComponent(u))
      .then(function(r){return r.json().then(function(j){return {s:r.status,j:j};});})
      .then(function(res){
        btn.disabled=false;btn.textContent='Validate schema';
        var j=res.j;
        if(res.s!==200||j.error){out.innerHTML=note(esc(j.error||'Something went wrong.'),'#e34d5b');return;}
        var sc=j.score||0,col=sc>=80?'#16a077':(sc>=50?'#e8a20c':'#e34d5b');
        var h='';
        h+='Structured data report';
        h+=''+sc+''+j.blocks+' JSON-LD block(s) · '+j.valid_blocks+' valid'+(j.microdata?' · microdata also present':'')+'';
        var tk=Object.keys(j.types||{});
        if(tk.length){
          h+='';
          tk.forEach(function(t){h+=''+esc(t)+(j.types[t]>1?' ×'+j.types[t]:'')+'';});
          h+='';
        } else { h+='
No entity types declared.

'; }
        h+='';
        var body='';
        if((j.issues||[]).length){
          body+='';
          j.issues.forEach(function(x,i){
            body+='';
            body+=''+SL[x.sev]+'';
            body+=''+esc(x.msg)+'';
          });
          body+='';
        } else { body+='**No issues detected.** Every block parsed cleanly and all required properties are present.'; }
        body+='Structured data affects **eligibility**, not ranking. Once your markup is clean, the next question is whether the page is worth citing — try the [AI Answer Extractability Checker](https://moxseo.com/tools/ai-search-optimization-score-checker/).';
        out.innerHTML=h+body;
      })
      .catch(function(){btn.disabled=false;btn.textContent='Validate schema';out.innerHTML=note('Request failed. Please try again.','#e34d5b');});
  }
  btn.addEventListener('click',run);
  inp.addEventListener('keydown',function(e){if(e.key==='Enter'){e.preventDefault();run();}});
})();
