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.
01. Title tag
weight 10Presence, 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.
02. Meta description
weight 8Presence, 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.
03. Canonical URL
weight 6Presence 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.
04. Robots meta directives
weight 10Directives 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.
05. Open Graph tags
weight 4Presence 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.
06. X (Twitter) card
weight 2Presence 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.
07. Heading hierarchy
weight 7The 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.
08. Image alt text
weight 5Share 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.
09. Image dimensions (layout shift)
weight 3Share 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. Internal linking
weight 6Anchors 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. Structured data (JSON-LD)
weight 4Every <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. HTML lang attribute
weight 3Presence 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. Viewport meta tag
weight 8Presence 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. Content depth and readability
weight 8Visible 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. H1 and title alignment
weight 6Overlap 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
55–79
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