Hreflang Checker
This hreflang checker reads hreflang annotations from a single URL you enter, from both the HTML tags and the HTTP Link header, or from every <url> entry in an XML sitemap.
Result for
No hreflang tags found, in either the <head> or the HTTP Link header.
This page also carries a noindex directive.
Its canonical tag points elsewhere too: .
Result for
This page carries a noindex directive. Search engines don't index a noindexed page, so its hreflang tags are ignored regardless of whether they're correct.
This page's canonical tag points to instead of itself. Google reads hreflang from the canonical version of a page, so tags declared here may be disregarded in favour of whatever that page declares.
Conflicting annotation: is declared for more than one URL.
Declared tags
-
Relative URL. Google asks for fully-qualified alternate URLs, including https://, so write the full address in the tag.
Return-tag check
Checked of alternates. Capped at 20 for this free check.
Each alternate is fetched for its HTTP status, whether it is indexable (no noindex, canonical pointing at itself), whether it links back and whether it declares the same versions and codes as this page.
not a clean, indexable 200. Google drops those from the cluster even when the return tag is right.
a different set from this page: a version left out, or a URL given another code. Every version should list every other version, with the same codes.
-
Noindex Canonical elsewhere Incomplete set Code mismatch
Corrected tag set
Put this same set on every version in the cluster. Each page lists itself and every other version, which is what makes the return tags line up.
One <url> entry per version, each listing the whole set. The <urlset> needs xmlns:xhtml="http://www.w3.org/1999/xhtml" for these to parse.
Only the first 20 alternates were checked, so the rest are passed through as declared.
What changed from your tags
Nothing to change: this page already declares a complete, valid set. Copy it for the next version you add.
Sitemap
of checked entries carry hreflang tags
Checked the first of URL entries in this sitemap. Capped for this free check.
No <url> entry in the checked portion of this sitemap carries an xhtml:link hreflang annotation.
-
Duplicate
Note
<link rel="alternate" hreflang="..."> tags in its <head> and the HTTP Link response header, then fetch up to 20 of the alternates named to confirm each one returns a 200, is indexable, links back, and lists the same set of versions with the same codes as this page. We also flag a relative alternate URL, and a noindex directive or a canonical tag pointing elsewhere on this page or any alternate, all of which make otherwise-correct hreflang tags get ignored. Hreflang is only honoured when it's reciprocal: a one-directional tag is disregarded by search engines even when the target page genuinely exists.
Note
<xhtml:link rel="alternate" hreflang="..."> annotation inside each <url> entry, Google's third documented method alongside HTML tags and the HTTP header. Because a sitemap declares a whole cluster's alternates together, reciprocity is checked directly from what the sitemap itself declares, with no extra fetch per alternate. An alternate URL that isn't its own entry in this sitemap is marked "not confirmable from here" rather than assumed broken, since it may still be correctly declared in that page's own HTML.
It checks the language and region codes are valid, and confirms a self-referencing tag and x-default are present. It then checks each alternate for a return tag, because hreflang only works when every version in a cluster reciprocates, and (in single-page mode) checks that each alternate lists the same versions with the same codes, reports each alternate's HTTP status and whether it is indexable, flags a relative alternate URL, and flags a noindex directive or a canonical pointing elsewhere, either of which makes correctly-formed hreflang tags get ignored anyway. Finally, it writes out the corrected tag set, as HTML tags, an HTTP Link header or sitemap entries, with every change explained.
Use this tool often? Bookmark this page, so it is one click away next time.
Email me this result
Want a copy for your records or a client? Leave your email and we'll send you this result. It is written by a real person at Crawl Cove, not an automated blast, so it may take a little while to arrive. We'll only use your address to send it, unless you also tick the box below. Privacy policy.
Got it. We'll email your result to you. Nothing else lands in your inbox unless you ticked the tips box.
What this hreflang checker shows you
Paste a URL and it is fetched server-side. The tool reads every <link rel="alternate" hreflang="..."> tag in its <head> AND any hreflang entries in its HTTP Link response header (the method some CDNs and edge configs use, and the only option for non-HTML files like PDFs), checks each language or language-region code is validly formed, and reports whether the page carries a self-referencing tag (a hreflang entry pointing at itself) and an x-default fallback. It then fetches up to 20 of the alternate URLs named and, for each one, reports its HTTP status code, whether it is indexable (no noindex in its meta robots or X-Robots-Tag header, and a canonical that names itself) and whether it carries a tag pointing back to the page you started from. A tag written as a relative path such as /fr/ is flagged too, because Google asks for fully-qualified URLs.
Sitemap mode: every entry's hreflang, checked at once
Switch to sitemap mode and paste a sitemap (or sitemap index) URL instead of a page. Large international sites often declare hreflang as <xhtml:link> annotations inside the sitemap itself rather than in every page's <head>, because it scales without adding markup to every page. This checker reads those annotations from every <url> entry (up to 300, following a sitemap index up to 5 children deep) and cross-checks reciprocity directly from the sitemap: since a sitemap-hreflang cluster declares every alternate on every entry, no extra fetch per alternate is needed the way single-page mode needs one.
Two ways hreflang gets ignored even when the tags are correct
A noindex directive on the page means search engines never index it, so its hreflang tags are moot regardless of how carefully they are written. A canonical tag pointing at a different URL has a similar effect: Google reads hreflang from the canonical version of a page, so tags declared on a non-canonical copy may be disregarded in favour of whatever the canonical page declares instead. This checker flags both, because they are easy to introduce by accident (a templating default, a migration that left an old canonical in place) and easy to miss because the hreflang tags themselves look perfectly correct.
Why a one-way hreflang tag does nothing
Hreflang is only honoured when it is reciprocal. If your English page names a French page as its fr alternate, the French page must name the English page back as its own alternate; search engines treat this as a two-way confirmation, and a link in only one direction is disregarded entirely. This is what makes hreflang fragile: a cluster of five regional pages needs the return link correct on all five, and moving one page's URL without updating the others breaks reciprocity for the whole cluster, not just the page that changed.
Why "en-uk" is not a valid code, and other common mistakes
A hreflang value pairs an ISO 639-1 language code with an optional ISO 3166-1 region code, separated by a hyphen, such as en-gb or fr-ca. The single most common typo is en-uk for British English: there is no region uk, and the United Kingdom's region code is gb. Bare uk is a different trap. It is a valid code, but it means Ukrainian, so a British page tagged uk tells search engines it is written in Ukrainian. This checker tests every two-letter language and region against the ISO lists, so en-xx is flagged, and so is a region used on its own, such as gb. Other frequent errors it flags: an underscore instead of a hyphen (en_US), a language name instead of a code (english), the same code declared for two different URLs (a conflicting annotation), and a missing self-referencing tag, which Google's own guidelines call for on every page in a cluster.
The corrected tag set, ready to paste
Finding the errors is half the job; the other half is writing a set that works. After every single-page check, this tool builds the tag set the cluster should carry from what it found: en-uk rewritten as en-gb, other invalid codes left out, a redirecting alternate replaced by the URL it lands on, an alternate whose canonical points elsewhere replaced by that canonical, noindexed and broken alternates left out, a code claimed by two URLs kept once, and a missing self-reference or x-default added. Each change is listed in plain English, so nothing is rewritten without telling you. Copy it as HTML link tags, an HTTP Link header or XML sitemap entries. The same set goes on every version, because each page has to list itself and all the others for the return tags to line up. Two things it cannot know for you: the code of the page you checked, if it has no self-reference (that line is marked LANGUAGE-REGION for you to fill in), and whether you have a language selector page that x-default should point to instead.
What a missing x-default costs you
x-default names the fallback page for a visitor who doesn't match any of your named language or region pairs, typically a language-selector page or your primary market's version. Without it, search engines are left to guess which version to show a visitor outside your explicit targeting, which can mean the wrong regional page from someone else's market. It costs one extra tag to declare and this checker tells you if it is missing.
The limit worth stating plainly
This checks the URL you enter against the alternates it names, up to 20 of them. It cannot discover a page that should be in the cluster but isn't linked from anywhere, and it only sees a cluster as wide as this one page's own tags describe. Finding every hreflang relationship on a site, including pages other pages fail to reference, needs a crawl of the whole thing rather than one page read in isolation.
One page here, every page in your cluster there
Checking a single URL is a fast way to confirm one relationship is working, but the failure that actually costs traffic is usually somewhere else in the cluster: a page nobody thought to check that never got the return tag added when a new region launched. Crawl Cove maps hreflang across every page it crawls at once, so a broken reciprocal link surfaces regardless of which page in the cluster you would have thought to test. On every crawled page it flags invalid codes, a missing self-reference, missing return tags, an alternate that is not indexable or whose canonical names another URL, one code claimed by two URLs, and a missing x-default.
the bulk hreflang checker for your whole site · See Crawl Cove pricing
Frequently asked questions
- What is a hreflang tag?
- An HTML link tag that tells search engines which language and region a page targets, and names the alternate version to show a visitor searching from elsewhere. It pairs a language code with an optional region code, such as en-gb or fr-ca.
- Why does my hreflang tag not work even though it looks correct?
- The most common cause is a missing reciprocal tag: hreflang is only honoured when the alternate page links back to the original. A one-directional relationship is disregarded, so check the page your tag points at also names yours back.
- Is "uk" a valid hreflang code?
- Only as Ukrainian. On its own, "uk" is the ISO 639-1 language code for Ukrainian, so it is valid, but it tells search engines the page is in Ukrainian. As a region it is not valid at all: there is no region "uk", the United Kingdom is "gb", so British English is en-gb, not en-uk. This checker marks en-uk invalid and warns on a bare uk.
- Can it write the corrected hreflang tags for me?
- Yes. After a single-page check it builds the corrected tag set from what it found, lists every change it made, and lets you copy the result as HTML link tags, an HTTP Link header or XML sitemap entries. The one value it cannot fill in is the code of the page you checked when that page has no self-referencing tag, because only you know which audience it targets; that line is marked LANGUAGE-REGION.
- What is x-default for?
- It names the fallback page shown to a visitor who doesn't match any of your explicit language or region pairs, typically a language-selector page or your main market's version. Leaving it out means search engines have to guess for anyone outside your named targeting.
- Do I need a self-referencing hreflang tag?
- Yes. Every page in a cluster, including the one you are looking at, should list itself among its own hreflang alternates. This checker reports whether that tag is present.
- How many alternate URLs does this check?
- Up to 20 named on the page you enter. Each is fetched to confirm it carries a tag pointing back to the original URL; a redirected or unreachable alternate is reported with its HTTP status code (and, for a redirect, where it goes) rather than checked for reciprocity.
- Does every alternate need to list every other version, or just mine?
- Every other version. Google asks each language version to list itself and all the other versions, not just the page that points at it. So for each alternate it fetches, this checker compares that page's own hreflang set with yours and flags two things: a version you list that it leaves out, and a URL it gives a different code to (calling your page en-us while your page calls itself en-gb, say). Both mean the pages in the cluster disagree about what the cluster is.
- Does it check that the alternate pages are indexable?
- Yes. Every alternate it fetches is checked for a noindex directive, in the meta robots tag or the X-Robots-Tag header, and for a canonical tag pointing at a different URL. Either one takes that alternate out of the cluster even when its return tag is perfect, so each is flagged next to the alternate it affects.
- Can hreflang use relative URLs?
- No. Google's documentation asks for fully-qualified alternate URLs, including the https:// part, so href="/fr/" or href="//example.com/fr/" is not reliable even though a browser would resolve it. This checker resolves the URL so it can still test the alternate, and marks the tag as relative so you know to write it out in full.
- Does this check hreflang in the HTTP header, not just the HTML?
- Yes. In single-page mode, this checker reads both a <link> tag in the page's <head> and a hreflang entry in the HTTP Link response header (the latter mainly used for non-HTML files like PDFs and by some CDNs), and labels each declared tag with where it came from.
- Can this check hreflang declared in an XML sitemap?
- Yes. Google documents three ways to declare hreflang: HTML <link> tags, the HTTP Link header, and <xhtml:link> annotations inside an XML sitemap, the method larger international sites often use because it avoids adding markup to every page. Switch this tool to sitemap mode and paste a sitemap URL to check that third method.
- Why would hreflang be ignored even if my tags are correct?
- Two common reasons: the page carries a noindex directive, so search engines never index it and its hreflang is moot; or its canonical tag points to a different URL, so search engines read hreflang from that canonical version instead of this one. This checker flags both conditions.
- Is this hreflang checker free?
- Yes. It is completely free and needs no sign-up.
- Can I check hreflang on a site I do not own?
- Yes, the same as any browser could reach the URL and its alternates directly. It is a read-only check, nothing is submitted to the target, and results are not stored anywhere you or anyone else can browse back to.
From one page to your whole site
This checks one URL against its own declared alternates. Crawl Cove builds the whole hreflang cluster as it crawls a site, cross-referencing every page against every other page rather than one page's own claims, so a page missing FROM someone else's tags is caught too. See the bulk hreflang checker for your whole site or compare the plans.
Prefer the terminal? This check is also an open-source CLI: crawlcove-hreflang-checker.
More free tools
-
SERP Snippet Preview
Open tool → -
Title Tag Checker
Open tool → -
Meta Tag Generator
Open tool →