SEO audits built for the AI search era

Find what’s holding your page back.

SEOAST reads the HTML your server actually returned, runs 23 practical checks across five dimensions, and hands back a ranked action plan — not generic SEO advice. Every verdict shows the measurement behind it.

No signup required to start — 10 audits a day without an account, 100 a day on a free API key. No credit card in either case.

What comes back

A report is only useful if someone can act on it without a follow-up meeting. Three things make that possible.

  • A score you can put in front of a client

    One number from 0 to 100, produced by fixed published weights rather than a per-report judgement call. The same page audited twice returns the same score, and the weight of every check is listed further down this page.

  • The measurement, not just the adjective

    Every finding carries what was actually read out of the HTML: the title string and its length, how many images have no alt attribute, which JSON-LD types parsed. When someone disputes a verdict you can show them the input instead of arguing about it.

  • A fix aimed at whoever edits the page

    Each check that does not pass returns one specific recommendation naming the element to change. Checks that pass return no recommendation at all, because there is nothing to do and padding the list wastes the reader’s afternoon.

How it works

Four steps, no account

  1. Step 1

    Enter your URL

    One page per audit. No account, no crawl of your whole site, nothing installed.

  2. Step 2

    SEOAST runs the checks it can

    It fetches the page, then that origin’s robots.txt, sitemap and llms.txt. A coverage line states exactly what came back, and anything it could not read is reported as unmeasured — never as a pass.

  3. Step 3

    Read the five section scores

    Indexability, search appearance, content, machine readability and AI-search readiness, each scored on published weights you can check on this page.

  4. Step 4

    Work the ranked plan

    Findings are ordered by impact, confidence, scope and effort — each with what was measured, what to change, who changes it and what should improve.

What SEOAST will not tell you is how much traffic a fix will produce. Nothing in one page of HTML supports that claim, so no number here pretends to.

What you get back

A real report, not a mockup

The report below was produced by running the audit engine against a sample page at build time. Every score, section and action in it is genuine output — if a weight changes or a check is added, this preview changes with it. That is the same reason the check list further down is imported from the engine rather than retyped.

Example report — real output from the audit engineengine 2.0.0

1 page audited · JavaScript not rendered · robots.txt not checked · sitemap not checked

47

1 critical issue is holding this page back. 10 of the 13 can be done in minutes.

  • Indexability and crawl control

    86

    0 failing · 1 to improve

  • Search appearance

    29

    2 failing · 2 to improve

  • Content and structure

    53

    1 failing · 3 to improve

  • Machine readability

    22

    3 failing · 1 to improve

Do these first

  1. 1. Viewport meta tag

    critical · 6

    Found: No <meta name="viewport"> tag was found.

    Improves: Makes the page usable on mobile, which is the index Google ranks from.

    Minutes · This template · Developer

  2. 2. Meta description

    high · 2

    Found: No <meta name="description"> tag was found.

    Improves: Raises click-through on the ranking you already have. Does not affect ranking itself.

    Minutes · This page · Content or copywriter

11 further actions follow in priority order, and every check that passed is listed with what was measured.

What gets measured

The 23 checks, and what each one actually measures

This list is generated from the rule engine itself, including the thresholds. If a check changes, this page changes with it. The weight is that check’s share of the score; weights total 150 when every check is measurable, and only their ratios matter.

Indexability and crawl control

