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

Schema Checker Tool

Paste JSON-LD (or a full HTML page containing application/ld+json) and get a quick, offline validation report: parse errors, detected Schema types, and common missing fields. Nothing is uploaded.

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

How to use

Use this tool to sanity-check Schema.org JSON-LD before you ship it.

  1. Paste JSON-LD (object/array) or your page HTML into the input.
  2. Choose options (strict checks and/or normalize @context).
  3. Click Check schema.
  4. Copy the report and fix any errors or warnings.
Keywords this page targets (natural cluster): schema checker tool, json-ld schema checker, structured data checker, schema markup validator offline, validate schema.org json-ld, check json-ld syntax, find schema @context and @type, schema.org validator for json-ld, rich results schema check, check product schema json-ld, check article schema json-ld, check organization schema json-ld, validate breadcrumb schema, schema @graph validator, extract json-ld from html, schema markup errors, structured data audit quick, json-ld linter, schema markup tester without url, schema validation report
Secondary intents covered: Validate JSON-LD syntax and find parsing errors fast, Extract JSON-LD blocks from pasted HTML source, Confirm @context and @type are present and reasonable, See which Schema.org types are included on a page, Spot missing commonly-required fields for rich results, Generate a compact report you can copy into a ticket, Normalize schema @context from http to https

FAQ

What inputs does this schema checker tool accept?

Paste JSON-LD directly (object or array) or paste HTML that contains <script type="application/ld+json"> blocks.

Does it validate Microdata or RDFa schema markup?

No—this tool is for JSON-LD. If your HTML uses Microdata/RDFa attributes, the report will note it but won’t validate them fully.

Is this a full Schema.org validator?

No. It’s a fast offline sanity check (syntax, @context/@type, and common missing fields), not a complete rules engine.

Why do I see “JSON parse error” when my schema looks fine?

JSON-LD must be strict JSON: no trailing commas, no comments, and quotes must be straight quotes. Remove extras and try again.

What does “Normalize @context” do?

It rewrites http://schema.org to https://schema.org (and trims trailing slashes) to reduce inconsistency.

Will this tool upload my schema data?

No. It runs locally in your browser and doesn’t make network requests.

How do I test a live URL after checking the JSON-LD?

Use the FeuTex Schema Checker URL Builder to open Rich Results and schema validation links for a given page.

","expected":"Missing commonly required field(s): offers"},{"name":"Invalid JSON trailing comma triggers parse error","input":"{\"@context\":\"https://schema.org\",\"@type\":\"Organization\",\"name\":\"X\",}","expected":"JSON parse error"},{"name":"@graph detects multiple types","input":"{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"name\":\"A\"},{\"@type\":\"WebSite\",\"name\":\"S\",\"url\":\"https://s.test\"}]}","expected":"Types: Organization, WebSite"}]; // 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()); })(); ', opts: { strict: true, normalize: true, showNormalized: false }, expectSubstr: 'Missing commonly required field(s): offers' }, { name: 'Invalid JSON (trailing comma) => parse error', input: '{"@context":"https://schema.org","@type":"Organization","name":"X",}', opts: { strict: false, normalize: true, showNormalized: false }, expectSubstr: 'JSON parse error' }, { name: '@graph with Organization + WebSite => both types detected', input: '{"@context":"https://schema.org","@graph":[{"@type":"Organization","name":"A"},{"@type":"WebSite","name":"S","url":"https://s.test"}]}', opts: { strict: false, normalize: true, showNormalized: false }, expectSubstr: 'Types: Organization, WebSite' } ]; const lines = []; let passCount = 0; tests.forEach((t, i) => { const res = analyze(t.input, t.opts); const got = (res.report || ''); const ok = got.includes(t.expectSubstr); if (ok) passCount++; lines.push(`${ok ? 'PASS' : 'FAIL'} ${i + 1}/${tests.length}: ${t.name}`); if (!ok) { lines.push(` expected substring: ${t.expectSubstr}`); lines.push(` got (first 220 chars): ${got.slice(0, 220).replace(/\n/g, ' ⏎ ')}`); } }); lines.push(`Result: ${passCount}/${tests.length} passed`); return lines.join('\n'); }; // Auto-init when DOM is ready. if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => window.feutexInit && window.feutexInit()); } else { window.feutexInit && window.feutexInit(); } })();