vasilenko.info

hreflang checker

/en/tool/hreflang-checker/ works crawls the server

Enter the URL of any language version — the tool will find the others from its markup and crawl them automatically. For each page, it checks the response code, canonical, noindex, and robots.txt restrictions; parses link tags and the Link header; compares language codes against authoritative ISO lists; and shows which links are confirmed from both sides and which are not. If the markup is in a sitemap, enter the sitemap URL: we’ll parse it along with its xhtml:link tags and process sitemap indexes in chunks.

promoTwenty years of notes on websitesHow we did it in 2008 and what still works today.Open

Set check

Enter one URL. The tool will find the other versions and visit each one.

Where to get the markup

We will fetch the page, extract all link rel=alternate entries from the markup and the Link header, then open each listed version and check its response, canonical, noindex, and return links.

How to crawl

The site returns different markup depending on the user agent. If you get a 403, the site blocks bots. Switch to a regular browser.

Each version is a separate request from our server. There can be no more than 300 per hour from one URL. The limit for one run is 50 versions.

Set summary

Empty

Pages in set
hreflang links
Unique language codes
One-way links
Errors

    Our server opens pages and sitemaps because the browser cannot access another domain. The limit is 300 requests per hour from one URL, and none of the checked data is stored anywhere.

    promoCalculate ROI at the same timeCampaign payback based on spend and revenue.Open

    How to use it

    1. Enter the address of any language version and click “Check set.” The tool will get the other versions from its markup—from link tags and the Link header, which is not visible in the page source at all.

    2. Read the matrix by rows. A row is a page and everything it declares about the set. A cross means the link leads somewhere invalid: the response is not 200, there is a redirect, noindex is present, or the language code does not exist.

    3. Understand the arrows. An arrow means a one-way connection: A names B as its pair, but B says nothing about A. No one confirms this connection, so the search engine may ignore it.

    4. Check the response column in the notes table. For links returning 301, click “chain” to see every step with its codes and the final address. hreflang should point to that address.

    5. Download the CSV and send it to the developer. It contains the page, language code, address, response code, reciprocity, and note—one row for each link in the set.

    6. If the markup is in a sitemap, open the “Sitemap or list” tab and provide its address. The server parses the sitemap as XML, so xhtml:link tags are not lost. We follow sitemap indexes piece by piece. The checks are the same as for pages, while response codes are requested with a separate button so requests are not used silently.

    7. If the site is password-protected or inside a closed network, our server cannot access it. Use the “Pasted code” tab instead. The checks are the same; you provide the data yourself.

    promoBrowser task listNo account required—everything is stored on your device.Open

    Example breakdown: three versions, one one-way connection

    The input data is the same as the default field values: you can calculate it mentally and confirm that the tool is telling the truth.

    1. For the Russian version's address, the tool fetches the page and finds three links. It then follows them and fetches the other two versions—you do not need to enter them manually.

    2. For each version, it checks the response code, canonical, meta robots, the X-Robots-Tag header, and the robots.txt restriction. All three return 200 and are accessible.

    3. Each version links to itself: ru for the Russian version, en for the English version, and de for the German version. In the matrix, these are the diamonds on the diagonal.

    4. The Russian and English versions name the German version as their pair, while the German version lists only itself and the English version. In the German version's row, the ru column contains a dot; in the Russian version's row, the de column contains an arrow.

    There is one one-way connection: https:\/\/example.com\/de\/ does not link back to https:\/\/example.com\/. There is also a note that x-default is not set on any version, so the search engine has no fallback.

    Frequently asked questions

    promoAll toolsForty-four tools, all running in your browser.Open

    Related tools

    6

    UTM builder

    Builds a tagged URL and keeps your campaign list close at hand.

    Open