8 checks · 66 of 150 weight

  1. HTTP status

    weight 12

    The status of the final response after redirects. Fails on anything outside the 2xx range, because a URL that does not answer 200 has no document to index; warns on a 2xx that is not 200. Reports not_measurable when the audit was run against supplied HTML rather than a live fetch.

    Fixing it: Gives search engines a document to index at this URL at all.

    About an hour · This page · Developer

  2. Redirect chain

    weight 5

    Every hop followed to reach the page. Fails on a loop, on any hop through plain http, and at 3 or more hops; warns above 1. Each hop costs crawl budget and adds latency for every visitor.

    Fixing it: Cuts latency for every visitor and stops crawl budget being spent on hops.

    About an hour · Whole site · Developer

  3. HTTPS

    weight 5

    The scheme of the final URL and whether a Strict-Transport-Security header was returned. Plain http fails; https without HSTS warns, because the first request of a session can still go out in the clear.

    Fixing it: Removes the browser "not secure" warning and satisfies a confirmed ranking signal.

    About an hour · Whole site · Developer

  4. X-Robots-Tag header

    weight 10

    Indexing directives delivered in the response header rather than the markup, including any bot-name prefix. A noindex or none fails; nofollow warns. This is checked separately from the robots meta tag because the two disagree often and a header-level noindex is invisible in the HTML.

    Fixing it: Removes a header-level block that keeps the page out of the index entirely.

    About an hour · This template · Developer

  5. robots.txt

    weight 12

    The origin /robots.txt, parsed to RFC 9309: consecutive user-agent lines share a group, the most specific group wins, and the longest matching pattern decides with Allow winning ties. Fails when the audited path is disallowed for Googlebot; warns when the file is absent or declares no Sitemap. Distinct from the robots meta tag: a disallow here stops the crawl, not just the indexing.

    Fixing it: Lets crawlers read the page, so every other signal on it can be seen.

    Minutes · Whole site · Developer

  6. Robots meta directives

    weight 10

    Directives across meta robots, googlebot, bingbot and googlebot-news tags. A noindex or none directive fails the check outright because it removes the page from search regardless of every other signal; nofollow warns because it strips the page of its outbound crawl value.

    Fixing it: Removes a directive that keeps the page out of search regardless of its content.

    Minutes · This page · CMS admin

  7. Canonical URL

    weight 6

    Presence of <link rel="canonical">, whether its href is absolute in the markup, whether it resolves to the audited URL itself, and whether more than one canonical is declared. A missing or conflicting canonical lets parameter and trailing-slash variants compete with the page.

    Fixing it: Consolidates duplicate URL variants onto one address, so ranking signals stop being split.

    Minutes · This template · Developer

  8. XML sitemap

    weight 6

    Discovery via the robots.txt Sitemap directive then the conventional paths, followed by XML validation. Fails when nothing retrieved parses, or when a file breaks the 50,000 URL or 50 MB protocol limits; warns on relative or cross-host <loc> values, on partial parse failures, and when a valid sitemap does not list the audited page.

    Fixing it: Shortens the delay between publishing a page and it being discovered.

    About an hour · Whole site · Developer

Search appearance

4 checks · 24 of 150 weight

  1. Title tag

    weight 10

    Presence, length and structure of <title>. Fails when absent or empty; warns outside 15-60 characters (Google truncates around 60) or when a separator-delimited segment such as the brand name is repeated within the same title.

    Fixing it: Improves the strongest on-page relevance signal and the line people click.

    Minutes · This page · Content or copywriter

  2. Meta description

    weight 8

    Presence, uniqueness and length of <meta name="description">. Fails when absent or empty; warns outside 70-160 characters or when more than one description tag is present. Does not rank, but it is the copy that earns the click.

    Fixing it: Raises click-through on the ranking you already have. Does not affect ranking itself.

    Minutes · This page · Content or copywriter

  3. Open Graph tags

    weight 4

    Presence of og:title, og:description and og:image, plus whether the image URL is absolute. Relative og:image values are not resolved by most social crawlers, so the preview renders blank.

    Fixing it: Makes shared links render with a title, description and image instead of a bare URL.

    Minutes · This template · Developer

  4. X (Twitter) card

    weight 2

    Presence and validity of twitter:card (summary, summary_large_image, app or player) and the accompanying title, description and image. Complete Open Graph tags are treated as an acceptable fallback, because X reads them when the twitter:* equivalents are absent.

    Fixing it: Makes links shared on X render as a card rather than plain text.

    Minutes · This template · Developer

Content and structure

