SEO

Canonical and hreflang validator

Read a page's canonical declarations and hreflang set the way a crawler does, with the conflicts, relative URLs and malformed language codes that silently break them.

30 checks a day, 20 an hour · results are kept for 24 hours, then deleted

How to use it

  1. Enter the address you want to checkType or paste it into the field marked "Address to check", including the https:// at the front. Use a page you believe has a canonical, alternates for other languages, or both.
  2. Press Check and wait a few secondsThe request runs from our server rather than from your browser, so your cache, your extensions and your login session cannot affect the answer. That is the point of it: you are seeing what an anonymous visitor sees.
  3. Check whether the canonical points at itselfMost pages should be their own canonical. One pointing elsewhere is a deliberate instruction to index a different page instead, and it is startling how often that is left in by accident after a template change.
  4. Look for two canonicals disagreeingA canonical can be set in the HTML and again in a Link header — a CDN or a plugin frequently adds the second. When they disagree the result is undefined, and the tool shows both rather than picking one.
  5. Read the hreflang errors literallyLanguage codes must be right (en_US with an underscore is invalid; it is en-US), addresses must be absolute, and every alternate should point back. These fail silently — nothing breaks, the tags are simply ignored.
  6. Share or keep the result within 24 hoursThe result has its own link you can send to whoever needs to act on it. It is deleted 24 hours after the check ran, so save anything you need to keep — and re-run the check after a change rather than trusting an old link.

About this tool

The canonical tag tells search engines which URL is the "real" one when several addresses serve the same content; hreflang tells them which language and region variants exist. Both fail silently: a conflicting canonical or a malformed language code produces no error anywhere — the engine just ignores the declaration and makes its own choice.

This tool reads a page the way a crawler does — raw HTML plus the HTTP headers — and reports every canonical declaration it finds, the full hreflang set, and the specific mistakes that cause engines to discard them: conflicts, relative URLs, invalid codes and missing self-references.

Understanding the result

The canonical section shows every declaration — in the HTML and in the HTTP Link header — and which one an engine would actually obey. A canonical pointing at another page means this page is declaring itself a duplicate, which is either exactly right (parameter and print variants) or a serious mistake (a page meant to rank).

The hreflang table lists each declared alternate with two checks per entry: whether the language code is well formed, and whether the URL is absolute. Google skips entries that fail either, without reporting anything.

Each issue explains what the engine does with the mistake, not just that the mistake exists — because "en_US is invalid" only matters once you know the whole entry is silently ignored.

Example

Input

https://example.com/products/widget

Output

Canonical: https://example.com/products/widget (this page) — HTML and header agree
hreflang: en ✓ · ta ✓ · en_US ✗ invalid code (skipped by engines) · x-default ✓
1 critical issue: hreflang="en_US" is not a valid language code.

Limitations

  • Declarations are read from the raw HTML. A canonical injected by JavaScript is visible to Google's renderer but to no other consumer, and it will not appear here.
  • Language codes are checked for shape (en, en-GB, zh-Hant, x-default), not against a registry of real languages — we will not claim "xy" names no language when we have not checked.
  • Return tags are not verified. Confirming that every alternate links back requires fetching every page in the set, which is a site-crawl job, not a single-page check. The result says what was and was not examined.
  • Requests to private and internal addresses are refused by design.

Questions

My canonical looks right — why does the report say it conflicts?

Usually because there are two declarations you cannot see at once: one in the HTML and one in an HTTP Link header added by a CDN, a plugin or the server config. Browsers show you the HTML; this tool reads both, and when they disagree the engines pick unpredictably.

Is a missing canonical an error?

No. Plenty of well-ranking pages declare none. It simply leaves the choice of "real" URL to the engine, and on sites with parameter, www or trailing-slash variants that choice regularly lands somewhere unintended — which is why we flag it as worth deciding rather than as broken.

Why is en_US invalid? It clearly means American English.

To a person, yes. To a parser, the specification requires a hyphen — en-US — and Google's documented behaviour is to skip entries it cannot parse, silently. The meaning being obvious to humans is exactly what makes this mistake survive for years unnoticed.

The tool says my hreflang set may be ignored because there is no self-reference. Why does a page need to list itself?

Google requires every page in an hreflang set to appear in the set — including the page carrying the annotations. It is a consistency proof: if the page you are reading is not in the list, the list cannot be describing that page's variants. Sets without a self-reference are liable to be discarded whole.

Do you check that the alternate pages link back?

Not in this tool. Return-tag validation needs one request per alternate for every page in the set — a crawl, not a check. This tool verifies everything a single page can prove about itself and is explicit about where that boundary is.

Last updated 2026-08-16.

Related tools