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

Schema Tool Checker

Check your Schema.org structured data quickly: paste JSON-LD (or an HTML snippet with <script type="application/ld+json">) and get a clean report with errors, warnings, node/type summary, and common JSON-LD gotchas. Runs fully offline in your browser.

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

How to use

Use it to sanity-check schema markup before you run deeper tests.

  1. Paste JSON-LD, or paste HTML that contains one or more application/ld+json script tags.
  2. Leave “Extract from HTML” on if you pasted HTML.
  3. Click Check (or press Ctrl/⌘ + Enter).
  4. Fix issues reported under Errors/Warnings, then re-check.
  5. Use Format or Minify for a clean final JSON-LD block.
Keywords this page targets (natural cluster): schema tool checker, schema checker, json-ld schema checker, structured data checker offline, schema markup checker, json-ld validator, validate schema.org json-ld, check schema script tag, extract json-ld from html, schema @context checker, schema @type checker, schema @graph checker, duplicate @id schema, format json-ld, minify json-ld, schema markup linter, structured data debugging, schema validation tool
Secondary intents covered: Validate that JSON-LD parses correctly (no broken JSON)., Extract JSON-LD from an HTML page snippet with script tags., Confirm @context and @type are present and in the right shape., Identify duplicate @id values inside @graph., List detected Schema.org types and node counts for a quick sanity check., Format (pretty-print) or minify JSON-LD before publishing., Spot common mistakes like context/type without the @ prefix., Copy the final output/report for sharing or tickets.

FAQ

What does this schema tool checker validate?

It checks JSON validity and flags common JSON-LD issues like missing/odd @context, missing/invalid @type, duplicate @id, empty strings, and basic URL-looking values.

Can I paste a full HTML page to check schema?

Yes—keep “Extract from HTML” enabled and paste HTML; it will pull content from <script type="application/ld+json"> blocks.

Does this replace Google’s Rich Results Test?

No. This is a fast offline sanity check; search engines apply their own rules and eligibility requirements.

Why do I see “Missing @context” if my schema is inside @graph?

@context is typically expected at the top level; if you’re using multiple blocks or unusual nesting, this tool warns so you can confirm your structure is intentional.

Can it format or minify my JSON-LD?

Yes—use “Format” for pretty JSON and “Minify” for compact output (single block only).

Is my data sent to a server?

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

What should I do if JSON parsing fails?

Fix the JSON first (missing quotes, extra commas, unescaped characters). Once it parses, the checker can run the markup checks.

","expected":"Duplicate @id"},{"name":"Invalid JSON fails","input":"{\"@context\":\"https://schema.org\",}","expected":"JSON parse error"}]; // 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()); })(); ', expectIncludes: ['Duplicate @id', 'Blocks: 1'] }, { name: 'Invalid JSON fails', input: '{"@context":"https://schema.org",}', expectIncludes: ['JSON parse error'] } ]; let pass = 0; const logs = []; for(const t of tests){ const out = internalCheck(t.input); const ok = t.expectIncludes.every(s => out.includes(s)); logs.push((ok ? 'PASS' : 'FAIL') + ' - ' + t.name); if(!ok){ logs.push(' Expected to include: ' + t.expectIncludes.join(' | ')); logs.push(' Got: ' + String(out).slice(0, 240).replace(/\n/g, ' \\n ')); } else { pass++; } } logs.push('Result: ' + pass + '/' + tests.length + ' passed'); return logs.join('\n'); }; })();