---
title: "CheckWebsiteNow Agent Readability Score for one public homepage"
method: POST
path: "/api/v1/agent-check"
---

# CheckWebsiteNow Agent Readability Score for one public homepage

`POST /api/v1/agent-check`

## Request

- Base URL: `https://checkwebsitenow.com`
- URL: `https://checkwebsitenow.com/api/v1/agent-check`
- Auth: none declared

Our own transparent 0-100 score (model cwn-ars-1), not an official standard. Fixed fetch plan on the final homepage origin: homepage HTML, robots.txt, llms.txt, /.well-known/api-catalog, /.well-known/ai-catalog.json, /.well-known/mcp/server-card.json, a sitemap prefix and one Accept: text/markdown request. Shared ten-second deadline, nine requests in total, at most five redirects per resource (files after the homepage follow redirects only on the same host), 1 MiB (larger homepages are analysed from their first 1 MiB) HTML and 64 KiB per text file, identity encoding only, no JavaScript, no forms, never a call to a discovered MCP or API endpoint. Score = earned / measured weight points, rounded down; unknown checks are removed, never passed; no number below 70 measured points or without readable homepage HTML. Ten requests per minute per client, one running check per client, 60-second cache per website (cached: true). findings and summary are the deprecated schema 1.0 view, kept for one transition. Method: GET /api/v1/agent-readability-method.

## Request body

- object
  - `hostname` string, required

## Response `200`

Score and evidence. Unavailable resources are unknown checks, not proof of failure.

