{
  "version": "0.1.0",
  "rubricVersion": "0.7",
  "target": "https://developers.cloudflare.com",
  "host": "developers.cloudflare.com",
  "https": true,
  "scannedAt": "2026-10-12T23:02:48.319Z",
  "durationMs": 1062,
  "requests": 131,
  "score": 44.8,
  "grade": "BB",
  "gradeLabel": "thin",
  "previous": {
    "score": 44.8,
    "grade": "BB",
    "level": 1,
    "fingerprint": "0787874d5c8add78c55cedb842fb2b315a02b08b9f60f43acba2c150fbcb5c2c",
    "scannedAt": "2026-10-12T22:56:27.223Z",
    "counts": {
      "pass": 16,
      "warn": 15,
      "fail": 22,
      "na": 8,
      "total": 61
    },
    "rubricVersion": "0.7"
  },
  "level": 1,
  "levelName": "Basic Web Presence",
  "levelBlurb": "The site is reachable, but there are no agent-specific signals.",
  "verdict": "Basic Web Presence",
  "tiers": {
    "essential": {
      "score": 37.256888888888895,
      "pool": 80,
      "counted": 16,
      "total": 16
    },
    "recommended": {
      "score": 7.68898656898657,
      "pool": 20,
      "counted": 22,
      "total": 28
    },
    "emerging": {
      "score": 2.043333333333334,
      "pool": 5,
      "counted": 15,
      "total": 17
    }
  },
  "confidence": 99,
  "confidenceLabel": "high",
  "fingerprint": "0787874d5c8add78c55cedb842fb2b315a02b08b9f60f43acba2c150fbcb5c2c",
  "isCommerce": true,
  "commerceSignals": [
    "commerce path (/products)"
  ],
  "blocked": null,
  "blockedNote": null,
  "deadline": {
    "ms": 60000,
    "reached": false
  },
  "profile": {
    "id": "api",
    "identified": true,
    "declared": false,
    "ambiguous": [],
    "evidence": [
      "API / developer platform (score 7), matched: An OpenAPI document responds; A documentation path responds; API reference copy."
    ],
    "scores": [
      {
        "id": "api",
        "score": 7,
        "signals": [
          "An OpenAPI document responds",
          "A documentation path responds",
          "API reference copy"
        ]
      },
      {
        "id": "saas",
        "score": 2,
        "signals": [
          "A documentation path responds"
        ]
      },
      {
        "id": "ecommerce",
        "score": 1,
        "signals": [
          "A product listing path responds"
        ]
      }
    ]
  },
  "categories": [
    {
      "id": "protocol",
      "label": "Protocol Discovery",
      "weight": 0.25,
      "score": 42.6,
      "counted": true,
      "pass": 4,
      "warn": 7,
      "fail": 5,
      "na": 1,
      "total": 17
    },
    {
      "id": "content",
      "label": "Content Accessibility",
      "weight": 0.22,
      "score": 68.2,
      "counted": true,
      "pass": 7,
      "warn": 1,
      "fail": 4,
      "na": 3,
      "total": 15
    },
    {
      "id": "discoverability",
      "label": "Discoverability",
      "weight": 0.2,
      "score": 65.9,
      "counted": true,
      "pass": 5,
      "warn": 3,
      "fail": 3,
      "na": 0,
      "total": 11
    },
    {
      "id": "botaccess",
      "label": "Bot Access Control",
      "weight": 0.18,
      "score": 15,
      "counted": true,
      "pass": 0,
      "warn": 3,
      "fail": 5,
      "na": 0,
      "total": 8
    },
    {
      "id": "commerce",
      "label": "Commerce Protocols",
      "weight": 0.15,
      "score": 4.2,
      "counted": true,
      "pass": 0,
      "warn": 1,
      "fail": 5,
      "na": 4,
      "total": 10
    }
  ],
  "checks": [
    {
      "id": "reachable",
      "category": "discoverability",
      "tier": "essential",
      "weight": 3,
      "impact": "critical",
      "conditional": false,
      "label": "Homepage open to agent access",
      "why": "If an agent cannot read your site, every other check is moot. Cloudflare began blocking AI crawlers by default in 2025, with signed agents routed separately.",
      "skill": "agent-access",
      "standards": [],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "HTTP 200 text/html with 219652 bytes and 1341 words of visible text.",
      "evidence": "HTTP 200 · text/html · 219652 bytes · 23 ms",
      "fix": null
    },
    {
      "id": "robots-txt",
      "category": "discoverability",
      "tier": "essential",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "robots.txt with agent directives",
      "why": "The front door for agent traffic (RFC 9309).",
      "skill": "robots-txt",
      "standards": [
        "RFC 9309"
      ],
      "status": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "Only a blanket User-agent: * group is present (5 rules), with a Sitemap declared.",
      "evidence": "HTTP 200 · text/plain · 1442 bytes · 21 ms · # As a condition of accessing this website, you agree to # abide by the following content signals: # (a) If a content-signal = yes, you may…",
      "fix": "# https://example.com/robots.txt  (RFC 9309)\nUser-agent: *\nAllow: /\nDisallow: /admin/\n\nUser-agent: GPTBot\nAllow: /\n\nUser-agent: ClaudeBot\nAllow: /\n\nSitemap: https://example.com/sitemap.xml"
    },
    {
      "id": "sitemap-xml",
      "category": "discoverability",
      "tier": "essential",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "sitemap.xml valid and current",
      "why": "The primary URL discovery source for agent crawlers.",
      "skill": "sitemap",
      "standards": [],
      "status": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "sitemapindex with 1 child sitemap but none carrying <lastmod>.",
      "evidence": "HTTP 200 · application/xml · 196 bytes · 25 ms · final https://developers.cloudflare.com/sitemap-index.xml",
      "fix": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n  <url>\n    <loc>https://example.com/</loc>\n    <lastmod>2026-01-15</lastmod>\n  </url>\n  <url>\n    <loc>https://example.com/docs/quickstart</loc>\n    <lastmod>2026-01-15</lastmod>\n  </url>\n</urlset>"
    },
    {
      "id": "llms-txt",
      "category": "discoverability",
      "tier": "essential",
      "weight": 3,
      "impact": "critical",
      "conditional": false,
      "label": "/llms.txt published and well-structured",
      "why": "The most widely adopted contract for making a site legible to agents. In the curated corpus we measured, 46% of sites published one and the average quality score was 37 out of 100 — adoption is not the same as usefulness.",
      "skill": "llms-txt",
      "standards": [
        "llmstxt.org"
      ],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "H1 \"Cloudflare Developer Documentation\", blockquote summary, 9 H2 sections with 113 markdown links, 16925 bytes. The scan requested 6 links it names, and each answered 2xx. Not requested: 107 same-origin links (the scan samples up to 6).",
      "evidence": "HTTP 200 · text/plain; charset=utf-8 · 16925 bytes · 22 ms · headings: Cloudflare Developer Documentation | Application performance | Application security | Cloudflare One | Consumer service…",
      "fix": null
    },
    {
      "id": "link-headers",
      "category": "discoverability",
      "tier": "emerging",
      "weight": 2,
      "impact": "medium",
      "conditional": false,
      "label": "Discovery via Link response headers",
      "why": "RFC 8288 Link headers let an agent find your discovery resources without parsing HTML.",
      "skill": "link-headers",
      "standards": [
        "RFC 8288"
      ],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "4 Link entrys, 3 carrying a discovery relation (rel=service-doc → /api/).",
      "evidence": "link: </api/>; rel=\"service-doc\", <https://developers.cloudflare.com/.well-known/ard.json>; rel=\"ard\", <https://developers.cloudflare.com/llms.txt>; rel=\"describedby\"; type=\"text/plain\", <https://developers.cloudflare.com/index.md>; rel=\"alternate\"; type=\"text/markdown\"",
      "fix": null
    },
    {
      "id": "dns-aid",
      "category": "discoverability",
      "tier": "emerging",
      "weight": 2,
      "impact": "medium",
      "conditional": false,
      "label": "DNS-AID discovery record",
      "why": "Lets agents read discovery information over DNS without an HTTP round trip. Cloudflare added it to its readiness checklist.",
      "skill": "dns-aid",
      "standards": [],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "0 SVCB records and 0 TXT records resolve at _index._agents.developers.cloudflare.com and _agent.developers.cloudflare.com.",
      "evidence": "DNS-AID names queried for SVCB and TXT records: _index._agents.developers.cloudflare.com and _agent.developers.cloudflare.com",
      "fix": "; DNS-AID (draft-mozleywilliams-dnsop-dnsaid)\n_index._agents.example.com. 3600 IN SVCB 1 agent-index.example.com (\n    alpn=\"h2\"\n    port=443\n    well-known=agent-card.json\n)\n\nassistant.example.com. 3600 IN SVCB 1 . (\n    alpn=\"mcp,h2\"\n    port=443\n    well-known=agent-card.json\n    cap=https://example.com/.well-known/agent-card.json\n)"
    },
    {
      "id": "canonical",
      "category": "discoverability",
      "tier": "recommended",
      "weight": 2,
      "impact": "medium",
      "conditional": false,
      "label": "Canonical and hreflang discipline",
      "why": "An agent needs one consistent URL per important page.",
      "skill": "canonical",
      "standards": [],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "1 canonical, absolute and self-referential on https, no hreflang alternates declared.",
      "evidence": "<link rel=\"canonical\" href=\"https://developers.cloudflare.com/\">",
      "fix": null
    },
    {
      "id": "llms-full",
      "category": "discoverability",
      "tier": "recommended",
      "weight": 1,
      "impact": "low",
      "conditional": false,
      "label": "/llms-full.txt expanded context",
      "why": "Lets an agent take in the full context in a single request instead of walking the site step by step.",
      "skill": "llms-full-txt",
      "standards": [],
      "status": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "259190 words of expanded page text in 3149824 bytes, but /llms.txt does not link to /llms-full.txt.",
      "evidence": "HTTP 200 · text/markdown; charset=utf-8 · 3149824 bytes · 51 ms · --- description: Route traffic across the fastest network paths to reduce latency and packet loss. title: Argo Smart Ro…",
      "fix": "# In /llms.txt, under Docs:\n- [Full context](https://example.com/llms-full.txt): Every key page as one document\n\n# /llms-full.txt\n# Example Inc - full context\n\n> Complete text of the pages an agent needs, in a single request. Regenerated on deploy.\n\n## https://example.com/ (Home)\n\nExample Inc runs a payments API for marketplaces. Production traffic is served from three regions.\n\n## https://example.com/pricing (Pricing)\n\nStarter is $0 for 1,000 calls per month. Growth is $99 for 100,000 calls."
    },
    {
      "id": "agents-md",
      "category": "discoverability",
      "tier": "recommended",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "AGENTS.md with the required sections",
      "why": "The instruction file for coding and operations agents. It fails more often than any other check in the curated corpus we measured, and the usual reason is not a missing file but a file without the sections an agent needs.",
      "skill": "agents-md",
      "standards": [],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "Not found (HTTP 404, 307 bytes).",
      "evidence": "HTTP 404 · text/markdown; charset=utf-8 · 307 bytes · 4 ms",
      "fix": "# AGENTS.md\n\n## Project overview\nExample Inc is a payments API for marketplaces. Docs: https://example.com/docs\n\n## Setup and build\n- `pnpm install`\n- `pnpm dev` -> http://localhost:3000\n- `pnpm build`\n\n## Testing\n- `pnpm test`; lint and types: `pnpm lint && pnpm typecheck`\n\n## Conventions\n- TypeScript strict mode; no `any` in exported signatures.\n- Public API routes live in `src/routes/api/`.\n\n## Security and contact\n- Never commit secrets; use `.env.local`.\n- Report vulnerabilities to security@example.com."
    },
    {
      "id": "sitemap-md",
      "category": "discoverability",
      "tier": "emerging",
      "weight": 1,
      "impact": "low",
      "conditional": false,
      "label": "/sitemap.md markdown site map",
      "why": "Lets an agent read your site structure as markdown in a single file. Adoption is still very low, so this is an early-mover advantage.",
      "skill": "sitemap-md",
      "standards": [],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "Not found (HTTP 404, 307 bytes).",
      "evidence": "HTTP 404 · text/markdown; charset=utf-8 · 307 bytes · 3 ms",
      "fix": "# Sitemap\n\n- [Home](https://example.com/): What Example Inc does and who it is for\n- [Quickstart](https://example.com/docs/quickstart): First API call in five minutes\n- [API reference](https://example.com/docs/api): Every endpoint and response field\n- [Pricing](https://example.com/pricing): Plans, limits and overage rates\n- [Status](https://example.com/status): Live service status and incident history\n- [Contact](https://example.com/contact): Sales and support routes"
    },
    {
      "id": "markdown-negotiation",
      "category": "content",
      "tier": "recommended",
      "weight": 3,
      "impact": "critical",
      "conditional": false,
      "label": "Markdown content negotiation",
      "why": "Agents can request a markup-free version with \"Accept: text/markdown\", which cuts token cost.",
      "skill": "markdown-negotiation",
      "standards": [
        "RFC 9110"
      ],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "Content-Type text/markdown with Vary: accept-encoding, accept on the negotiated response (HTTP 200).",
      "evidence": "status: 200; content-type: text/markdown; charset=utf-8; vary: accept-encoding, accept; markdown body: yes",
      "fix": null
    },
    {
      "id": "headings",
      "category": "content",
      "tier": "essential",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "Semantic heading structure",
      "why": "A single H1 and a consistent H2 structure let the content be split correctly.",
      "skill": "semantic-headings",
      "standards": [
        "WCAG 2.2"
      ],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "1 H1 with 7 H2s and 24 H3s, and no level in the outline is skipped.",
      "evidence": "outline: H1 H2 H2 H3 H3 H3 H3 H2 H3 H2 H3 H3 H3 H3 H3 H3 H3 H3 H2 H3 H4 H4 H4 H3 H4 H4 H4 H2 H3 H3 H3 H3 H3 H3 H2 H3 H3 H3",
      "fix": null
    },
    {
      "id": "meta",
      "category": "content",
      "tier": "essential",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "Title and summary metadata",
      "why": "This is how an agent learns what a page is about without opening it.",
      "skill": "page-metadata",
      "standards": [],
      "status": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "Both carriers are present but outside the band: title 43 characters (band 50-60) and description 39 characters (band 120-160).",
      "evidence": "title(43): Cloudflare Developer Docs | Cloudflare Docs | description(39): Connect, protect, and build everywhere.",
      "fix": "<head>\n  <meta charset=\"utf-8\" />\n  <title>Agent readiness audit for e-commerce teams | Acme Inc</title>\n  <meta\n    name=\"description\"\n    content=\"Acme audits how well your store serves AI agents: 52 checks across discovery, content, bot access and commerce, each paired with a paste-ready fix.\"\n  />\n</head>"
    },
    {
      "id": "jsonld",
      "category": "content",
      "tier": "essential",
      "weight": 3,
      "impact": "critical",
      "conditional": false,
      "label": "JSON-LD structured data",
      "why": "The entity type becomes unambiguous to a machine. Without authoritative data, an agent answers from whatever it can scrape.",
      "skill": "structured-data",
      "standards": [
        "schema.org"
      ],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "1 JSON-LD block parsed with a schema.org @context declaring WebPage (6 @types in total).",
      "evidence": "blocks: 1 total, 1 non-empty, 1 parsed; schema.org @context: yes; @types: WebPage, Organization, ImageObject, PostalAddress, ContactPoint, WebSite",
      "fix": null
    },
    {
      "id": "faq-schema",
      "category": "content",
      "tier": "recommended",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "FAQ / question-answer schema",
      "why": "Question-and-answer content is the type agents quote most.",
      "skill": "faq-schema",
      "standards": [
        "schema.org/FAQPage"
      ],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "No FAQPage entity among 1 parsed JSON-LD block on the homepage.",
      "evidence": "@types: WebPage, Organization, ImageObject, PostalAddress, ContactPoint, WebSite",
      "fix": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What does an agent readiness audit measure?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Fifty-two checks across discovery, content, bot access, protocol and commerce, each scored and paired with a fix.\"\n      }\n    }\n  ]\n}\n</script>"
    },
    {
      "id": "breadcrumb",
      "category": "content",
      "tier": "emerging",
      "weight": 1,
      "impact": "low",
      "conditional": false,
      "label": "Breadcrumb / navigation schema",
      "why": "Helps an agent make sense of where a page sits in your site.",
      "skill": "breadcrumb-schema",
      "standards": [
        "schema.org/BreadcrumbList"
      ],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "No BreadcrumbList entity among 1 parsed JSON-LD block on the homepage.",
      "evidence": "@types: WebPage, Organization, ImageObject, PostalAddress, ContactPoint, WebSite",
      "fix": "<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"BreadcrumbList\",\n  \"itemListElement\": [\n    { \"@type\": \"ListItem\", \"position\": 1, \"name\": \"Home\", \"item\": \"https://www.example.com/\" },\n    { \"@type\": \"ListItem\", \"position\": 2, \"name\": \"Checks\", \"item\": \"https://www.example.com/checks\" },\n    { \"@type\": \"ListItem\", \"position\": 3, \"name\": \"Structured data\", \"item\": \"https://www.example.com/checks/jsonld\" }\n  ]\n}\n</script>"
    },
    {
      "id": "summary",
      "category": "content",
      "tier": "recommended",
      "weight": 1,
      "impact": "medium",
      "conditional": false,
      "label": "Prominent summary block",
      "why": "The llms.txt contract recommends a short summary at the top of every page; agents quote it directly.",
      "skill": "page-summary",
      "standards": [],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "The first 1000 characters of main content hold no paragraph or summary block (6183 characters of main text).",
      "evidence": "Cloudflare Developer Docs Explore guides and tutorials to start building on Cloudflare's platform Get started Copy prompt Prompt copied! Meet the Agentic Internet Builders IRL Connect brings the Cloud",
      "fix": "<main>\n  <h1>Token efficiency for agent-readable pages</h1>\n  <p class=\"summary\">\n    Content-to-markup ratio is the share of a page's bytes an agent can read: below 15% most of the\n    HTML is scaffolding, and every wrapper div is billed to someone's context window.\n  </p>\n  <h2>How the ratio is measured</h2>\n  <p>Script, style and template blocks are removed, the remaining tags are stripped, and the visible\n  characters are divided by the raw HTML size.</p>\n</main>"
    },
    {
      "id": "lang",
      "category": "content",
      "tier": "recommended",
      "weight": 1,
      "impact": "medium",
      "conditional": false,
      "label": "Language declaration and multilingual access",
      "why": "A wrong language tag makes an agent misread the content.",
      "skill": "language-declaration",
      "standards": [],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "html lang=\"en\" with 0 hreflang alternates to check.",
      "evidence": "html lang=\"en\"; alternates: none; content-language: (none)",
      "fix": null
    },
    {
      "id": "no-js-fallback",
      "category": "content",
      "tier": "essential",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "Content that needs no JavaScript",
      "why": "If content is only produced client-side, the page is empty for agents that do not run JavaScript.",
      "skill": "server-rendering",
      "standards": [],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "9703 characters of static text and 1 H1 is in the HTML before any JavaScript runs.",
      "evidence": "static characters: 9703; H1 in static HTML: 1; characters inside noscript: 0; markup characters: 219627",
      "fix": null
    },
    {
      "id": "spa-fallback",
      "category": "content",
      "tier": "emerging",
      "weight": 2,
      "impact": "medium",
      "conditional": false,
      "label": "Per-page content separation (no SPA fallback)",
      "why": "A catch-all route returning the same skeleton for every URL makes pages indistinguishable to an agent.",
      "skill": "server-rendering",
      "standards": [],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "Homepage and /docs ship different titles (\"Cloudflare Developer Docs | Cloudflare …\" vs \"Docs directory | Cloudflare Docs\") and different main text (20% word overlap).",
      "evidence": "compared / vs /docs; titles \"Cloudflare Developer Docs | Cloudflare Docs\" / \"Docs directory | Cloudflare Docs\"; skeleton 25%; main-text word overlap 20%; main text 12155 characters",
      "fix": null
    },
    {
      "id": "token-efficiency",
      "category": "content",
      "tier": "recommended",
      "weight": 2,
      "impact": "medium",
      "conditional": false,
      "label": "Token efficiency (content-to-markup ratio)",
      "why": "A bloated DOM wastes an agent's context window.",
      "skill": "token-efficiency",
      "standards": [],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "Content-to-markup ratio 4.4% (9703 visible of 219627 markup characters, ~1810 tokens), below the 8% floor where markup outweighs the content.",
      "evidence": "visible characters: 9703; markup characters: 219627; words: 1341; estimated tokens: 1810",
      "fix": "// scripts/tighten-html.mjs - run after the build over every emitted page.\nimport { readdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { minify } from 'html-minifier-terser';\n\nconst pages = readdirSync('dist', { recursive: true, encoding: 'utf8' }).filter((p) => p.endsWith('.html'));\n\nfor (const page of pages) {\n  const file = `dist/${page}`;\n  const before = readFileSync(file, 'utf8');\n  const after = await minify(before, {\n    collapseWhitespace: true,\n    removeComments: true,\n    removeRedundantAttributes: true,\n    minifyCSS: true,\n    minifyJS: true,\n  });\n  writeFileSync(file, after);\n}"
    },
    {
      "id": "viewport",
      "category": "content",
      "tier": "emerging",
      "weight": 1,
      "impact": "low",
      "conditional": false,
      "label": "Responsive markup",
      "why": "Agent browsers mostly run at mobile scale.",
      "skill": "responsive-markup",
      "standards": [],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "viewport content \"width=device-width, initial-scale=1\" sets width=device-width and leaves zoom unrestricted.",
      "evidence": "viewport meta: width=device-width, initial-scale=1; media queries on the page: 0",
      "fix": null
    },
    {
      "id": "webbotauth",
      "category": "botaccess",
      "tier": "essential",
      "weight": 3,
      "impact": "critical",
      "conditional": false,
      "label": "Web Bot Auth key directory",
      "why": "RFC 9421 with Ed25519: the mechanism that lets a site verify which agent is calling rather than guessing from a user-agent string. Adoption in the curated corpus we measured is around one site in a hundred.",
      "skill": "web-bot-auth",
      "standards": [
        "RFC 9421"
      ],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "/.well-known/http-message-signatures-directory answered HTTP 404, not a JWK Set.",
      "evidence": "# 404 Page not found The page you requested does not exist or has moved. Browse the documentation via [llms.txt](/llms.txt). Search the documentation via the [AI Search API](https://ai-search.developers.cloudflare.com/a…",
      "fix": null
    },
    {
      "id": "agent-permissions",
      "category": "botaccess",
      "tier": "essential",
      "weight": 3,
      "impact": "critical",
      "conditional": false,
      "label": "Agent permission model (agent-permissions.json)",
      "why": "Declares which actions an agent may take, which are refused, and which need a person. It is the difference between a policy and a wish: in the curated corpus we measured, roughly one site in a hundred publishes one.",
      "skill": "agent-permissions",
      "standards": [],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "Neither path served a permission document (/.well-known/agent-permissions.json HTTP 404, /agent-permissions.json HTTP 404).",
      "evidence": null,
      "fix": null
    },
    {
      "id": "ai-rules",
      "category": "botaccess",
      "tier": "essential",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "Named AI bot rules in robots.txt",
      "why": "Naming agent crawlers explicitly is the first step to being visible in agent traffic.",
      "skill": "ai-rules",
      "standards": [
        "RFC 9309"
      ],
      "status": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "0 of 18 named AI bots addressed: the only 5 robots.txt rules sit in the User-agent: * group.",
      "evidence": "# As a condition of accessing this website, you agree to # abide by the following content signals: # (a) If a content-signal = yes, you may collect content # for the corresponding use. # (b) If a content-signal = no, you may not collect co…",
      "fix": "# robots.txt - named AI agents, each with a rule of its own.\nUser-agent: OAI-SearchBot\nAllow: /\nUser-agent: ChatGPT-User\nAllow: /\nUser-agent: Claude-User\nAllow: /\nUser-agent: PerplexityBot\nAllow: /\nUser-agent: GPTBot\nDisallow: /\nUser-agent: CCBot\nDisallow: /\nUser-agent: *\nAllow: /\nSitemap: https://example.com/sitemap.xml"
    },
    {
      "id": "content-signal",
      "category": "discoverability",
      "tier": "recommended",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "Content-Signal usage signals",
      "why": "Declares how your content may be used, inside robots.txt. Cloudflare included this in its readiness checks.",
      "skill": "content-signals",
      "standards": [
        "contentsignals.org"
      ],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "1 Content-Signal line in a robots.txt user-agent group, setting all three signals (search=yes, ai-input=yes, ai-train=yes).",
      "evidence": "robots.txt: ai-train=yes, search=yes, ai-input=yes",
      "fix": null
    },
    {
      "id": "ai-policy",
      "category": "botaccess",
      "tier": "essential",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "AI usage policy page",
      "why": "States the rules agents must follow and reduces licensing ambiguity.",
      "skill": "ai-policy",
      "standards": [],
      "status": "warn",
      "points": 0.35,
      "counted": true,
      "excluded": null,
      "detail": "AI policy at /ai covers 1 of 3 expected topics (a contact route stated; permitted uses and prohibited uses missing) and is not linked from the home page.",
      "evidence": "overview · cloudflare ai docs skip to content documentation index fetch the complete documentation index at: https://developers.cloudflare.com/ai/llms.txt use this file to discover all available pages before exploring further. docs directory api sdks changelo…",
      "fix": "<!doctype html>\n<html lang=\"en\">\n<head><meta charset=\"utf-8\"><title>AI usage policy</title></head>\n<body>\n  <h1>AI usage policy</h1>\n  <h2>Permitted</h2>\n  <p>Indexing, retrieval and citation by identified search and answer engines.</p>\n  <h2>Not permitted</h2>\n  <p>Do not train, fine-tune or distil a model on this content; no bulk scraping or resale.</p>\n  <h2>Contact</h2>\n  <p><a href=\"mailto:agents@example.com\">agents@example.com</a></p>\n</body>\n</html>"
    },
    {
      "id": "bot-page",
      "category": "botaccess",
      "tier": "recommended",
      "weight": 1,
      "impact": "medium",
      "conditional": false,
      "label": "Crawler and agent policy page",
      "why": "Explains which agents are permitted and how they are verified.",
      "skill": "bot-policy",
      "standards": [],
      "status": "warn",
      "points": 0.4,
      "counted": true,
      "excluded": null,
      "detail": "Bot policy at /agents covers 2 of 4 expected topics (welcomed agents and a contact route stated; refused agents and identity verification missing) and is linked from the home page.",
      "evidence": "agents · cloudflare agents docs skip to content documentation index fetch the complete documentation index at: https://developers.cloudflare.com/agents/llms.txt use this file to discover all available pages before exploring further. docs directory api sdks ch…",
      "fix": "<!doctype html>\n<html lang=\"en\">\n<head><meta charset=\"utf-8\"><title>Bot policy</title></head>\n<body>\n<h1>Bot and agent policy</h1>\n<h2>Welcome</h2>\n<p>Identified search and answer engines that cite the source.</p>\n<h2>Refused</h2>\n<p>Training crawlers, spoofed User-Agents, clients that ignore robots.txt.</p>\n<h2>How we verify identity</h2>\n<p>Signed requests are checked against our key directory at /.well-known/http-message-signatures-directory; unsigned clients by published IP ranges.</p>\n<h2>Contact</h2>\n<p><a href=\"mailto:agents@example.com\">agents@example.com</a></p>\n</body>\n</html>"
    },
    {
      "id": "security-txt",
      "category": "botaccess",
      "tier": "recommended",
      "weight": 1,
      "impact": "low",
      "conditional": false,
      "label": "security.txt (RFC 9116)",
      "why": "Provides a responsible disclosure channel for agent-related security incidents.",
      "skill": "security-txt",
      "standards": [
        "RFC 9116"
      ],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "No security.txt was served (/.well-known/security.txt HTTP 404, /security.txt HTTP 404).",
      "evidence": null,
      "fix": "# security.txt - RFC 9116\nContact: mailto:security@example.com\nExpires: 2027-09-30T18:37:07Z\nCanonical: https://example.com/.well-known/security.txt\nPreferred-Languages: en\nPolicy: https://example.com/security-policy"
    },
    {
      "id": "crawl-delay",
      "category": "botaccess",
      "tier": "emerging",
      "weight": 1,
      "impact": "low",
      "conditional": false,
      "label": "Crawl rate declaration",
      "why": "Cloudflare's Verified Bots policy drops AI crawlers that ignore crawl-delay.",
      "skill": "crawl-delay",
      "standards": [],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "No Crawl-delay line in 1 robots.txt group, so no crawl rate is declared.",
      "evidence": "# As a condition of accessing this website, you agree to # abide by the following content signals: # (a) If a content-signal = yes, you may collect content # for the corresponding use. # (b) If a content-signal = no, you may not collect co…",
      "fix": "# robots.txt - a crawl rate inside the group it applies to.\nUser-agent: *\nCrawl-delay: 1\n\nUser-agent: OAI-SearchBot\nCrawl-delay: 1\n\nUser-agent: GPTBot\nCrawl-delay: 10"
    },
    {
      "id": "ai-txt",
      "category": "botaccess",
      "tier": "emerging",
      "weight": 1,
      "impact": "low",
      "conditional": false,
      "label": "/ai.txt access declaration",
      "why": "Some agent ecosystems read an /ai.txt contract alongside robots.txt.",
      "skill": "ai-txt",
      "standards": [],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "/ai.txt answered HTTP 404, not an access declaration.",
      "evidence": "# 404 Page not found The page you requested does not exist or has moved. Browse the documentation via [llms.txt](/llms.txt). Search the documentation via the [AI Search API](https://ai-search.developers.cloudflare.com/a…",
      "fix": null
    },
    {
      "id": "mcp-card",
      "category": "protocol",
      "tier": "essential",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "MCP server card",
      "why": "Since MCP 2026-07-28, agents discover tool servers through a published declaration.",
      "skill": "mcp-server-card",
      "standards": [
        "MCP 2026-07-28"
      ],
      "status": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "MCP server card at /.well-known/mcp/server-card.json carries name, version and description for com.cloudflare/mcp but its 7 remotes entries yield 0 usable transports, so an agent learns the server exists but not where to connect.",
      "evidence": null,
      "fix": "{\n  \"$schema\": \"https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json\",\n  \"name\": \"com.example/weather\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Live weather and forecast data for partner agents.\",\n  \"title\": \"Example Weather\",\n  \"websiteUrl\": \"https://your-domain.example/developers\",\n  \"remotes\": [\n    {\n      \"type\": \"streamable-http\",\n      \"url\": \"https://your-domain.example/mcp\",\n      \"supportedProtocolVersions\": [\"2026-07-28\"]\n    }\n  ]\n}"
    },
    {
      "id": "openapi",
      "category": "protocol",
      "tier": "essential",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "OpenAPI definition",
      "why": "A machine-readable contract so an agent can discover your API and generate correct calls.",
      "skill": "openapi",
      "standards": [
        "OpenAPI 3.x"
      ],
      "status": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "The API description advertised by api-catalog service-desc (/.well-known/api-catalog) points at /openapi.json, which answered not an OpenAPI 3.x document, and the other 5 candidate paths yielded no OpenAPI 3.x document.",
      "evidence": "tried: /openapi.json 200 | /api/ 200 html | /openapi.yaml 404 | /.well-known/openapi.json 404 | /api/openapi.json 404 | /swagger.json 404",
      "fix": "{\n  \"openapi\": \"3.1.0\",\n  \"info\": { \"title\": \"Example Public API\", \"version\": \"1.4.0\" },\n  \"servers\": [{ \"url\": \"https://api.your-domain.example/v1\" }],\n  \"paths\": {\n    \"/orders/{orderId}\": {\n      \"get\": {\n        \"operationId\": \"getOrder\",\n        \"summary\": \"Get the status of one order\",\n        \"parameters\": [{ \"name\": \"orderId\", \"in\": \"path\", \"required\": true, \"schema\": { \"type\": \"string\" } }],\n        \"responses\": { \"200\": { \"description\": \"The order\" } }\n      }\n    }\n  }\n}"
    },
    {
      "id": "oauth-discovery",
      "category": "protocol",
      "tier": "essential",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "OAuth discovery documents",
      "why": "Required for agents to connect to your authenticated API on their own (RFC 8414 / RFC 9728).",
      "skill": "oauth-discovery",
      "standards": [
        "RFC 8414",
        "RFC 9728"
      ],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "None of the 3 OAuth discovery paths returned a JSON document (/.well-known/oauth-authorization-server 404 text/markdown; /.well-known/openid-configuration 404 text/markdown; /.well-known/oauth-protected-resource 404 text/markdown).",
      "evidence": null,
      "fix": "{\n  \"resource\": \"https://api.your-domain.example/\",\n  \"resource_name\": \"Example API\",\n  \"resource_logo_uri\": \"https://your-domain.example/logo.png\",\n  \"authorization_servers\": [\"https://auth.your-domain.example/\"],\n  \"scopes_supported\": [\"api.read\", \"api.write\"],\n  \"bearer_methods_supported\": [\"header\"]\n}"
    },
    {
      "id": "api-catalog",
      "category": "protocol",
      "tier": "recommended",
      "weight": 2,
      "impact": "medium",
      "conditional": false,
      "label": "API catalog",
      "why": "Lets an agent see which capabilities are callable in a single document (RFC 9727).",
      "skill": "api-catalog",
      "standards": [
        "RFC 9727"
      ],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "Linkset at /.well-known/api-catalog carries 1 entry, and 1 of them pairs an anchor with a service-desc link, the first pointing at https://developers.cloudflare.com/openapi.json. The scan requested the same-origin service-desc target /openapi.json, which answered HTTP 200. Not scored: the service-doc target /api/ answered HTTP 200. Not scored: the status target is on www.cloudflarestatus.com, which this scan does not request.",
      "evidence": "relations: service-desc, service-doc, status; observed target: /openapi.json",
      "fix": "{\n  \"linkset\": [\n    {\n      \"anchor\": \"https://your-domain.example/apis/public_api\",\n      \"service-desc\": [\n        { \"href\": \"https://your-domain.example/openapi.json\", \"type\": \"application/json\" }\n      ],\n      \"service-doc\": [\n        { \"href\": \"https://your-domain.example/docs/\", \"type\": \"text/html\" }\n      ],\n      \"status\": [\n        { \"href\": \"https://your-domain.example/status.json\", \"type\": \"application/json\" }\n      ]\n    }\n  ]\n}"
    },
    {
      "id": "agent-skills",
      "category": "protocol",
      "tier": "recommended",
      "weight": 1,
      "impact": "medium",
      "conditional": false,
      "label": "Agent Skills declaration",
      "why": "Offers ready-made capability packages to agent runtimes.",
      "skill": "agent-skills",
      "standards": [],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "The skills index declares a sha256 digest that does not match the bytes of the artifact it names. The artifact was fetched and hashed; a digest is a claim about content, and this one is false.",
      "evidence": null,
      "fix": null
    },
    {
      "id": "a2a-card",
      "category": "protocol",
      "tier": "recommended",
      "weight": 2,
      "impact": "medium",
      "conditional": false,
      "label": "A2A agent card",
      "why": "A2A v1.0 (Linux Foundation) is the emerging standard for agent-to-agent discovery. Almost no site publishes a card yet, which makes this one of the cheapest places to be early.",
      "skill": "a2a-agent-card",
      "standards": [
        "A2A v1.0"
      ],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "No A2A agent card was served as JSON at the 2 declared paths (/.well-known/agent-card.json 404 text/markdown; /.well-known/agent.json 404 text/markdown).",
      "evidence": null,
      "fix": "{\n  \"name\": \"Example Support Agent\",\n  \"description\": \"Answers product and billing questions for partner agents.\",\n  \"version\": \"1.0.0\",\n  \"supportedInterfaces\": [\n    { \"url\": \"https://your-domain.example/a2a/v1\", \"protocolBinding\": \"JSONRPC\", \"protocolVersion\": \"1.0\" }\n  ],\n  \"capabilities\": { \"streaming\": true },\n  \"defaultInputModes\": [\"text/plain\"],\n  \"defaultOutputModes\": [\"text/plain\"],\n  \"skills\": [\n    {\n      \"id\": \"billing-question\",\n      \"name\": \"Billing question\",\n      \"description\": \"Answers invoice questions for one account.\",\n      \"tags\": [\"billing\"]\n    }\n  ]\n}"
    },
    {
      "id": "a2a-signed",
      "category": "protocol",
      "tier": "emerging",
      "weight": 1,
      "impact": "medium",
      "conditional": false,
      "label": "Cryptographically signed agent card",
      "why": "A2A v1.0 makes identity verifiable through JWS (RFC 7515).",
      "skill": "a2a-card-signing",
      "standards": [
        "RFC 7515"
      ],
      "status": "na",
      "points": 0,
      "counted": false,
      "excluded": "unmeasurable",
      "detail": "No A2A agent card is published, so there are no signatures to inspect and the check is not scored.",
      "evidence": null,
      "fix": null
    },
    {
      "id": "auth-md",
      "category": "protocol",
      "tier": "emerging",
      "weight": 2,
      "impact": "medium",
      "conditional": false,
      "label": "/auth.md agent authentication guide",
      "why": "A guide telling an agent which authentication flow to use.",
      "skill": "auth-md",
      "standards": [],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "No markdown authentication guide was served at the 2 declared paths (/auth.md 404 text/markdown; /.well-known/auth.md 404 text/markdown).",
      "evidence": null,
      "fix": "# auth.md\n\nAgents authenticate here: discover, register, claim if needed, call.\n\n## Methods\n- `identity_assertion`: you hold an ID-JAG bound to this `resource`.\n- `service_auth`: you have the user's verified email; a claim follows.\n- `anonymous`: no user identity yet.\n\n## Endpoints\nGET https://api.your-domain.example/.well-known/oauth-protected-resource\nPOST `agent_auth.identity_endpoint`, then `agent_auth.claim_endpoint` when claim is\nrequired; exchange at `token_endpoint` for an access_token."
    },
    {
      "id": "webmcp",
      "category": "protocol",
      "tier": "emerging",
      "weight": 2,
      "impact": "medium",
      "conditional": false,
      "label": "WebMCP browser tool declaration",
      "why": "WebMCP lets sites expose tools to in-browser agents. It is the only normative deliverable of the W3C Agentic Web WG.",
      "skill": "webmcp",
      "standards": [
        "W3C WebMCP"
      ],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "WebMCP tools are declared at the homepage: 2 tools, each with a name, a description and a JSON Schema inputSchema.",
      "evidence": null,
      "fix": "{\n  \"tools\": [\n    {\n      \"name\": \"search_products\",\n      \"title\": \"Search products\",\n      \"description\": \"Search the public catalogue by free-text query and return matching products with prices.\",\n      \"inputSchema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"query\": { \"type\": \"string\", \"description\": \"Free-text search query\" },\n          \"limit\": { \"type\": \"integer\", \"minimum\": 1, \"maximum\": 50, \"default\": 10 }\n        },\n        \"required\": [\"query\"],\n        \"additionalProperties\": false\n      }\n    }\n  ]\n}"
    },
    {
      "id": "ard-manifest",
      "category": "protocol",
      "tier": "emerging",
      "weight": 1,
      "impact": "low",
      "conditional": false,
      "label": "ARD resource discovery manifest",
      "why": "Cisco/Outshift's Agentic Resource Discovery specification; Lighthouse audits it too.",
      "skill": "ard",
      "standards": [
        "ard-spec"
      ],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "ARD manifest at /.well-known/ard.json lists 3 entries, each with identifier, displayName and type plus exactly one of url or data.",
      "evidence": null,
      "fix": "{\n  \"entries\": [\n    {\n      \"identifier\": \"urn:air:your-domain.example:server:support\",\n      \"displayName\": \"Example Support MCP Server\",\n      \"type\": \"application/mcp-server-card+json\",\n      \"url\": \"https://your-domain.example/.well-known/mcp/server-card.json\",\n      \"description\": \"Tools for order status and returns.\"\n    }\n  ]\n}"
    },
    {
      "id": "docs",
      "category": "protocol",
      "tier": "recommended",
      "weight": 1,
      "impact": "medium",
      "conditional": false,
      "label": "Documentation reachable",
      "why": "An agent needs documentation to complete an integration on its own.",
      "skill": "documentation",
      "standards": [],
      "status": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "Documentation is reachable at /api/ (Link header rel=service-doc) and returns HTTP 200 text/html with 22979 readable words.",
      "evidence": null,
      "fix": "<!-- Homepage <head>: tell agents where the public docs are -->\n<link rel=\"service-doc\" href=\"/docs/\" type=\"text/html\">\n\n<!-- Homepage body: a real link, so crawlers and users both find it -->\n<a href=\"/docs/\">Documentation and API reference</a>"
    },
    {
      "id": "pricing-structured",
      "category": "protocol",
      "tier": "recommended",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "Structured pricing information",
      "why": "An offer without a price cannot be compared by an agent — you drop out of consideration.",
      "skill": "pricing-schema",
      "standards": [
        "schema.org/Offer"
      ],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "The homepage JSON-LD carries 1 model types with 0 Offer nodes and 0 price statements.",
      "evidence": null,
      "fix": "{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Service\",\n  \"name\": \"Agent Readiness Audit\",\n  \"offers\": {\n    \"@type\": \"Offer\",\n    \"price\": \"490.00\",\n    \"priceCurrency\": \"USD\",\n    \"availability\": \"https://schema.org/InStock\",\n    \"priceSpecification\": {\n      \"@type\": \"UnitPriceSpecification\",\n      \"price\": \"490.00\",\n      \"priceCurrency\": \"USD\"\n    }\n  }\n}"
    },
    {
      "id": "service-schema",
      "category": "protocol",
      "tier": "recommended",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "Service/product scope machine-readable",
      "why": "An agent must be able to answer \"what does this site offer, and to whom\".",
      "skill": "service-schema",
      "standards": [],
      "status": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "Homepage JSON-LD carries only 2 generic Organization or WebSite nodes across 1 model types, so what is offered and to whom is not readable.",
      "evidence": null,
      "fix": "{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Service\",\n  \"name\": \"Agent readiness audit\",\n  \"serviceType\": \"Website agent-readiness audit and remediation\",\n  \"provider\": { \"@type\": \"Organization\", \"name\": \"Example Inc.\", \"url\": \"https://your-domain.example\" },\n  \"areaServed\": [{ \"@type\": \"Country\", \"name\": \"United States\" }],\n  \"audience\": { \"@type\": \"BusinessAudience\", \"name\": \"E-commerce and SaaS teams\" }\n}"
    },
    {
      "id": "contact",
      "category": "protocol",
      "tier": "emerging",
      "weight": 1,
      "impact": "medium",
      "conditional": false,
      "label": "Structured contact information",
      "why": "An agent must know where to reach you before starting a transaction, or when something fails.",
      "skill": "contact-schema",
      "standards": [
        "schema.org/Organization"
      ],
      "status": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "Homepage JSON-LD declares 1 organization node with 0 contact details while the page itself carries 0 plain-text contact signals.",
      "evidence": null,
      "fix": "{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Organization\",\n  \"name\": \"Example Inc.\",\n  \"url\": \"https://your-domain.example\",\n  \"contactPoint\": [\n    {\n      \"@type\": \"ContactPoint\",\n      \"contactType\": \"technical support\",\n      \"email\": \"agents@your-domain.example\",\n      \"telephone\": \"+1-555-0100\",\n      \"availableLanguage\": [\"en\"]\n    }\n  ]\n}"
    },
    {
      "id": "status-page",
      "category": "protocol",
      "tier": "emerging",
      "weight": 1,
      "impact": "low",
      "conditional": false,
      "label": "Service status and changelog feed",
      "why": "An agent should be able to learn about outages and API changes in a machine-readable way.",
      "skill": "status-changelog",
      "standards": [],
      "status": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "The homepage advertises 1 status or feed reference, but the status document at https://www.cloudflarestatus.com/ was not fetched by this scan, so its response was not observed.",
      "evidence": null,
      "fix": "<!-- Homepage <head>: advertise machine-readable status and history -->\n<link rel=\"alternate\" type=\"application/atom+xml\" title=\"Service status\"\n      href=\"/status/feed.atom\">\n<link rel=\"alternate\" type=\"application/atom+xml\" title=\"Changelog\"\n      href=\"/changelog/feed.atom\">\n\n<!-- Homepage body: links a user (or a crawler) can follow -->\n<a href=\"/status/\">Service status</a>\n<a href=\"/changelog/\">Changelog</a>"
    },
    {
      "id": "product-schema",
      "category": "commerce",
      "tier": "essential",
      "weight": 3,
      "impact": "critical",
      "conditional": true,
      "label": "Product/catalog schema",
      "why": "Product data is the most valuable and the least machine-readable: price, availability and returns are usually rendered for a person to read and never declared for a machine to parse.",
      "skill": "product-schema",
      "standards": [
        "schema.org/Product"
      ],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "No Product, Offer or AggregateOffer type appears in the homepage JSON-LD (6 types) or in the JSON-LD of the 1 readable product or collection page.",
      "evidence": "homepage @type: WebPage, Organization, ImageObject, PostalAddress, ContactPoint, WebSite; product paths: /products HTTP 200, /shop HTTP 404, /store HTTP 404",
      "fix": "{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Product\",\n  \"name\": \"Aurora Desk Lamp\",\n  \"sku\": \"ADL-100-BLK\",\n  \"offers\": {\n    \"@type\": \"Offer\",\n    \"price\": \"1299.00\",\n    \"priceCurrency\": \"USD\",\n    \"availability\": \"https://schema.org/InStock\"\n  }\n}"
    },
    {
      "id": "payment-protocols",
      "category": "commerce",
      "tier": "recommended",
      "weight": 3,
      "impact": "high",
      "conditional": true,
      "label": "Agent payment standard support (AP2/ACP/x402/UCP)",
      "why": "The least-implemented surface in the rubric. Accepting an agent payment means choosing a standard and changing a checkout, which is a business decision most sites have not made yet.",
      "skill": "agent-payments",
      "standards": [
        "AP2",
        "ACP",
        "x402",
        "UCP"
      ],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "None of AP2, ACP, x402 or UCP is named on the 1 readable payment and policy pages, and no UCP manifest or agent-purchase wording was found.",
      "evidence": "/.well-known/ucp HTTP 404, /ai-policy HTTP 404, /agent-policy HTTP 404, /pricing HTTP 404, /agentic-commerce HTTP 404, /developers HTTP 404, /docs HTTP 200, /faq HTTP 404",
      "fix": null
    },
    {
      "id": "agent-purchase",
      "category": "commerce",
      "tier": "recommended",
      "weight": 2,
      "impact": "high",
      "conditional": true,
      "label": "Agent purchase policy",
      "why": "Liability is the open question in agent commerce, and it is a policy decision rather than a technical one: a site that accepts an agent purchase has to decide who carries the cost when the agent is wrong, and publish that decision where an agent can read it.",
      "skill": "agent-purchase-policy",
      "standards": [],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "No page among the 5 agent policy paths carries both an agent word and a purchase word (/ai-policy HTTP 404, /agent-policy HTTP 404, /terms HTTP 404, /agentic-commerce HTTP 404, /ai HTTP 200).",
      "evidence": "readable pages: /ai",
      "fix": null
    },
    {
      "id": "ucp-manifest",
      "category": "commerce",
      "tier": "emerging",
      "weight": 2,
      "impact": "medium",
      "conditional": true,
      "label": "UCP manifest (/.well-known/ucp)",
      "why": "Google and Shopify's Universal Commerce Protocol; lets a merchant declare checkout capabilities at transaction time.",
      "skill": "ucp",
      "standards": [],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "Neither /.well-known/ucp nor /.well-known/ucp.json returned HTTP 200 (/.well-known/ucp HTTP 404, /.well-known/ucp.json HTTP 404), so no manifest was served.",
      "evidence": null,
      "fix": "{\n  \"protocol_version\": \"1.0\",\n  \"merchant\": { \"id\": \"shop.example.com\", \"name\": \"Example Shop\", \"url\": \"https://shop.example.com\" },\n  \"capabilities\": { \"catalog_search\": true, \"product_detail\": true, \"cart\": true, \"checkout\": true },\n  \"checkout\": {\n    \"endpoint\": \"https://shop.example.com/api/ucp/checkout\",\n    \"payment_handlers\": [\"ap2\", \"acp\", \"x402\"]\n  }\n}"
    },
    {
      "id": "returns",
      "category": "commerce",
      "tier": "recommended",
      "weight": 1,
      "impact": "medium",
      "conditional": true,
      "label": "Return and shipping terms machine-readable",
      "why": "An agent must verify return terms before making a purchase decision.",
      "skill": "return-policy-schema",
      "standards": [
        "schema.org/MerchantReturnPolicy"
      ],
      "status": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "No return or shipping page responded (/returns HTTP 404, /shipping HTTP 404, /refund-policy HTTP 404) and the homepage JSON-LD declares neither MerchantReturnPolicy nor OfferShippingDetails.",
      "evidence": "homepage @type: WebPage",
      "fix": "{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Offer\",\n  \"hasMerchantReturnPolicy\": {\n    \"@type\": \"MerchantReturnPolicy\",\n    \"applicableCountry\": \"US\",\n    \"merchantReturnDays\": 14,\n    \"returnMethod\": \"https://schema.org/ReturnByMail\",\n    \"returnFees\": \"https://schema.org/FreeReturn\"\n  },\n  \"shippingDetails\": {\n    \"@type\": \"OfferShippingDetails\",\n    \"shippingRate\": { \"@type\": \"MonetaryAmount\", \"value\": \"49.00\", \"currency\": \"USD\" }\n  }\n}"
    },
    {
      "id": "agent-analytics",
      "category": "commerce",
      "tier": "emerging",
      "weight": 1,
      "impact": "low",
      "conditional": true,
      "label": "Agent traffic measurement",
      "why": "If agent traffic is not measured separately, the channel's return is invisible and never funded.",
      "skill": "agent-analytics",
      "standards": [],
      "status": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "No analytics vendor signature among the 8 checked appears in the homepage source, so nothing about the agent channel can be attributed.",
      "evidence": "homepage 219652 bytes; vendors: none; markers: tracking-widest uppercase\">agen…",
      "fix": null
    },
    {
      "id": "inventory-freshness",
      "category": "commerce",
      "tier": "recommended",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "Inventory and price freshness",
      "why": "An agent that cannot tell whether an item is in stock — or when a price was last valid — will quote a stale offer to a buyer, or refuse to quote at all.",
      "skill": "inventory-freshness",
      "standards": [
        "schema.org/Offer"
      ],
      "status": "na",
      "points": 0,
      "counted": false,
      "excluded": "out-of-scope",
      "detail": "Not scored: this check applies to ecommerce or marketplace sites; this site was measured as api. It is excluded from the denominator rather than counted as a failure.",
      "evidence": null,
      "fix": null
    },
    {
      "id": "seller-identity",
      "category": "commerce",
      "tier": "recommended",
      "weight": 2,
      "impact": "medium",
      "conditional": false,
      "label": "Seller identity declared",
      "why": "On a marketplace an offer is meaningless without knowing who is selling and who is the merchant of record, because that is who the agent has a contract with.",
      "skill": "seller-identity",
      "standards": [
        "schema.org/Organization"
      ],
      "status": "na",
      "points": 0,
      "counted": false,
      "excluded": "out-of-scope",
      "detail": "Not scored: this check applies to ecommerce or marketplace sites; this site was measured as api. It is excluded from the denominator rather than counted as a failure.",
      "evidence": null,
      "fix": null
    },
    {
      "id": "shipping-costs",
      "category": "commerce",
      "tier": "recommended",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "Shipping cost and delivery declared",
      "why": "A purchase agent that cannot compute the delivered total cannot complete a checkout, and returns to the merchant without it.",
      "skill": "shipping-costs",
      "standards": [
        "schema.org/OfferShippingDetails"
      ],
      "status": "na",
      "points": 0,
      "counted": false,
      "excluded": "out-of-scope",
      "detail": "Not scored: this check applies to ecommerce or marketplace sites; this site was measured as api. It is excluded from the denominator rather than counted as a failure.",
      "evidence": null,
      "fix": null
    },
    {
      "id": "sandbox-environment",
      "category": "protocol",
      "tier": "recommended",
      "weight": 2,
      "impact": "medium",
      "conditional": false,
      "label": "Sandbox or test environment documented",
      "why": "An agent cannot safely integrate against a production endpoint; a documented sandbox is the difference between a working trial and a support ticket.",
      "skill": "sandbox-environment",
      "standards": [],
      "status": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "A sandbox is referenced at /sandbox but it mentions a sandbox in 2 documents but names no non-production base URL, so an agent cannot integrate safely.",
      "evidence": null,
      "fix": "{\n  \"openapi\": \"3.1.0\",\n  \"info\": {\n    \"title\": \"Example API\",\n    \"version\": \"1.4.0\",\n    \"description\": \"Sandbox base URL https://api.sandbox.example.com/v1; test keys at https://example.com/docs/sandbox; no live payments, resets nightly.\"\n  },\n  \"servers\": [\n    { \"url\": \"https://api.example.com/v1\", \"description\": \"Production\" },\n    { \"url\": \"https://api.sandbox.example.com/v1\", \"description\": \"Sandbox - test keys only\" }\n  ],\n  \"paths\": {\n    \"/ping\": {\n      \"get\": { \"operationId\": \"ping\", \"responses\": { \"200\": { \"description\": \"reachable\" } } }\n    }\n  }\n}"
    },
    {
      "id": "rate-limits-declared",
      "category": "protocol",
      "tier": "recommended",
      "weight": 1,
      "impact": "medium",
      "conditional": false,
      "label": "Rate limits and quotas documented",
      "why": "An agent that does not know the quota discovers it by being throttled, halfway through a task it cannot resume.",
      "skill": "rate-limits",
      "standards": [
        "RFC 9110"
      ],
      "status": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "Rate limiting is acknowledged through 0 numeric limits, 0 windows and 11 scope declarations in /docs with 0 quota headers observed, but no single statement carries a limit with its unit, window, scope and the behaviour on exceed.",
      "evidence": "observed headers: none",
      "fix": "## Rate limits\n\nEvery endpoint is limited per API key; anonymous requests are limited per IP.\n\n| Scope | Limit | Window | On exceed |\n| --- | --- | --- | --- |\n| API key | 1000 requests | 1 hour | 429 + Retry-After (seconds) |\n| API key, burst | 20 requests | 1 second | 429 + Retry-After (seconds) |\n| Anonymous, per IP | 60 requests | 1 minute | 429 + Retry-After (seconds) |\n\nResponses carry RateLimit-Policy and RateLimit; a throttled request returns 429 with\nRetry-After. Machine-readable copy: https://your-domain.example/rate-limits.json"
    },
    {
      "id": "licensing-terms",
      "category": "content",
      "tier": "recommended",
      "weight": 2,
      "impact": "high",
      "conditional": false,
      "label": "Reuse and licensing terms declared",
      "why": "Declaring ai-train=no without stating a licensing path leaves both the publisher and the agent without an answer they can act on.",
      "skill": "licensing",
      "standards": [
        "TDM Reservation Protocol"
      ],
      "status": "na",
      "points": 0,
      "counted": false,
      "excluded": "out-of-scope",
      "detail": "Not scored: this check applies to publisher or institution sites; this site was measured as api. It is excluded from the denominator rather than counted as a failure.",
      "evidence": null,
      "fix": null
    },
    {
      "id": "provenance-declared",
      "category": "content",
      "tier": "emerging",
      "weight": 1,
      "impact": "medium",
      "conditional": false,
      "label": "Content provenance declared",
      "why": "Author, publication date and update date are what let an agent judge whether a source is current and attributable before it quotes it.",
      "skill": "provenance",
      "standards": [
        "schema.org/author",
        "C2PA"
      ],
      "status": "na",
      "points": 0,
      "counted": false,
      "excluded": "out-of-scope",
      "detail": "Not scored: this check applies to publisher or institution sites; this site was measured as api. It is excluded from the denominator rather than counted as a failure.",
      "evidence": null,
      "fix": null
    },
    {
      "id": "booking-action",
      "category": "commerce",
      "tier": "recommended",
      "weight": 2,
      "impact": "medium",
      "conditional": false,
      "label": "Machine-readable booking action",
      "why": "For a service business the agent's task is to book, not to browse — a declared action is what turns a contact page into a completed job.",
      "skill": "booking-action",
      "standards": [
        "schema.org/ReserveAction"
      ],
      "status": "na",
      "points": 0,
      "counted": false,
      "excluded": "out-of-scope",
      "detail": "Not scored: this check applies to services sites; this site was measured as api. It is excluded from the denominator rather than counted as a failure.",
      "evidence": null,
      "fix": null
    },
    {
      "id": "document-formats",
      "category": "content",
      "tier": "recommended",
      "weight": 2,
      "impact": "medium",
      "conditional": false,
      "label": "Documents in machine-readable formats",
      "why": "A PDF that carries no document structure is unreadable to an agent and to a screen reader alike — the same defect, found twice.",
      "skill": "document-formats",
      "standards": [
        "PDF/UA"
      ],
      "status": "na",
      "points": 0,
      "counted": false,
      "excluded": "out-of-scope",
      "detail": "Not scored: this check applies to institution sites; this site was measured as api. It is excluded from the denominator rather than counted as a failure.",
      "evidence": null,
      "fix": null
    }
  ],
  "counts": {
    "pass": 16,
    "warn": 15,
    "fail": 22,
    "na": 8,
    "total": 61
  },
  "blockedBy": {
    "level": 2,
    "levelName": "Bot-Aware",
    "checks": [
      "robots-txt",
      "ai-rules",
      "sitemap-xml"
    ]
  },
  "nextLevelGaps": [
    "robots-txt",
    "ai-rules",
    "sitemap-xml"
  ],
  "ratio": {
    "passed": 16,
    "applicable": 53,
    "label": "16/53"
  },
  "meta": {
    "title": "Cloudflare Developer Docs | Cloudflare Docs",
    "description": "Connect, protect, and build everywhere.",
    "lang": "en",
    "words": 1341,
    "tokensEst": 1810,
    "bytes": 219652
  },
  "requests_log": [
    {
      "path": "/",
      "status": 200,
      "bytes": 219652,
      "ms": 23,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/robots.txt",
      "status": 200,
      "bytes": 1442,
      "ms": 21,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/sitemap.xml",
      "status": 200,
      "bytes": 196,
      "ms": 25,
      "contentType": "application/xml",
      "hops": 1
    },
    {
      "path": "/llms.txt",
      "status": 200,
      "bytes": 16925,
      "ms": 22,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/llms-full.txt",
      "status": 200,
      "bytes": 3149824,
      "ms": 51,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/AGENTS.md",
      "status": 404,
      "bytes": 307,
      "ms": 4,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/sitemap.md",
      "status": 404,
      "bytes": 307,
      "ms": 3,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/ai.txt",
      "status": 404,
      "bytes": 307,
      "ms": 20,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/ai-policy",
      "status": 404,
      "bytes": 43824,
      "ms": 26,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/ai-usage",
      "status": 404,
      "bytes": 43824,
      "ms": 25,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/ai",
      "status": 200,
      "bytes": 117052,
      "ms": 35,
      "contentType": "text/html",
      "hops": 1
    },
    {
      "path": "/terms/ai",
      "status": 404,
      "bytes": 43824,
      "ms": 17,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/yapay-zeka-politikasi",
      "status": 404,
      "bytes": 43824,
      "ms": 10,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/auth.md",
      "status": 404,
      "bytes": 307,
      "ms": 9,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/auth.md",
      "status": 404,
      "bytes": 307,
      "ms": 21,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/http-message-signatures-directory",
      "status": 404,
      "bytes": 307,
      "ms": 12,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-permissions.json",
      "status": 404,
      "bytes": 307,
      "ms": 21,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/agent-permissions.json",
      "status": 404,
      "bytes": 307,
      "ms": 21,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/mcp/server-card.json",
      "status": 200,
      "bytes": 2893,
      "ms": 69,
      "contentType": "application/json",
      "hops": 0
    },
    {
      "path": "/.well-known/mcp.json",
      "status": 404,
      "bytes": 307,
      "ms": 19,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/mcp.json",
      "status": 404,
      "bytes": 307,
      "ms": 19,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-card.json",
      "status": 404,
      "bytes": 307,
      "ms": 16,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/agent.json",
      "status": 404,
      "bytes": 307,
      "ms": 19,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/oauth-authorization-server",
      "status": 404,
      "bytes": 307,
      "ms": 15,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/oauth-protected-resource",
      "status": 404,
      "bytes": 307,
      "ms": 18,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/openid-configuration",
      "status": 404,
      "bytes": 307,
      "ms": 14,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/api-catalog",
      "status": 200,
      "bytes": 351,
      "ms": 9,
      "contentType": "application/linkset+json",
      "hops": 0
    },
    {
      "path": "/api-catalog.json",
      "status": 404,
      "bytes": 307,
      "ms": 23,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/ai-plugin.json",
      "status": 404,
      "bytes": 307,
      "ms": 20,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-skills/index.json",
      "status": 200,
      "bytes": 7290,
      "ms": 22,
      "contentType": "application/json",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-skills.json",
      "status": 404,
      "bytes": 307,
      "ms": 20,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/skills.json",
      "status": 404,
      "bytes": 307,
      "ms": 17,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/security.txt",
      "status": 404,
      "bytes": 307,
      "ms": 18,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/security.txt",
      "status": 404,
      "bytes": 307,
      "ms": 17,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/webmcp.json",
      "status": 404,
      "bytes": 307,
      "ms": 19,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/webmcp",
      "status": 404,
      "bytes": 307,
      "ms": 16,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/webmcp.json",
      "status": 404,
      "bytes": 307,
      "ms": 14,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/ard.json",
      "status": 200,
      "bytes": 1349,
      "ms": 21,
      "contentType": "application/json",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-resources.json",
      "status": 404,
      "bytes": 307,
      "ms": 20,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/ai-catalog.json",
      "status": 200,
      "bytes": 2088,
      "ms": 11,
      "contentType": "application/ai-catalog+json",
      "hops": 0
    },
    {
      "path": "/ard.json",
      "status": 404,
      "bytes": 307,
      "ms": 21,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/ucp",
      "status": 404,
      "bytes": 307,
      "ms": 16,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/ucp.json",
      "status": 404,
      "bytes": 307,
      "ms": 14,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/openapi.json",
      "status": 200,
      "bytes": 3147176,
      "ms": 67,
      "contentType": "application/json",
      "hops": 0
    },
    {
      "path": "/openapi.yaml",
      "status": 404,
      "bytes": 307,
      "ms": 21,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/openapi.json",
      "status": 404,
      "bytes": 307,
      "ms": 18,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/api/openapi.json",
      "status": 404,
      "bytes": 9,
      "ms": 219,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/swagger.json",
      "status": 404,
      "bytes": 307,
      "ms": 14,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/ai",
      "status": 404,
      "bytes": 307,
      "ms": 17,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/api",
      "status": 200,
      "bytes": 3149719,
      "ms": 212,
      "contentType": "text/html",
      "hops": 1
    },
    {
      "path": "/bot",
      "status": 404,
      "bytes": 43824,
      "ms": 29,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/bots",
      "status": 200,
      "bytes": 120114,
      "ms": 42,
      "contentType": "text/html",
      "hops": 1
    },
    {
      "path": "/agents",
      "status": 200,
      "bytes": 140435,
      "ms": 29,
      "contentType": "text/html",
      "hops": 1
    },
    {
      "path": "/agent",
      "status": 404,
      "bytes": 43824,
      "ms": 45,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/agent-policy",
      "status": 404,
      "bytes": 43824,
      "ms": 32,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/agentic-commerce",
      "status": 404,
      "bytes": 43824,
      "ms": 32,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/terms",
      "status": 404,
      "bytes": 43824,
      "ms": 29,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/pricing",
      "status": 404,
      "bytes": 43824,
      "ms": 36,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/fiyatlandirma",
      "status": 404,
      "bytes": 43824,
      "ms": 36,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/fiyat",
      "status": 404,
      "bytes": 43824,
      "ms": 23,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/plans",
      "status": 404,
      "bytes": 43824,
      "ms": 28,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/contact",
      "status": 404,
      "bytes": 43824,
      "ms": 29,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/iletisim",
      "status": 404,
      "bytes": 43824,
      "ms": 21,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/contact-us",
      "status": 404,
      "bytes": 43824,
      "ms": 30,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/faq",
      "status": 404,
      "bytes": 43824,
      "ms": 29,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/sss",
      "status": 404,
      "bytes": 43824,
      "ms": 41,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/sikca-sorulan-sorular",
      "status": 404,
      "bytes": 43824,
      "ms": 20,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/help",
      "status": 404,
      "bytes": 43824,
      "ms": 20,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/yardim",
      "status": 404,
      "bytes": 43824,
      "ms": 16,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/docs",
      "status": 200,
      "bytes": 286178,
      "ms": 19,
      "contentType": "text/html",
      "hops": 1
    },
    {
      "path": "/documentation",
      "status": 404,
      "bytes": 43824,
      "ms": 16,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/developers",
      "status": 404,
      "bytes": 43824,
      "ms": 16,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/gelistiriciler",
      "status": 404,
      "bytes": 43824,
      "ms": 26,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/status",
      "status": 404,
      "bytes": 43824,
      "ms": 23,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/changelog",
      "status": 200,
      "bytes": 307792,
      "ms": 37,
      "contentType": "text/html",
      "hops": 1
    },
    {
      "path": "/releases",
      "status": 404,
      "bytes": 43824,
      "ms": 24,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/whats-new",
      "status": 404,
      "bytes": 43824,
      "ms": 35,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/returns",
      "status": 404,
      "bytes": 43824,
      "ms": 25,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/shipping",
      "status": 404,
      "bytes": 43824,
      "ms": 24,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/iade",
      "status": 404,
      "bytes": 43824,
      "ms": 24,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/kargo",
      "status": 404,
      "bytes": 43824,
      "ms": 29,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/refund-policy",
      "status": 404,
      "bytes": 43824,
      "ms": 29,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/about",
      "status": 404,
      "bytes": 43824,
      "ms": 31,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/products",
      "status": 200,
      "bytes": 286178,
      "ms": 46,
      "contentType": "text/html",
      "hops": 1
    },
    {
      "path": "/shop",
      "status": 404,
      "bytes": 43824,
      "ms": 35,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/store",
      "status": 404,
      "bytes": 43824,
      "ms": 28,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/urunler",
      "status": 404,
      "bytes": 43824,
      "ms": 27,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/magaza",
      "status": 404,
      "bytes": 43824,
      "ms": 25,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/cart",
      "status": 404,
      "bytes": 43824,
      "ms": 21,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/sepet",
      "status": 404,
      "bytes": 43824,
      "ms": 27,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/docs/sandbox",
      "status": 404,
      "bytes": 43824,
      "ms": 30,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/sandbox",
      "status": 200,
      "bytes": 161080,
      "ms": 35,
      "contentType": "text/html",
      "hops": 1
    },
    {
      "path": "/developers/sandbox",
      "status": 404,
      "bytes": 43824,
      "ms": 31,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/rate-limits.json",
      "status": 404,
      "bytes": 307,
      "ms": 25,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/rate-limits.json",
      "status": 404,
      "bytes": 307,
      "ms": 11,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/docs/rate-limits",
      "status": 404,
      "bytes": 43824,
      "ms": 7,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/licensing",
      "status": 404,
      "bytes": 43824,
      "ms": 2,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/.well-known/tdmrep.json",
      "status": 404,
      "bytes": 307,
      "ms": 26,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/book",
      "status": 404,
      "bytes": 43824,
      "ms": 39,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/appointment",
      "status": 404,
      "bytes": 43824,
      "ms": 38,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/documents",
      "status": 404,
      "bytes": 43824,
      "ms": 42,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/publications",
      "status": 404,
      "bytes": 43824,
      "ms": 43,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/reports",
      "status": 404,
      "bytes": 43824,
      "ms": 30,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-skills/agents-sdk.tar.gz",
      "status": 200,
      "bytes": 15087,
      "ms": 25,
      "contentType": "application/gzip",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-skills/basin.tar.gz",
      "status": 200,
      "bytes": 17406,
      "ms": 27,
      "contentType": "application/gzip",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-skills/cloudflare.tar.gz",
      "status": 200,
      "bytes": 152899,
      "ms": 30,
      "contentType": "application/gzip",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-skills/cloudflare-email-service.tar.gz",
      "status": 200,
      "bytes": 10938,
      "ms": 27,
      "contentType": "application/gzip",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-skills/cloudflare-one/SKILL.md",
      "status": 200,
      "bytes": 23724,
      "ms": 28,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-skills/cloudflare-one-migrations/SKILL.md",
      "status": 200,
      "bytes": 12495,
      "ms": 21,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-skills/durable-objects.tar.gz",
      "status": 200,
      "bytes": 6561,
      "ms": 20,
      "contentType": "application/gzip",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-skills/k2/SKILL.md",
      "status": 200,
      "bytes": 2174,
      "ms": 21,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-skills/nextjs-on-cloudflare/SKILL.md",
      "status": 200,
      "bytes": 2711,
      "ms": 21,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-skills/sandbox-migrate-to-next/SKILL.md",
      "status": 200,
      "bytes": 7902,
      "ms": 22,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/argo-smart-routing/llms.txt",
      "status": 200,
      "bytes": 1253,
      "ms": 39,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/automatic-platform-optimization/llms.txt",
      "status": 200,
      "bytes": 3589,
      "ms": 38,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/cache/llms.txt",
      "status": 200,
      "bytes": 14669,
      "ms": 29,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/china-network/llms.txt",
      "status": 200,
      "bytes": 2156,
      "ms": 39,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/web-analytics/llms.txt",
      "status": 200,
      "bytes": 3148,
      "ms": 31,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/dns/llms.txt",
      "status": 200,
      "bytes": 25178,
      "ms": 18,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/api/",
      "status": 200,
      "bytes": 3145741,
      "ms": 303,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/fundamentals/api/reference/sdks/",
      "status": 200,
      "bytes": 123101,
      "ms": 31,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/",
      "status": 200,
      "bytes": 12635,
      "ms": 47,
      "contentType": "text/markdown",
      "hops": 0
    }
  ]
}