hreflang alternate checker
hreflang tells the index which language or region variant to show. It is not <html lang>, and it is not a canonical. Mixing those three is how a /en and a /pt page steal each other’s ranking.
What we measure
Every <link> whose rel includes alternate and that also has hreflang. Href is resolved against the audited URL. Duplicates of the same lang+href are collapsed. We cap the list so a huge storefront does not blow the report.
We do not fetch the other locales, so we cannot prove the return tags. This page reports what this document declares.
How to set it
One link per language or region (en, pt-BR, x-default). Absolute http(s) URLs. Each locale should point at the others, including itself. Do not invent a hreflang cluster for a site that only exists in one language.
What a correct cluster looks like
Every language version lists every other version and itself, with the same set of links on each page. That symmetry is what the engine uses to confirm that /en and /pt-br are the same content for different readers rather than two competing pages. One x-default points at the version to show when no language matches — usually the language picker or the original.
Codes follow ISO 639-1 for the language (en, pt, es) with an optional ISO 3166-1 region (pt-BR, en-GB). A region without a language (BR) is invalid and ignored. The href must be absolute and must return 200 with the same alternates in its own head.
Common mistakes
Declaring alternates on the English page only, so the Portuguese page never confirms the relationship (the engine then drops the cluster). Pointing hreflang at a redirect or a page with a different canonical. Inventing regional variants that serve identical content, which creates duplicates instead of alternates. Using the country code alone because the site is “for Brazil”.
A two-language page that passes, and the same page as most sites ship it
As found
<link rel="alternate" hreflang="BR" href="/pt" />
<link rel="alternate" hreflang="en" href="/en" />
<!-- BR is not a language; relative hrefs; no x-default; the /en page lists nothing back -->Fixed
<link rel="alternate" hreflang="pt-BR" href="https://example.com/pt" />
<link rel="alternate" hreflang="en" href="https://example.com/en" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />
<!-- the same three links, in that form, on /pt, /en and / -->The audit of example.com on 5 September 2026 found no hreflang at all, which is correct: the page exists in one language. A cluster is only worth declaring when the alternates really exist.
Questions
Do I need hreflang if my site has only one language?
No. hreflang describes alternates; with a single version there is nothing to describe, and a self-referencing tag alone adds nothing.
Does this checker verify the return links on the other pages?
No. It reports what the audited document declares. To confirm the return tags, run the checker on each alternate URL — the sets should be identical.
hreflang or canonical: which one wins?
They do different jobs. Canonical says “this is the preferred URL for this content”; hreflang says “this content also exists for that language”. Each language version should be canonical to itself and list the others as alternates.
See the full audit in your workspace