5 checks · 35 of 150 weight

  1. Heading hierarchy

    weight 7

    The h1-h6 outline: how many h1 elements exist, whether any heading is empty, and whether the document skips a level (an h2 followed directly by an h4). Zero or multiple h1 elements and skipped levels both make the page outline ambiguous to crawlers and screen readers.

    Fixing it: Gives crawlers and screen readers an unambiguous outline of what the page covers.

    Minutes · This page · Content or copywriter

  2. H1 and title alignment

    weight 6

    Overlap between the meaningful terms in <title> and in the first <h1>, as a fraction of the smaller term set. At or above 0.5 the two describe the same topic; at or above 0.25 they are loosely related; below that the search result promises one thing and the page delivers another. Reports not_measurable when either element is missing or empty.

    Fixing it: Makes the search result and the page agree about the topic, reducing bounce.

    Minutes · This page · Content or copywriter

  3. Content depth and readability

    weight 8

    Visible copy taken from <main>, <article>, <body> or the document, then measured for word count and Flesch Reading Ease. Under 300 words reads as thin; a reading ease below 30 reads as academic or legal prose to a general audience.

    Fixing it: Gives the page enough substance to be a credible answer to the query.

    A project · This page · Content or copywriter

  4. Server-rendered content

    weight 8

    Visible text as a share of the response body, plus inline script share and server-rendered word count. Fails under 60 words alongside a script-heavy document, or below a 2% text ratio; warns below 5%. SEOAST executes no JavaScript, so this measures what a crawler sees before deciding whether to queue a rendered pass.

    Fixing it: Puts the content in the first response, where every crawler reads it, instead of behind a render pass that is neither fast nor guaranteed.

    A project · This template · Developer

  5. Internal linking

    weight 6

    Anchors classified into same-site, external, same-page fragment, non-navigation (mailto:, tel:, javascript:) and href-less. Fewer than 3 internal links makes the page a crawl dead end. Reports not_measurable when the final URL could not be parsed, since there is no origin to judge "same site" against.

    Fixing it: Gives crawlers a path onward from this page and spreads authority through the site.

    About an hour · This template · SEO or marketing lead

Machine readability

5 checks · 23 of 150 weight

  1. Image alt text

    weight 5

    Share of <img> elements with no alt attribute at all. An explicit alt="" is counted as a deliberate decorative marker, not a defect. More than 25% of images missing alt fails; a smaller share warns. Reports not_measurable when the page has no images.

    Fixing it: Makes images usable by screen readers and eligible for image search.

    Minutes · This page · Content or copywriter

  2. Image dimensions (layout shift)

    weight 3

    Share of <img> elements missing both width and height attributes. Without intrinsic dimensions the browser cannot reserve space before the image loads, which is a direct input to Cumulative Layout Shift. Reports not_measurable when the page has no images.

    Fixing it: Reserves space before images load, improving Cumulative Layout Shift.

    Minutes · This template · Developer

  3. Structured data (JSON-LD)

    weight 4

    Every <script type="application/ld+json"> block: whether it parses as JSON, whether it declares an @type (walking arrays and @graph), and which types are present. A block that fails to parse is worse than no block at all, because it forfeits rich-result eligibility silently.

    Fixing it: Makes the page eligible for rich results. Eligible, not guaranteed — Google decides whether to show them.

    About an hour · This template · Developer

  4. HTML lang attribute

    weight 3

    Presence and shape of the lang attribute on <html>, checked loosely against BCP 47 (a two- or three-letter primary subtag plus optional script, region and variant subtags). Drives language targeting, hreflang consistency and screen-reader pronunciation.

    Fixing it: Tells search engines and screen readers which language the page is written in.

    Minutes · Whole site · Developer

  5. Viewport meta tag

    weight 8

    Presence of <meta name="viewport">, whether it sets width=device-width, and whether it blocks pinch zoom via user-scalable=no or a maximum-scale below 2. A missing viewport fails mobile-first indexing; a zoom lock is an accessibility defect.

    Fixing it: Makes the page usable on mobile, which is the index Google ranks from.

    Minutes · This template · Developer

AI-search readiness

1 checks · 2 of 150 weight

  1. llms.txt (AI-search readiness)

    weight 2

    The site-root /llms.txt: whether it is Markdown, has the required H1, carries a summary of at least 40 characters and links to any pages. A malformed file fails; absence only warns. No search engine has committed to reading this file and its absence is not known to cost visibility — it carries the lightest weight on this list for exactly that reason.

    Fixing it: Gives AI crawlers a curated map of the site. An emerging convention with no confirmed effect on search visibility.

    Minutes · Whole site · SEO or marketing lead

AI-search readiness

Build a site machines can understand

