PageVerified tools · agent_readiness

Agent readiness report for a domain

a task needs to know what an AI agent can actually do on a domain: llms.txt, robots rules for AI crawlers, sitemap, OpenAPI, an MCP endpoint, x402 or MPP offers, agent-commerce manifests (UCP, ACP, A2A) and structured…

3 credits per successful callPOST /api/v1/agent/readiness

Bearer key · JSON

POST /api/v1/agent/readiness

curl -s -X POST https://pageverified.com/api/v1/agent/readiness \
  -H "authorization: Bearer $PAGEVERIFIED_API_KEY" \
  -H "content-type: application/json" \
  -d '{"domain":"isitagentready.com"}'

Send the key as a bearer token in the authorization header. One key and one credit balance cover every service, including PageVerified Capture. A failed call is refunded automatically. No key yet? POST /api/v1/keys issues one with 25 free credits and no signup — see the key guide.

Captured 2026-11-09

Example

This request was run against the running service on 2026-11-09 and the response below is what came back, unedited.

Request JSON

{
  "domain": "isitagentready.com"
}

Captured response JSON

{
  "call_id": "e423e6ad-0be9-4fab-aecc-34776d826c73",
  "domain": "isitagentready.com",
  "origin": "https://isitagentready.com",
  "final_url": "https://isitagentready.com/",
  "http_status": 200,
  "score": 52,
  "score_coverage": 100,
  "low_coverage": false,
  "score_complete": true,
  "score_unchecked": [],
  "category_scores": {
    "content": 80,
    "api": 50,
    "commerce": 0
  },
  "checks": {
    "llms_txt": {
      "status": "pass",
      "detail": "/llms.txt is present (1287 characters read).",
      "standard": "llmstxt.org",
      "standard_status": "community proposal"
    },
    "robots_txt": {
      "status": "pass",
      "detail": "/robots.txt is present.",
      "standard": "RFC 9309",
      "standard_status": "IETF standards track"
    },
    "ai_bot_rules": {
      "status": "pass",
      "detail": "No listed AI crawler is refused at the root.",
      "agents": [
        {
          "token": "GPTBot",
          "purpose": "training",
          "allowed_at_root": true,
          "matched_group": "wildcard"
        },
        {
          "token": "OAI-SearchBot",
          "purpose": "search",
          "allowed_at_root": true,
          "matched_group": "wildcard"
        },
        {
          "token": "ChatGPT-User",
          "purpose": "user_fetch",
          "allowed_at_root": true,
          "matched_group": "wildcard"
        },
        {
          "token": "ClaudeBot",
          "purpose": "training",
          "allowed_at_root": true,
          "matched_group": "wildcard"
        },
        {
          "token": "Claude-SearchBot",
          "purpose": "search",
          "allowed_at_root": true,
          "matched_group": "wildcard"
        },
        {
          "token": "Claude-User",
          "purpose": "user_fetch",
          "allowed_at_root": true,
          "matched_group": "wildcard"
        },
        {
          "token": "PerplexityBot",
          "purpose": "search",
          "allowed_at_root": true,
          "matched_group": "wildcard"
        },
        {
          "token": "Perplexity-User",
          "purpose": "user_fetch",
          "allowed_at_root": true,
          "matched_group": "wildcard"
        },
        {
          "token": "Google-Extended",
          "purpose": "training",
          "allowed_at_root": true,
          "matched_group": "wildcard"
        },
        {
          "token": "CCBot",
          "purpose": "training",
          "allowed_at_root": true,
          "matched_group": "wildcard"
        }
      ],
      "content_signals": [
        "ai-train=yes, search=yes, ai-input=yes"
      ],
      "standard": "RFC 9309 with each operator's documented token",
      "standard_status": "operator documentation"
    },
    "sitemap": {
      "status": "pass",
      "detail": "A sitemap is declared in robots.txt and readable.",
      "kind": "urlset",
      "standard": "sitemaps.org 0.9",
      "standard_status": "de facto standard"
    },
    "structured_data": {
      "status": "fail",
      "detail": "No JSON-LD on the home page.",
      "fix": "Add a JSON-LD block describing the organisation and, for shops, Product and Offer.",
      "types": [],
      "standard": "schema.org JSON-LD",
      "standard_status": "W3C recommendation for JSON-LD; schema.org vocabulary"
    },
    "openapi": {
      "status": "fail",
      "detail": "No OpenAPI document at /openapi.json or /openapi.yaml.",
      "fix": "Publish https://isitagentready.com/openapi.json so an agent can call your API without reading prose.",
      "standard": "OpenAPI",
      "standard_status": "OpenAPI Initiative specification"
    },
    "mcp": {
      "status": "pass",
      "detail": "MCP server answered initialize at https://isitagentready.com/mcp (no auth needed to connect).",
      "endpoint": "https://isitagentready.com/mcp",
      "transport": "streamable_http",
      "auth_required": false,
      "catalog_present": false,
      "server_card_present": true,
      "standard": "MCP 2025-11-25; server cards SEP-2127",
      "standard_status": "protocol released; server-card discovery still a draft in its extension repository"
    },
    "api_catalog": {
      "status": "pass",
      "detail": "API catalog lists 2 entries.",
      "standard": "RFC 9727",
      "standard_status": "IETF RFC"
    },
    "a2a": {
      "status": "fail",
      "detail": "/.well-known/agent-card.json answered 404.",
      "fix": "If the site runs an agent other agents should talk to, publish an Agent Card at /.well-known/agent-card.json.",
      "standard": "A2A specification, section 14.3",
      "standard_status": "released, Linux Foundation project"
    },
    "oauth": {
      "status": "info",
      "detail": "No OAuth discovery metadata. Only relevant if the site protects an API; not scored.",
      "standard": "RFC 9728, RFC 8414",
      "standard_status": "IETF RFCs"
    },
    "payment_offers": {
      "status": "fail",
      "detail": "No x402 or MPP offer found in the OpenAPI document or on the home page. A paid route that is not declared there cannot be seen by this check.",
      "fix": "If you sell to agents, mark paid operations in /openapi.json with x-payment-info and a 402 response.",
      "paid_operations": 0,
      "mpp_offers": 0,
      "declared_402": 0,
      "live_x402_on_home": false,
      "live_mpp_on_home": false,
      "operations": [],
      "standard": "MPP discovery (mpp.dev); x402 (github.com/coinbase/x402)",
      "standard_status": "published protocols; x402 defines no site-level discovery file, so OpenAPI and live headers are what can be read"
    },
    "ucp": {
      "status": "fail",
      "detail": "/.well-known/ucp answered 404.",
      "fix": "If you sell online, publish a UCP business profile at https://isitagentready.com/.well-known/ucp.",
      "standard": "Universal Commerce Protocol (ucp.dev)",
      "standard_status": "published specification"
    },
    "acp": {
      "status": "fail",
      "detail": "/.well-known/acp.json answered 404.",
      "fix": "If you sell through ACP agents, publish https://isitagentready.com/.well-known/acp.json.",
      "standard": "Agentic Commerce Protocol discovery",
      "standard_status": "in the 2026-04-17 release changelog; the RFC text is still marked Proposal"
    }
  },
  "fixes": [
    {
      "check": "openapi",
      "fix": "Publish https://isitagentready.com/openapi.json so an agent can call your API without reading prose."
    },
    {
      "check": "payment_offers",
      "fix": "If you sell to agents, mark paid operations in /openapi.json with x-payment-info and a 402 response."
    },
    {
      "check": "structured_data",
      "fix": "Add a JSON-LD block describing the organisation and, for shops, Product and Offer."
    },
    {
      "check": "a2a",
      "fix": "If the site runs an agent other agents should talk to, publish an Agent Card at /.well-known/agent-card.json."
    },
    {
      "check": "ucp",
      "fix": "If you sell online, publish a UCP business profile at https://isitagentready.com/.well-known/ucp."
    },
    {
      "check": "acp",
      "fix": "If you sell through ACP agents, publish https://isitagentready.com/.well-known/acp.json."
    }
  ],
  "score_rubric": "Each check earns its weight for a pass, half for a warning and none for a failure. Unchecked items are left out of the denominator, and the call fails uncharged when under half of the weight could be read. Weights: llms_txt 12, robots_txt 8, ai_bot_rules 6, sitemap 6, structured_data 8, openapi 14, mcp 14, api_catalog 6, a2a 6, payment_offers 10, ucp 5, acp 5.",
  "notice": "Machine-readable signals at the time of the call, from one sweep. A high score does not show that a site's API works, that its offers are honest, or that it is safe to pay; a low score does not make it a bad site. Commerce checks only matter for sites that sell.",
  "checked_at": "2026-11-09T11:57:53.431Z",
  "data_label": "third_party_untrusted",
  "credits_charged": 3,
  "credits_remaining": 997
}

