Hreflang checker

Enter a live URL. The checker reads its hreflang tags, then visits every alternate to prove the return links are really there.

Results appear here: the codes found, a lamp matrix of who links to whom, and a list of problems sorted by severity. Nothing loads until you press Check hreflang.

What this hreflang tester checks

  • Valid codes: an ISO 639-1 language, optionally a script and an ISO 3166-1 alpha-2 region, or x-default. Country-only values, en-UK and es-419 are flagged.
  • Absolute URLs including the protocol.
  • Self-reference: the page must list itself, with the exact URL.
  • Return links: every alternate is fetched to confirm it links back.
  • Conflicts: one code pointing to two URLs, alternates that redirect, return 4xx/5xx, are noindex or canonicalise elsewhere.

Found errors? The common hreflang errors guide explains each one and how to fix it.

How fetching works

Each URL is fetched once by our server with a clear user agent (HreflangToolBot). Only public http/https addresses are allowed; private, loopback and cloud-metadata addresses are refused after DNS resolution. Redirects are capped at three, time at eight seconds and size at 1 MB. The checker never crawls beyond the alternates listed on your page, and at most 20 of them.

Hreflang checker questions

What does the hreflang checker test?

It fetches the URL you enter, reads hreflang from the HTML head and the HTTP Link header, validates every code and URL, then fetches each alternate (up to 20) and confirms that each one links back and lists itself. It also flags alternates that redirect, return errors, are noindex or canonicalise elsewhere.

Why does a missing return link matter?

Google documents that if page X links to page Y, page Y must link back to X. When the return link is missing, the annotations may be ignored or not interpreted correctly.

Can it check hreflang in my XML sitemap?

Paste the sitemap into the hreflang validator. It parses the xhtml:link entries and checks return links between all URLs in the file without fetching anything.

Why did my page fail to load?

The checker only fetches public http and https URLs on standard ports, follows at most three redirects, stops after eight seconds and reads the first megabyte. Pages behind a login, firewall or bot protection may refuse the request.

Does it work on staging sites?

Only if the staging site is publicly reachable. Private and internal addresses are blocked for security. For local builds, paste the page source into the validator instead.