Discovery increasingly depends on whether a system can crawl your page, read it without executing JavaScript, and interpret what it is about. SEOAST measures those foundational signals. Each one below is a check that actually runs:

  • robots.txt

    robots_txt

    Lets crawlers read the page, so every other signal on it can be seen.

  • X-Robots-Tag header

    x_robots_tag

    Removes a header-level block that keeps the page out of the index entirely.

  • Server-rendered content

    render_dependency

    Puts the content in the first response, where every crawler reads it, instead of behind a render pass that is neither fast nor guaranteed.

  • Structured data (JSON-LD)

    structured_data

    Makes the page eligible for rich results. Eligible, not guaranteed — Google decides whether to show them.

  • Heading hierarchy

    heading_hierarchy

    Gives crawlers and screen readers an unambiguous outline of what the page covers.

  • HTML lang attribute

    html_lang

    Tells search engines and screen readers which language the page is written in.

  • llms.txt (AI-search readiness)

    llms_txt

    Gives AI crawlers a curated map of the site. An emerging convention with no confirmed effect on search visibility.

What this is not

SEOAST does not query ChatGPT, Perplexity, Gemini or Google AI Overviews, and it does not monitor or measure whether they cite you. Nothing here reports an “AI visibility score”. It measures whether the foundations those systems depend on are in place, which is a different and smaller claim — and one that can be checked.

llms.txt is included on the same terms: an emerging convention with no confirmed effect on search visibility, carrying the lightest weight on the list, where a missing file only ever warns.

What to do first

A report is a plan, not a scoreboard

Every report opens with the three things worth doing first, each with what was measured, what to change, who changes it, roughly how long it takes and what should improve afterwards. The ordering is computed, published and testable:

  • priority = impact x confidence x scope x severity / effort.
  • Impact (1-3) is how much fixing it moves indexability, search appearance or AI discoverability.
  • Confidence (0.5-1.0) is how directly the evidence supports the recommendation. A missing <title> is a measured fact (1.0); an H1/title overlap ratio supports a softer inference (0.75); a readability score is a proxy for a proxy (0.5). Heuristics rank below facts, always.
  • Scope is blast radius: one URL (x1), a template (x2), the whole site (x3). Fixing the sitewide thing once is worth more than fixing the page thing once.
  • Effort is 1 for minutes in a CMS field, 2 for an hour of developer time, 3 for a project.
  • Severity: a fail counts double a warn, matching the scoring model.
  • Bands: critical at 4 and above, high from 2, then medium and low.
  • What this deliberately does not do is predict traffic. Nothing in one page of HTML supports that claim, so no number here pretends to.

How the score is calculated

Published in full, because a score nobody can reconstruct is a score nobody should trust.

  • Each check earns a fraction of its weight: pass = 1.00, warn = 0.50, fail = 0.00.
  • not_measurable is excluded from both the earned points and the total, so a page with no images is not punished for having no alt text — the denominator shrinks instead.
  • score = round(100 x earned / considered), so it always reads as "percentage of what could be measured".
  • Four indexability failures then cap the result outright: http_status holds it at 25, x_robots_tag holds it at 35, robots_meta holds it at 35, robots_txt holds it at 40. A page search engines cannot reach does not get to score well on the strength of tidy Open Graph tags. The uncapped number is reported alongside it, so a report can show both.
  • Bands: green at 80 and above, yellow from 55 to 79, red below 55.
  • A score of 0 with nothing considered means "not assessed", not "assessed and terrible".
  • Nothing SEOAST did not fetch is ever reported as a pass. Checks with no input report not_measurable and the coverage line at the top of every report says exactly what was retrieved.

Green

80–100

The fundamentals are in place. Remaining findings are refinements.

Yellow

5579

Working, but leaving measurable value on the table.

Red

0–54

Something structural is wrong. Start at the top of the fail list.

What it does not do

Stated up front, so you find out here rather than mid-audit.

It reads the HTML your server returned
No headless browser, no JavaScript execution. If a page assembles its head tags client-side, SEOAST reports what is missing from the first response — which is what a crawler gets before it decides whether the page is worth rendering a second time.
One URL per audit
There is no crawl and no site-wide rollup. You point it at the page you care about, and it grades that page. Auditing a set of pages means calling it once per page, which the API makes straightforward.
On-page only
No backlinks, no keyword rankings, no traffic estimates. Nothing here depends on a third-party data vendor, so nothing here goes stale or disagrees with the tool next to it.
Unmeasurable is a real answer
A page with no images is not marked down for missing alt text. That check reports “not measurable” and drops out of the denominator instead of scoring zero, so the number always means “percentage of what could actually be checked”.