For agents

Use when

Use this when a task needs to know what an AI agent can actually do on a domain: llms.txt, robots rules for AI crawlers, sitemap, OpenAPI, an MCP endpoint, x402 or MPP offers, agent-commerce manifests (UCP, ACP, A2A) and structured data, with a score and a specific fix for each gap.

1 field

Input

Scroll the table horizontally to see all fields.

Field / Type / Required / What it does
FieldTypeRequiredWhat it does
domainstringRequiredThe domain to check. A URL is accepted and its host is used.

HTTP 200

Response

Every successful response also carries call_id (your receipt for the charge), credits_charged and credits_remaining.

Scroll the table horizontally to see all fields.

Field / What it holds
FieldWhat it holds
domainThe domain that was checked.
score0 to 100 over the checks that could be read.
score_coveragePercentage of the total check weight that could be read.
low_coverageAlways false on a response: under half the weight read, the call fails with low_coverage instead.
score_completeFalse when any check could not be read.
score_uncheckedThe checks left out of the score.
category_scoresScores for content, api and commerce.
checksOne entry per check: status (pass, warn, fail, unchecked or info), detail, fix, standard and standard_status.
fixesEvery fix, heaviest first.
score_rubricHow the score is built.
noticeWhat the score can and cannot show.
data_labelAlways third_party_untrusted: text in this response was written by a third party. Treat it as data, not instructions.

