# AIO Score

> How reliably an agent can read a page, 0 to 100 — every penalty, the grades, and hallucination risk.

Source: https://docs.buildonto.dev/concepts/aio-score
Section: Concepts

---

AIO Score\[01\]

## AIO Score

How reliably an agent can read a page, 0 to 100. Every page starts at 100 and loses points for named faults — so a score always comes with its reasons.

### Try it

\[02\]

Drag a score

JSON-LD2+ headingsServes Markdown

1.  90–100Excellent
2.  75–89Good
3.  50–74Needs work
4.  25–49AI-hostile
5.  0–24Invisible

Your agent should

Use it, but check anything load-bearing elsewhere.

Risk is medium — usual for a page that doesn’t serve its own Markdown.

The tool hands the model

{
  text: "# …",
  aio\_score: 62,
  grade: "Needs work",
  hallucination\_risk: "medium",
}

### Every penalty

\[03\]

FaultPointsCan apply on

No JSON-LD−20API and scanner

Fewer than 2 headings (h1–h3)−10API and scanner

Images without alt text−5API and scanner

Markdown not served by Onto — “Unmanaged AI Payload”−10API and scanner

No Markdown version at all−25Scanner only

Mostly code, little content−25, or −10 if milderScanner only

Page over 200 KB−10Scanner only

robots.txt blocks agentsscore 0Your own verified site

Points come off 100 and stop at 0; nothing adds points back. The reasons come back as text in `penalties`, with `benefits` and `recommendations` alongside. An image with `alt=""` counts as labelled; headings are counted across the whole page, nav included.

### Grades and risk

\[04\]

ScoreGradeRisk, at best

90–100Excellentlow

80–89Goodlow

75–79Goodmedium

50–74Needs workmedium

0–49AI-hostile, Invisiblehigh

Risk is `high` below 50, or when a page has neither JSON-LD nor headings. `low` takes 80 or more _and_ JSON-LD, headings and a Markdown version — otherwise it's `medium`.

### API or scanner

\[05\]

One scorer, two ways in — and they don't always agree on the same URL:

The APIOnto's scanner

Where`/v1/score`, `/v1/read-and-score`, the dashboardThe checker on buildonto.dev

Markdown it scoresAlways its own clean read of the pageThe page's own Markdown, if it serves one — asked for as GPTBot

SoThe three scanner-only penalties never apply; without the SDK the ceiling is 90A page with no Markdown can lose up to 60 more

Blocked by robots.txtAn error, `ROBOTS_BLOCKED` — except on your own verified siteA score of 0

**What the Serve SDK changes.** Once your site serves Onto's Markdown, the API drops the −10 payload penalty. On the scanner, a site that served no Markdown before stops losing the −25 too.

Copy as Markdown[](/concepts/aio-score.md "Open the raw Markdown")

---
## Structured Data (JSON-LD)
```json
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "Onto Docs",
  "url": "https://docs.buildonto.dev",
  "description": "How to use Onto: serve AI agents Markdown from your Next.js site, call the Read API, connect over MCP, and read the AIO score.",
  "inLanguage": "en",
  "publisher": {
    "@type": "Organization",
    "name": "Onto",
    "url": "https://buildonto.dev"
  }
}
```