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

Schema Checker

Validate your schema markup in seconds. Paste JSON-LD (or a full HTML page) and this tool will extract application/ld+json, parse it, and flag syntax errors plus common issues like missing @context or @type. Runs fully offline in your browser.

Category: SEO · URL: /tools/schema-checker.html

No network calls. This checks JSON parsing + basic schema.org field sanity (it does not verify Google Rich Results eligibility).



  
Privacy: runs locally in your browser. No uploads, no tracking scripts.

How to use

Use it to catch schema markup issues before you push a page live.

  1. Paste your JSON-LD (or full HTML) into the input box.
  2. Click Check schema.
  3. Review the report for parse errors, missing @type/@context, and other warnings.
  4. Optionally enable Show normalized JSON-LD to see what successfully parsed.
Keywords this page targets (natural cluster): schema checker, schema markup checker, json-ld checker, structured data checker, schema validator, schema.org json-ld validator, check json-ld syntax, validate schema markup online, ld+json checker, schema markup tester, structured data validator, schema @context checker, schema @type missing, extract json-ld from html, validate multiple json-ld blocks, schema error checker, schema warnings checker, schema markup audit, schema markup validation tool, json-ld parser
Secondary intents covered: Validate that JSON-LD is valid JSON (no trailing commas, broken quotes, etc.), Extract JSON-LD from a pasted HTML page automatically, Confirm each schema node includes @context and @type, Find which block/node is causing a parse or validation issue, Review a compact report of errors and warnings before publishing, Copy a clean validation report to share with a dev/SEO teammate, See a normalized (pretty-printed) version of parsed JSON-LD, Quickly sanity-check multiple schema blocks on one page

FAQ

What formats does this schema checker support?

It supports JSON-LD directly, or HTML where it will extract <script type="application/ld+json"> blocks.

Does this validate Google Rich Results eligibility?

No. It checks JSON parsing and basic schema field sanity; Google eligibility depends on additional rules and testing tools.

Why do I see “JSON parse error”?

Your JSON-LD isn’t valid JSON (common causes: trailing commas, unescaped quotes, or pasted smart quotes).

Do I need @context and @type on every node?

@type is required per node. @context is usually on the root; nodes inside @graph can inherit it.

Can this handle multiple schema blocks?

Yes. If your HTML has multiple JSON-LD scripts, it parses and reports each block separately.

Is my data sent to a server?

No. Everything runs locally in your browser and the tool does not make network requests.

What does “normalized JSON-LD” mean?

It’s the parsed JSON-LD re-printed in a consistent format so you can quickly inspect what successfully parsed.

","expected":"Found 1 JSON-LD block(s)."},{"name":"Missing @type should be error","input":"{\"@context\":\"https://schema.org\",\"name\":\"No Type\"}","expected":"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()); })(); ', expected: 'Found 1 JSON-LD block(s).' }, { name: 'Missing @type should be error', input: '{"@context":"https://schema.org","name":"No Type"}', expected: 'Missing @type.' } ]; let pass = 0; const logs = []; for (const t of tests) { const out = validateText(t.input, { showJson: false, strictContext: true }); const ok = out.includes(t.expected); logs.push((ok ? 'PASS: ' : 'FAIL: ') + t.name + ' (expect contains: ' + JSON.stringify(t.expected) + ')'); if (!ok) { logs.push('--- Output ---\n' + out); } else { pass++; } } logs.unshift('Self-test: ' + pass + '/' + tests.length + ' passed'); return logs.join('\n'); }; })();