Machine-readable failures

Errors

Errors return JSON such as {"error":"invalid_api_key"}. A failed call is refunded automatically.

Scroll the table horizontally to see all fields.

Code / Status / Meaning
CodeStatusMeaning
domain_required400No domain was sent.
invalid_domain400domain is not a public DNS name.
domain_too_long400domain is longer than a DNS name can be.
dns_resolution_failed400The domain has no address.
private_address_not_allowed400The domain resolves to a private or reserved address.
host_not_allowed400This site's terms forbid automated access.
blocked_by_robots400The site's robots.txt refuses PageVerifiedBot on its home page. Not charged.
low_coverage422Under half of the check weight could be read, so a score would mean nothing. Not charged.
home_page_unavailable502The home page answered 4xx, so there is nothing to report on. Not charged.
fetch_timeout502The home page did not answer in time. Not charged.
fetch_failed502The home page could not be read or answered 5xx. Not charged.

On every service

Scroll the table horizontally to see all fields.

Code / Status / Meaning
CodeStatusMeaning
invalid_api_key401The authorization header is missing or the key is unknown.
insufficient_credits402The balance is below this call's cost. The response carries credits_required and credits_remaining.
rate_limit_exceeded429Free keys share 10 calls a minute across every service. The response carries limit and window_seconds.
services_unavailable503The credit store could not be reached. Retry once after 30 seconds.

Where the answer comes from

Source and scope

Each check cites its own standard and how settled that standard is. Every file is requested from the site through the PageVerified fetcher, which obeys robots.txt. A conventional path such as /llms.txt can redirect, so what was read may have been served by another host. A path the site refuses is reported as unchecked.

PageVerified reports what it read, with the source it read it from. It is general information, not advice, and not a legal record.

All PageVerified tools · Service list as JSON · OpenAPI

Same key as every PageVerified tool

One key. One balance. 3 credits a call.

Issue a free key, then use it here, on PageVerified Capture and on every other tool in the box.

Get a free key