Validators
Markup and stylesheet conformance in one pass
The W3C runs two separate validators - one for markup, one for stylesheets - and most sites need both. This runs both in one pass against the same page, so you get one answer instead of two tabs and two URLs.
The HTML side reads the raw response body before any JavaScript runs and checks it against the Living Standard's content model with a real tokenizer. The CSS side fetches every inline and linked stylesheet and matches each declaration against the formal property grammars from the CSS specifications, in their published machine-readable form.
Both halves report the exact position of every error. If you only need one, the HTML validator and CSS validator pages run each on its own.
Why this matters
Something on the page is wrong and you want the official answer. The markup service checks the HTML and says nothing about the stylesheet; the stylesheet service checks the CSS and says nothing about the markup. Neither knows the other ran, so you finish with two lists in two formats and still have to work out which of them explains the thing you were looking at.
The browser repairs invalid markup while it parses, then matches your CSS against the repaired tree. So a rule that will not apply can be a markup fault, and a block sitting in the wrong place can be a discarded declaration. With one clean result from one service, you spend the afternoon editing the file that was already correct.
Two form controls sharing a name submit under one key. Whether the server keeps the first value, the last, or both depends on how it parses the body - so a form that works on your host quietly loses a field after a migration. You find out when an enquiry arrives with no phone number in it.
With no encoding declared in the first kilobyte of the page, the browser picks one. A wrong guess turns every apostrophe and accented name into mojibake, in the page and in the tab title and in the preview text other systems lift from it. Your own browser may guess correctly and never show you.
94 rules matching HTML_ or CSS_ run against the same page in the same scan. Where the conformance parser and an older hand-written rule would report the same defect, the hand-written one is suppressed for that scan, so a duplicate id is one finding rather than two.
The markup half checks the same content model the W3C service checks and claims nothing beyond that. The stylesheet half differs: anything the grammar checker cannot evaluate - a value containing var(), a feature-query condition - is recorded as unchecked instead of reported as an error, and every property is also resolved against Baseline.
Neither W3C service looks at structured data, links, response headers or accessibility. Those run in the same pass here, and every markup and stylesheet finding still arrives with its line, its column and the specification it comes from.
This check runs on its own here, and as part of the full audit alongside the other 985 rules. Either way the findings carry their evidence and their citation, and the report is never published or kept.
Conformance errors are worth fixing not because a badge says so, but because browsers recover from them by guessing — and different browsers guess differently.
Fix HTML parse errors first, starting from the top. Unclosed and mis-nested elements cause cascades that disappear once the first is corrected.
Remove duplicate ids, which silently break labels, in-page anchors and any script that queries by id.
Fix CSS parse errors — one malformed declaration causes the browser to discard the rest of its block.
Add missing required attributes: alt, lang, and a non-empty title.
Re-validate and confirm the count fell. If it did not, you fixed a symptom rather than the cause.
Just the domain is enough — example.com, with or without the https. No account, no card, no crawl of your whole site.
Your page opens in a real browser and JavaScript runs to completion, so what gets audited is the page a person actually sees — not the raw HTML your server sent. A screenshot comes back with the report as evidence of exactly what we measured.
Up to 986 checks run against that rendered page. Each finding names the rule, quotes the evidence found on your page, cites the public specification behind it, and says what to change. Nothing is a judgement call — run it twice on an unchanged page and the score is identical.
Named because provenance is the product. Every finding in your report says which of these produced it, so you can check the reasoning rather than take a score on faith.
Checks the raw HTML source for structural mistakes the browser silently repairs: nested anchors and forms, block elements inside paragraphs, bare table rows, nested headings and unterminated attributes. These never appear in the parsed DOM, so they are invisible to tools that inspect a rendered page - but they mean the DOM you get is not the DOM you wrote.
Duplicate ids break getElementById, label/for association, aria-labelledby and in-page anchors - all of which silently resolve to the first match only.
A title is required by the HTML specification, not merely recommended, and every validator reports its absence as an error.
Without a viewport meta tag mobile browsers render at a 980px virtual width and scale down, so the page arrives zoomed out and unreadable regardless of how good the responsive CSS is.
Every inline and linked stylesheet is parsed. A parse error means the browser discarded a declaration or a whole rule at load time, so styling that looks correct in the source never applied.
Boolean attributes are true whenever present, whatever their value. disabled="false" disables the control - the exact opposite of what the author intended, and one of the most persistent bugs in hand-written HTML.
A control with no name is omitted from the submitted form data entirely. The field renders, the user fills it in, and the value never reaches the server.
The lang attribute drives hyphenation, speech synthesis and correct font selection.
Without a declared encoding the browser guesses, and a wrong guess renders every non-ASCII character as mojibake. The declaration must also appear in the first 1024 bytes, which is why it belongs at the top of head.
A legacy Internet Explorer feature that executes JavaScript from CSS - both obsolete and a script-injection vector.
Text below about 3px is invisible to a human but fully indexable. Whether or not it is deliberate, it matches the keyword-stuffing pattern that ranking systems demote for.
Each property name is checked against the machine-readable index of properties defined in the CSS specifications. An unknown property is almost always a typo no browser will honour.
Each value is matched against the property's formal grammar from the CSS specifications. A value that does not match is dropped at parse time, so the declaration has no effect even though the property name is correct.
Interactive content inside interactive content is invalid and produces unpredictable keyboard and screen-reader behaviour.
An img with no src or srcset is invalid and renders as a broken-image placeholder.
An empty for attribute associates the label with nothing. The control stays unlabelled while the markup looks correct to a reviewer skimming it.
More than one title element is invalid. Browsers and search engines use the first and discard the rest, so the one you meant to show may be the one thrown away.
Vestibular disorders make large-motion animation genuinely painful. The operating system already exposes the user's preference; honouring it is a two-line media query.
HTML specification conformance, checked against the raw response body by a conformance parser. Rule: element-permitted-content.
HTML specification conformance, checked against the raw response body by a conformance parser. Rule: element-permitted-occurrences.
HTML specification conformance, checked against the raw response body by a conformance parser. Rule: element-permitted-order.
HTML specification conformance, checked against the raw response body by a conformance parser. Rule: element-permitted-parent.
HTML specification conformance, checked against the raw response body by a conformance parser. Rule: element-required-ancestor.
HTML specification conformance, checked against the raw response body by a conformance parser. Rule: element-required-attributes.
Showing 24 of 94. Browse every rule w3c validator runs.
This page answers these searches too — they are the same job, so they share one page rather than being split across near-identical ones:
No signup, no credit card. Quick answers in seconds; a full audit takes about a minute.
Run a free scanNo signup. No credit card. Nothing stored but the result.