SEOAST — home

On-page SEO auditing

Hand over a fix list, not an opinion.

SEOAST fetches the URL you give it, reads the HTML the server actually returned, and grades 15 on-page signals. What comes back is a score you can defend, the measurement behind every verdict, and one specific change to make.

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.

The 15 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 90 when every check is measurable, and only their ratios matter.

  1. 01. 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.

  2. 02. 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.

  3. 03. 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.

  4. 04. 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.

  5. 05. 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.

  6. 06. 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.

  7. 07. 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.

  8. 08. 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.

  9. 09. 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.

  10. 10. 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.

  11. 11. 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.

  12. 12. 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.

  13. 13. 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.

  14. 14. 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.

  15. 15. 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.

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".
  • 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".

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.

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.

Run an audit