Skip to tool
FeuTex · free tools runs in-browser no bloat built by LiMiT

Schema Checker (Google-focused)

Check your Schema markup the way most people mean by “schema checker Google”: validate JSON-LD syntax, extract JSON-LD from HTML, and get quick Google-rich-results hints (offline, no fetch).

Category: SEO · URL: /tools/schema-checker-google.html
Privacy: runs locally in your browser. No uploads, no tracking scripts.

How to use

Use this to sanity-check your structured data before you open Google’s online validators.

  1. Paste JSON-LD or full HTML into the input.
  2. Click Analyze JSON-LD to validate JSON and run Google-focused checks.
  3. If you have a page URL, paste it in Page URL and click Build Google test links.
  4. Fix issues highlighted as FAIL/WARN, then re-run.
Keywords this page targets (natural cluster): schema checker google, google schema checker, google structured data checker, schema markup validator google, rich results schema checker, json-ld schema checker, validate schema markup, check json-ld, schema.org validator, google rich results test link, schema markup validator link, extract json-ld from html, structured data testing tool offline, faq schema checker, product schema checker, article schema checker, breadcrumb schema checker, recipe schema checker, local business schema checker, event schema checker
Secondary intents covered: Validate that JSON-LD is valid JSON (no trailing commas, no broken quotes), Extract and audit multiple <script type="application/ld+json"> blocks from HTML, Confirm @context points to schema.org and @type is present, Spot common Google rich result missing fields for popular types (Article, Product, FAQPage, BreadcrumbList, Recipe, Event), Generate Google Rich Results Test and Schema Markup Validator links for a page URL, Review what types exist inside @graph and identify duplicates or empty nodes, Copy a compact validation report for debugging or sharing, Quickly sanity-check markup before running official online tools

FAQ

Is this an official Google schema validator?

No—this tool runs offline checks and Google-focused hints. Use it to catch obvious issues before running Google Rich Results Test.

Can it validate a URL directly?

It does not fetch pages. Paste your HTML/JSON-LD, or use the URL box to generate Google test links.

What formats are supported?

JSON-LD (object/array) and HTML containing <script type="application/ld+json"> blocks.

Why do I see WARN instead of FAIL?

WARN means the JSON is valid but likely missing fields commonly required for Google rich results, or has nonstandard context/ids.

Does it check every Schema.org rule?

No—Schema.org is huge. This tool focuses on syntax, @context/@type, @graph visibility, and common rich-result field checks.

How do I test rich results in Google?

Use the “Build Google test links” section to open Rich Results Test and Schema Markup Validator for your URL.

Can it handle multiple JSON-LD blocks?

Yes—paste full HTML and it will extract and report each JSON-LD script block separately.

","expected":"Found 2 JSON-LD block(s)."},{"name":"Missing @type should FAIL","input":"{\"@context\":\"https://schema.org\",\"name\":\"No type\"}","expected":"FAIL: Missing @type"}]; // The tool JS must attach: // - window.feutexReset(): resets UI // - window.feutexSelfTest(tests): returns string log (PASS/FAIL) // - window.feutexInit(): optional (function(){ const log = document.getElementById('selfTestLog'); const btn = document.getElementById('selfTestBtn'); const resetBtn = document.getElementById('resetBtn'); function setLog(txt){ if(log) log.textContent = txt || ''; } btn?.addEventListener('click', async () => { try { if(typeof window.feutexSelfTest !== 'function') { setLog('Self-test missing: window.feutexSelfTest not defined.'); return; } const out = await window.feutexSelfTest(FEUTEX_SELF_TESTS); setLog(out || 'No self-test output.'); } catch(e) { setLog('Self-test error: ' + (e?.message || e)); } }); resetBtn?.addEventListener('click', () => { try { if(typeof window.feutexReset === 'function') window.feutexReset(); setLog(''); } catch(e) { setLog('Reset error: ' + (e?.message || e)); } }); try { if(typeof window.feutexInit === 'function') window.feutexInit(); } catch(_e) {} document.getElementById('yr').textContent = String(new Date().getFullYear()); })(); ... `; elInput().value = sample; setError(''); setOutput('Sample loaded. Click “Analyze JSON-LD”.'); } window.feutexReset = function feutexReset() { if (elInput()) elInput().value = ''; const pageUrl = $('pageUrl'); if (pageUrl) pageUrl.value = ''; const linkOut = $('linkOutput'); if (linkOut) linkOut.innerHTML = ''; setError(''); setOutput(''); }; window.feutexInit = function feutexInit() { const btnAnalyze = $('btnAnalyze'); const btnReset = $('btnReset'); const btnSample = $('btnSample'); const btnCopy = $('btnCopy'); const btnBuildLinks = $('btnBuildLinks'); if (btnAnalyze) { btnAnalyze.addEventListener('click', () => { setError(''); const raw = elInput().value; const res = analyzeInput(raw); if (res.error) setError(res.error); setOutput(res.report); }); } if (btnBuildLinks) { btnBuildLinks.addEventListener('click', () => { const linkOut = $('linkOutput'); if (!linkOut) return; const pageUrl = $('pageUrl'); const res = buildGoogleLinks(pageUrl ? pageUrl.value : ''); linkOut.innerHTML = res.html; }); } if (btnSample) btnSample.addEventListener('click', loadSample); if (btnCopy) btnCopy.addEventListener('click', copyReport); if (btnReset) btnReset.addEventListener('click', () => window.feutexReset()); }; window.feutexSelfTest = function feutexSelfTest() { const tests = [ { name: 'Valid Article JSON-LD (PASS/WARN allowed)', input: '{"@context":"https://schema.org","@type":"Article","headline":"Hi","image":"https://e.com/i.jpg","datePublished":"2025-01-01","author":{"@type":"Person","name":"A"}}', expect: 'Types: Article' }, { name: 'Invalid JSON should FAIL', input: '{"@context":"https://schema.org", "@type":"Product",}', expect: 'FAIL: Invalid JSON' }, { name: 'HTML extraction finds 2 blocks', input: '' + '' + '' + '', expect: 'Found 2 JSON-LD block(s).' }, { name: 'Missing @type should FAIL', input: '{"@context":"https://schema.org","name":"No type"}', expect: 'FAIL: Missing @type' } ]; let pass = 0; const lines = []; for (const t of tests) { let ok = false; try { const res = analyzeInput(t.input); const out = (res && res.report) ? res.report : ''; ok = out.includes(t.expect); } catch (e) { ok = false; } if (ok) { pass++; lines.push(`PASS: ${t.name}`); } else { lines.push(`FAIL: ${t.name}`); } } lines.push(`Result: ${pass}/${tests.length} passed`); return lines.join('\n'); }; // Auto-init if DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => window.feutexInit && window.feutexInit()); } else { window.feutexInit && window.feutexInit(); } })();