- AgentCheckResult
  - `schema_version` '2.0', required
  - `score_name` 'CheckWebsiteNow Agent Readability Score', required
  - `score_model` string, required
  - `official` unknown, required
  - `method_url` string, required
  - `target` string, required
  - `checked_at` string, date-time, required
  - `final_url` string, nullable, required
  - `final_origin` string, nullable, required
  - `final_url_truncated` boolean, required
  - `duration_ms` integer, required
  - `requests_used` integer, required
  - `measurement_region` string, required
  - `cached` boolean, required
  - `cached_age_seconds` integer: Only on cached results: age of the reused result. Normally below 60; up to 300 when a limit refused a fresh check and a recent result was served instead.
  - `status` 'complete' | 'partial' | 'unavailable', required
  - `score` integer, nullable, required
  - `score_available` boolean, required
  - `score_unavailable_reason` string, nullable, required
  - `band` object, required
    - `id` 'hard' | 'partly' | 'good' | 'excellent' | 'not_available', required
    - `label` string, required
    - `symbol` string, required
    - `min` integer, nullable, required
    - `max` integer, nullable, required
  - `headline` object, required: Plain answer built from the checks, not from the band: can agents read the text (A1, B1), may AI search and assistants read it (A2), and which optional helpers are missing. A low score with text_readable yes means few helpers, not unreadable content.
    - `text_readable` 'yes' | 'partly' | 'no' | 'unknown', required
    - `bots_allowed` 'yes' | 'some_blocked' | 'blocked' | 'unknown', required
    - `helpers_present` string[], required
    - `helpers_missing` string[], required
    - `text` string, required
  - `coverage` object, required
    - `measured_points` integer, required
    - `total_points` unknown, required
    - `percent` integer, required
  - `scaled` boolean, required: True when the score is scaled to fewer than 100 measured points.
  - `caps_applied` string[], required
  - `groups` object[], required
    - `id` string, required
    - `label` string, required
    - `weight` integer, required
    - `measured_points` integer, required
    - `unmeasured_points` integer: weight minus measured_points: points of this group we could not measure (shown as not measured, never as passed).
    - `points` number, required
    - `score` integer, nullable, required
  - `checks` AgentReadabilityCheck[], required
    - `id` 'A1' | 'A2' | 'A3' | 'B1' | 'B2' | 'B3' | 'B4' | 'C1' | 'C2' | 'C3' | 'C4' | 'D1' | 'D2' | 'D3', required
    - `group` 'A' | 'B' | 'C' | 'D', required
    - `label` string, required
    - `status` 'pass' | 'partial' | 'fail' | 'unknown' | 'not_applicable', required
    - `weight` integer, required
    - `points` number, nullable, required: Earned points; null when unknown or not applicable.
    - `evidence` string, required: Counts and our own wording only; never page text.
    - `fix` object, required
      - `title` string, required
      - `detail` string, required
      - `snippet` string: Copy-ready example for the checked host.
  - `deductions` object[], required
    - `id` string, required
    - `label` string, required
    - `lost_points` number, required
    - `fix_title` string, required
  - `mcp` object, required: MCP and API discovery: advertised, not tested. null means not checked.
    - `api_catalog_found` boolean, nullable
    - `ard_found` boolean, nullable: /.well-known/ard.json (Agentic Resource Discovery v0.91, a proposal) with at least one entry that has identifier, type and exactly one of url/data.
    - `ai_catalog_found` boolean, nullable: Older /.well-known/ai-catalog.json, read last with leftover request budget.
    - `server_card_found` boolean, nullable
    - `openapi_link_found` boolean
    - `api_catalog_link_found` boolean
    - `ard_link_found` boolean: Same-origin rel="ard" link in the homepage HTML or Link header.
    - `llms_mentions_api_or_mcp` boolean
    - `paths_checked` string[]
    - `endpoints_called` unknown
    - `note` string
  - `badge` object: Only when a score exists and badges are configured: a signed 'Agent-ready' badge for this result. The address carries host, score and check date with a server signature; serving it never starts a check and nothing is stored. The link starts a fresh check (utm_source=badge).
    - `svg` string, uri
    - `link` string, uri
    - `html` string
    - `markdown` string
    - `checked_on` string, date
    - `score` integer
  - `homepage_links` object[]: Up to 8 main pages suggested from links on the final homepage that are not hidden by markup (CSS-class hiding is not detected): same host, navigation first, no login, cart, legal or file links, paths percent-encoded. Titles are the site's own link text, shortened. Read from the homepage the check already fetched: no extra request.
    - `title` string, required
    - `path` string, required
  - `lighthouse_rules` object: Rules from the Lighthouse 13.5.0 audits llms-txt, webmcp-schema-validity, webmcp-form-coverage and ard-schema (ard-schema as a minimal check), re-applied statically to the files this check read. Not a Lighthouse run; never changes the score.
    - `version` string, required
    - `lighthouse_run` unknown, required
    - `note` string, required
    - `audits` object[], required
      - `id` 'llms-txt' | 'webmcp-schema-validity' | 'webmcp-form-coverage' | 'ard-schema', required
      - `title` string, required
      - `status` 'pass' | 'warning' | 'fail' | 'informative' | 'not_applicable' | 'unknown', required
      - `score` number, nullable, required
      - `issues` string[], required
      - `rule` string, required
      - `source_url` string, uri, required
      - `forms` integer, nullable
      - `uncovered_forms` integer, nullable
  - `webmcp` object, required: Static WebMCP declarations: declared, not verified in a browser.
    - `declarative_forms` integer, nullable
    - `complete_declarative_forms` integer, nullable
    - `inline_script_hint` boolean, nullable
    - `runtime_verified` unknown
    - `note` string
  - `training_policy` object, required: Training opt-outs never lower the score.
    - `training_blocked` string[], nullable
    - `tokens_checked` string[]
    - `note` string
  - `disclaimer` string, required
  - `summary` object, required: Schema 1.0 counts of findings.
  - `findings` object[], required: Schema 1.0 observations (document, structure, robots, llms, metadata, webmcp).
  - `limitations` string[], required
  - `homepage_truncated` boolean: True when the homepage was larger than 1 MiB and only its first 1 MiB was analysed.
  - `homepage_note` string, nullable: Plain-language note when homepage_truncated is true, otherwise null.
  - `block_page_signals` object[]: Country-block and bot-challenge wording found in the homepage body (input for the geoblock assessment).
    - `id` 'cloudflare_1009' | 'cloudfront_geo' | 'sucuri_country' | 'region_text' | 'cloudflare_challenge' | 'akamai_access_denied', required
    - `label` string, required
    - `confidence` 'high' | 'medium' | 'low' | 'none', required
    - `evidence` string, required
  - `homepage_http_status` integer, nullable: HTTP status our GET received for the final homepage (null when it was not read). Compare it with http_status of POST /api/v1/check: when one request was refused (401/403/429) and the other allowed, bot protection treated the two requests differently.

## Other responses

- `400`: Request or measurement service error; never a target outage verdict.
- `403`: Request or measurement service error; never a target outage verdict.
- `408`: Request or measurement service error; never a target outage verdict.
- `413`: Request or measurement service error; never a target outage verdict.
- `415`: Request or measurement service error; never a target outage verdict.
- `429`: Our limit or a request problem; never a verdict about the website. Codes: RATE_LIMITED (10 per minute per client; IPv6 counted per /64), PROBE_BUSY_CLIENT (your previous check is still running), PROBE_BUSY (all four slots busy, or a check of this website is running and enough requests already wait for it; Retry-After 10), TARGET_BUSY (this website was checked very often in the last minute); RATE_LIMITED also when your client or network used its fair share of fresh checks (12 per minute per client). Retry after the Retry-After seconds.
- `500`: Request or measurement service error; never a target outage verdict.
- `503`: PROBE_BUSY: our global budget of fresh checks for this minute is used up. Not a verdict about the website. Retry after the Retry-After seconds.

---

[API](https://skmtc.dev/checkwebsitenow/apis/checkwebsitenow-website-checker.md) · [All operations](https://skmtc.dev/checkwebsitenow/apis/checkwebsitenow-website-checker/llms.txt) · [OpenAPI document](https://skmtc.dev/checkwebsitenow/apis/checkwebsitenow-website-checker/revisions/ef066e74da4b?raw)