Built around how the work actually happens

  • Agencies

    Run an audit during a prospect call and have something concrete on the screen before the call ends. Every verdict comes with its evidence, so the deliverable survives a technical reviewer on the client side.

  • In-house marketers

    Check a page before it goes live and again after the CMS has had its way with it. The findings name the element to change, which is the difference between a ticket that gets done and a ticket that gets asked about.

  • Developers

    The REST endpoint and the MCP server share one code path, one auth model and one quota. Wire the audit into CI, a deploy hook, or an agent, and get the same verdicts the web UI shows.

The same audit, from your own tooling

The web form on this site is a client of the public API, not a separate implementation. One code path handles authentication, quota and the outbound fetch, so an audit run from a script returns exactly what the browser shows.

REST

POST /api/v1/audit with a JSON body of { "url": "..." }. Responses carry X-RateLimit-* headers, and a 429 includes Retry-After.

curl -X POST https://seoast.ai/api/v1/audit \
  -H 'content-type: application/json' \
  -H 'x-api-key: seoast_sk_...' \
  -d '{"url": "https://example.com/pricing"}'

MCP

An MCP server is mounted at /api/mcp over Streamable HTTP, so an agent can run an audit as a tool call and read the findings directly. It authenticates with the same key, spends the same quota and is bound by the same fetch restrictions as every other caller. Connection details and the tools it exposes.

Refusals are explicit

SEOAST only fetches publicly reachable http and https URLs on ports 80 and 443, and it refuses private and internal addresses. If metering is unavailable it returns 503 rather than running an unmetered audit. Every failure has a machine-readable code.

The free tier, spelled out

No account

10audits per day

Counted per client address, resetting at midnight UTC. Enough to check a landing page, fix it, and check it again. Nothing to sign up for.

Free API key

100audits per day

The same allowance across the web form, the REST endpoint and the MCP server, counted against the key rather than the address. Higher-volume tiers exist on the same key system for teams that outgrow it.

Questions

The things people ask before they trust a number

What does SEOAST actually fetch?

The URL you give it, then three site-level documents from the same origin: /robots.txt, an XML sitemap, and /llms.txt. Every report states which of those came back, so you can tell the difference between "checked and fine" and "never looked". Nothing that was not fetched is ever reported as passing.

Does it render JavaScript?

No. It reads the HTML your server returned, which is what a crawler sees before it decides whether the page is worth queueing for a rendered pass. One of the checks measures exactly that gap: if your copy only exists after hydration, the report says so rather than quietly grading an empty shell.

Is this a site crawler?

Not yet. One URL per audit, plus the three site-level documents above. There is no crawl, no site-wide rollup and no rank tracking. When that changes it will be on this page.

Why did a page with good markup score badly?

Probably a cap. Four indexability failures hold the final score down regardless of everything else: a non-200 status, a noindex in the robots meta tag, a noindex in the X-Robots-Tag header, or a robots.txt rule blocking the URL. The report shows the uncapped number alongside, so you can see the page was fine and the plumbing was not.

What is the difference between the robots meta tag and robots.txt?

They fail in opposite directions and SEOAST checks them separately. A meta noindex lets the crawler read the page but keeps it out of the index. A robots.txt disallow keeps the crawler out entirely — the URL can still be listed, with no title and no description, because nothing was ever read. A third variant, X-Robots-Tag, does the first one from a response header where it is invisible in the markup.

Will an llms.txt file improve my rankings?

There is no published evidence that it will, and no search engine has committed to reading it. SEOAST checks it because the convention is cheap to satisfy and clients ask about it — which is why it carries the lightest weight on the list and why a missing file only ever warns. A malformed one is scored down, because publishing something broken is worse than publishing nothing.

Can I use it from an agent or a build pipeline?

Yes. The same audit is available over REST and over MCP, from one pipeline — the web page, the API and the MCP tools cannot disagree about a verdict, because there is only one implementation of it.

Does the score mean anything on its own?

It means "percentage of what could be measured, weighted by published weights". It is reproducible — the same page audited twice returns the same number — and every weight is listed on this page. It is not a prediction of traffic, and no honest tool can give you one.

Works well with AI Venture Holdings tools

SEOAST is one of several tools AI Venture Holdings builds and runs. These are live today.

  • DomainFind.ai

    Domain research and availability checking from AI Venture Holdings.

    Settle the domain before you build the site, then audit the pages you ship on it. Same team, same idea of a useful answer: a decision you can act on, not a report to file.

Pick a page you already argue about.

Paste the URL and read the findings. If it disagrees with you, the evidence is right there to check.

Audit your page

No signup required to start.