Check a Page
Paste a full page address, not just a domain. The page you name is the page that gets read.
Try one:
Fetching the page and robots.txt...
Nothing is stored. The page and robots.txt are read, checked and discarded.
Ask a Chatbot Why Your Page Is Not Ranking
It will give you an answer, and the answer will be fluent, plausible and about forty per cent wrong. A language model has no way to fetch your page and measure it. It cannot count the characters in your title tag, cannot tell whether the canonical points at this URL or the one next to it, cannot parse your JSON-LD to see whether the block is valid, and cannot resolve which of the two conflicting Disallow rules in your robots.txt wins. It has read a great deal about SEO and it has never seen your server.
That gap is the whole reason this tool exists. Every check below is a fact about bytes that came back over HTTP, read with the same RFC 9309 precedence a crawler applies and the same JSON parse a browser applies. There is nothing to infer. The title is 87 characters or it is 51. The canonical resolves to this address or it resolves to another one. The OAI-SearchBot group says Disallow or it does not.
And every finding that can be fixed arrives with the fix already written out. Not advice. The tag.
What You Get
- Indexability before anything else — noindex from the head or from a response header, a canonical aimed at a different page, a robots.txt rule covering the exact path, an HTTP status that is not 200. These are checked first because nothing else matters while they are true.
- robots.txt resolved against 19 AI crawlers — not just Googlebot. GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, PerplexityBot, Google-Extended, CCBot and the rest, each checked with longest-match-wins and Allow-beats-Disallow tie-breaking. Blocking a training crawler and blocking the crawler that cites you in an answer are two different decisions that the same file makes, and they are routinely confused.
- Structured data that is actually parsed — every JSON-LD block is JSON.parse'd. A block that does not parse is reported as an error, because it is discarded without warning: the page looks instrumented and carries nothing.
@graphwrappers are unwrapped, and an@iddeclared twice with different values is named as a conflict. - The result preview Google would build — the title and description exactly as they are on the page, rendered the way a result renders them, so a truncation is visible rather than theoretical.
- A paste-ready snippet on every finding — the
<link rel="canonical">, the five Open Graph tags filled in from your own page, therobots.txtgroup that unblocks your search crawlers while still blocking training ones. This is the part no free checker gives you, and it is the part that turns a report into an edit. - JSON output — the whole report as an object, for piping into your own tooling or handing to an agent.
What This Tool Will Not Tell You
The score is not a ranking prediction. It is a count of the defects visible in one page's source, and it has no opinion about whether your content is any good. A page can score 95 and rank for nothing, and a page can score 40 and rank first. Read the findings, ignore the number.
It also cannot measure speed, Core Web Vitals, backlinks, keyword rankings, competitor gaps or anything about how the page looks. Those need a browser and a crawl budget, and pretending a two-request check knows them would be the exact kind of confident nonsense this page is arguing against. For Core Web Vitals, the honest instrument is PageSpeed Insights, and Google publishes the field data itself.
One page is one page. Auditing a whole site is a different job with a different cost, and the Sitemap Audit tool next door does that half: it takes your sitemap and fetches a sample of the pages in it.
Frequently Asked
What does this SEO checker actually check?
Thirty-plus checks across six layers: whether the page can be reached and served as HTML, whether anything is blocking it from the index, the title and meta description, the heading structure, the technical head tags, structured data, and whether the crawlers behind AI answers can read it. It reads one page, not a site.
Why does it check AI crawlers at all? This is an SEO tool.
Because robots.txt is a single file that decides access for Googlebot and for every AI crawler at the same time, and the two decisions are usually confused. Blocking GPTBot stops OpenAI training on your pages. Blocking OAI-SearchBot stops ChatGPT citing you. They are different crawlers with different jobs, and a rule that looks reasonable for one silently breaks the other. Most SEO checkers only look at Googlebot, so this is the part of the file that goes unaudited.
Is the score a ranking prediction?
No. It is a count of the problems this tool can see on one page, and nothing more. A page can score badly and rank well, and score perfectly and rank badly. It is useful for the same reason a spellchecker is useful: not because it knows what you meant, but because it catches the mechanical failures that are invisible from inside the page.
Does it crawl my whole site?
No. It checks the one address you give it, and robots.txt. Crawling a site is a different tool with a different cost, and this one makes two requests per run. For the sitemap itself, with per-URL indexability checks across a sample of pages, use the Sitemap Audit tool linked at the bottom of this page.
Why is my title flagged when it looks fine in a browser?
A browser never truncates a title, so in your own browser it always looks complete. Google publishes no character count and no pixel count for one: its documentation says a title is “truncated in Google Search results as needed, typically to fit the device width.” Fifty to sixty characters is the practical range where it still reads in full on a phone. Past that a title loses its tail in the result, and the part being cut is usually the part written to win the click. This tool measures the characters a reader would actually see, and treats 60 as a target rather than a published rule.
What is an @id conflict?
An @id names one entity. If two JSON-LD blocks on the same page declare the same @id with different values for name, url or sameAs, a consumer has to pick one and discard the other. Nothing errors: the page looks correctly instrumented and the attribution or organisation signal is quietly halved. The fix is to define the entity once and reference it by @id everywhere else.
Is the URL I check stored or logged?
No. The response carries a no-store cache header, the HTML and robots.txt are read and discarded, and nothing is written to storage or to disk. We do not keep a list of the sites people check.
Can I check a page on my local network?
No. The check runs on a public server, so an address that only exists on your machine, or on a private network, is rejected before anything is requested. This is deliberate: an open fetcher that would accept any host is an open fetcher that can be pointed at things that are not yours.
Comments & Ratings