{
  "version": "0.1.0",
  "rubricVersion": "0.7",
  "target": "https://vercel.com",
  "host": "vercel.com",
  "https": true,
  "scannedAt": "2026-10-12T22:54:18.994Z",
  "durationMs": 16000,
  "requests": 189,
  "score": 61.6,
  "grade": "A",
  "gradeLabel": "solid",
  "previous": {
    "score": 60.6,
    "grade": "A",
    "level": 1,
    "fingerprint": "4d9915c89c9cbba65dac06ad8d4ac429f6d9c1a4d366faed5cf0c29c23c699cf",
    "scannedAt": "2026-10-09T14:08:15.388Z",
    "counts": {
      "pass": 19,
      "warn": 16,
      "fail": 16,
      "na": 10,
      "total": 61
    },
    "rubricVersion": "0.6"
  },
  "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": 50.72711111111112,
      "pool": 80,
      "counted": 16,
      "total": 16
    },
    "recommended": {
      "score": 12.20214285714286,
      "pool": 20,
      "counted": 20,
      "total": 28
    },
    "emerging": {
      "score": 1.7712500000000007,
      "pool": 5,
      "counted": 15,
      "total": 17
    }
  },
  "confidence": 99,
  "confidenceLabel": "high",
  "fingerprint": "94ac0d87d0c8f17cd25b2636ab84a29a623de68e39f9c63d731e0be04d0d3d5e",
  "isCommerce": true,
  "commerceSignals": [
    "commerce path (/cart)"
  ],
  "blocked": null,
  "blockedNote": null,
  "deadline": {
    "ms": 60000,
    "reached": false
  },
  "profile": {
    "id": "general",
    "identified": false,
    "declared": false,
    "ambiguous": [
      "saas",
      "api"
    ],
    "evidence": [
      "Two profiles are too close to separate: saas (8) and api (7), margin 1 < 2.",
      "Profile-scoped checks were not scored rather than guessed at."
    ],
    "scores": [
      {
        "id": "saas",
        "score": 8,
        "signals": [
          "SoftwareApplication schema",
          "A pricing page responds",
          "A documentation path responds",
          "Service schema"
        ]
      },
      {
        "id": "api",
        "score": 7,
        "signals": [
          "An OpenAPI document responds",
          "A documentation path responds",
          "A developer portal responds"
        ]
      },
      {
        "id": "ecommerce",
        "score": 4,
        "signals": [
          "A cart path responds",
          "A product listing path responds",
          "A shop path responds"
        ]
      },
      {
        "id": "services",
        "score": 4,
        "signals": [
          "Service schema",
          "A contact path responds",
          "A pricing path responds"
        ]
      },
      {
        "id": "marketplace",
        "score": 3,
        "signals": [
          "Describes itself as a marketplace"
        ]
      }
    ]
  },
  "categories": [
    {
      "id": "protocol",
      "label": "Protocol Discovery",
      "weight": 0.25,
      "score": 47.9,
      "counted": true,
      "pass": 5,
      "warn": 5,
      "fail": 4,
      "na": 3,
      "total": 17
    },
    {
      "id": "content",
      "label": "Content Accessibility",
      "weight": 0.22,
      "score": 68.2,
      "counted": true,
      "pass": 6,
      "warn": 3,
      "fail": 3,
      "na": 3,
      "total": 15
    },
    {
      "id": "discoverability",
      "label": "Discoverability",
      "weight": 0.2,
      "score": 72.7,
      "counted": true,
      "pass": 6,
      "warn": 2,
      "fail": 3,
      "na": 0,
      "total": 11
    },
    {
      "id": "botaccess",
      "label": "Bot Access Control",
      "weight": 0.18,
      "score": 21.4,
      "counted": true,
      "pass": 1,
      "warn": 4,
      "fail": 3,
      "na": 0,
      "total": 8
    },
    {
      "id": "commerce",
      "label": "Commerce Protocols",
      "weight": 0.15,
      "score": 52.1,
      "counted": true,
      "pass": 1,
      "warn": 3,
      "fail": 2,
      "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; charset=utf-8 with 603262 bytes and 534 words of visible text.",
      "evidence": "HTTP 200 · text/html; charset=utf-8 · 603262 bytes · 248 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 (17 rules), with a Sitemap declared.",
      "evidence": "HTTP 200 · text/plain; charset=utf-8 · 629 bytes · 206 ms · User-Agent: * Content-Signal: search=yes, ai-input=yes, ai-train=no # Allow robots to be able to crawl the OG Image API route and all the s…",
      "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": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "8618 absolute URLs, 8618 with <lastmod>.",
      "evidence": "HTTP 200 · application/xml; charset=utf-8 · 1201699 bytes · 2027 ms · final https://vercel.com/crawled-sitemap.xml · root <urlset>",
      "fix": null
    },
    {
      "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 \"Vercel\", blockquote summary, 7 H2 sections with 25 markdown links, 4935 bytes. The scan requested 8 links it names, and each answered 2xx. Not requested: 17 same-origin links (the scan samples up to 6).",
      "evidence": "HTTP 200 · text/plain; charset=utf-8 · 4935 bytes · 334 ms · headings: Vercel | When to use Vercel | How agents should use Vercel | Agent setup | Documentation | REST API and developer resou…",
      "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": "3 Link entrys, 1 carrying a discovery relation (rel=api-catalog → /.well-known/api-catalog).",
      "evidence": "link: </.well-known/api-catalog>; rel=\"api-catalog\", </.well-known/ai-catalog.json>; rel=\"ai-catalog\"; type=\"application/ai-catalog+json\", </.well-known/agent-skills/index.json>; rel=\"agent-skills\"; type=\"application/json\"",
      "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.vercel.com and _agent.vercel.com.",
      "evidence": "DNS-AID names queried for SVCB and TXT records: _index._agents.vercel.com and _agent.vercel.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://vercel.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": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "HTML was returned for /llms-full.txt with HTTP 200 by a catch-all route, so no expanded text is offered (2563329 bytes).",
      "evidence": "HTTP 200 · text/html; charset=utf-8 · 2563329 bytes · 1617 ms · <!DOCTYPE html><html data-dpl-id=\"dpl_EvJRL9hSJtDHL8xWaMrkxoYbQhqo\" class=\"VEU7…",
      "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": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "Served as text/html; charset=utf-8 rather than text/markdown, with 5 of 5 required sections.",
      "evidence": "HTTP 200 · text/html; charset=utf-8 · 2517867 bytes · 1469 ms · headings:",
      "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": "HTML was returned for /sitemap.md with HTTP 200 by a catch-all route, 2608461 bytes.",
      "evidence": "HTTP 200 · text/html; charset=utf-8 · 2608461 bytes · 1172 ms · <!DOCTYPE html><html data-dpl-id=\"dpl_EvJRL9hSJtDHL8xWaMrkxoYbQhqo\" class=\"VEU7…",
      "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, accept-encoding on the negotiated response (HTTP 200).",
      "evidence": "status: 200; content-type: text/markdown; charset=utf-8; vary: Accept, accept-encoding; 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 17 H2s and 0 H3s, and no level in the outline is skipped.",
      "evidence": "outline: H1 H2 H2 H2 H2 H2 H2 H2 H2 H2 H2 H2 H2 H2 H2 H2 H2 H2",
      "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 31 characters (band 50-60) and description 45 characters (band 120-160).",
      "evidence": "title(31): Agentic Infrastructure - Vercel | description(45): The autonomous stack for every app and agent.",
      "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": "3 JSON-LD blocks parsed with a schema.org @context declaring Organization (8 @types in total).",
      "evidence": "blocks: 3 total, 3 non-empty, 3 parsed; schema.org @context: yes; @types: Organization, ImageObject, Person, ContactPoint, PostalAddress, Service, SoftwareApplication, Offer",
      "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 3 parsed JSON-LD blocks on the homepage.",
      "evidence": "@types: Organization, ImageObject, Person, ContactPoint, PostalAddress, Service, SoftwareApplication, Offer",
      "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 3 parsed JSON-LD blocks on the homepage.",
      "evidence": "@types: Organization, ImageObject, Person, ContactPoint, PostalAddress, Service, SoftwareApplication, Offer",
      "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": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "Opening paragraph holds 23 characters, under the 40-character floor for a summary.",
      "evidence": "Ship 26 is coming to SF",
      "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": "3680 characters of static text and 1 H1 is in the HTML before any JavaScript runs.",
      "evidence": "static characters: 3680; H1 in static HTML: 1; characters inside noscript: 0; markup characters: 603176",
      "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 /about ship different titles (\"Agentic Infrastructure - Vercel\" vs \"About Us\") and different main text (9% word overlap).",
      "evidence": "compared / vs /about; titles \"Agentic Infrastructure - Vercel\" / \"About Us\"; skeleton 87%; main-text word overlap 9%; main text 1346 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 0.6% (3680 visible of 603176 markup characters, ~721 tokens), below the 8% floor where markup outweighs the content.",
      "evidence": "visible characters: 3680; markup characters: 603176; words: 534; estimated tokens: 721",
      "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": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "viewport content \"width=device-width, initial-scale=1, maximum-scale=1\" pins maximum-scale, so a mobile-scale agent browser cannot zoom.",
      "evidence": "viewport meta: width=device-width, initial-scale=1, maximum-scale=1; media queries on the page: 0",
      "fix": "<head>\n  <meta charset=\"utf-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n  <style>\n    img, video { max-width: 100%; height: auto; }\n    .grid { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }\n    @media (max-width: 640px) {\n      .sidebar { display: none; }\n      h1 { font-size: 1.75rem; }\n    }\n  </style>\n</head>"
    },
    {
      "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": "Not Found",
      "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": "Both paths answered without JSON (/.well-known/agent-permissions.json HTTP 404, /agent-permissions.json HTTP 200).",
      "evidence": "<!DOCTYPE html><html data-dpl-id=\"dpl_EvJRL9hSJtDHL8xWaMrkxoYbQhqo\" class=\"VEU71W_className M8bjnG_className VEU71W_variable M8bjnG_variable dash\" lang=\"en-US\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=…",
      "fix": "{\n  \"version\": \"1.0\",\n  \"site\": \"https://example.com\",\n  \"default\": \"deny\",\n  \"actions\": {\n    \"read:public-content\": { \"permission\": \"allow\" },\n    \"purchase:create-cart\": { \"permission\": \"allow\" },\n    \"purchase:pay\": { \"permission\": \"human-approval\" },\n    \"train:model\": { \"permission\": \"deny\" }\n  },\n  \"contact\": \"agents@example.com\",\n  \"policy\": \"https://example.com/ai-policy\"\n}"
    },
    {
      "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 17 robots.txt rules sit in the User-agent: * group.",
      "evidence": "User-Agent: * Content-Signal: search=yes, ai-input=yes, ai-train=no # Allow robots to be able to crawl the OG Image API route and all the subpaths Allow: /api/og/* Allow: /api/docs-og* Allow: /api/product-og* Allow: /api/dynamic-og* Allow:…",
      "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=no).",
      "evidence": "robots.txt: search=yes, ai-input=yes, ai-train=no",
      "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.2,
      "counted": true,
      "excluded": null,
      "detail": "AI policy at /ai-policy covers 0 of 3 expected topics (permitted uses, prohibited uses and a contact route all missing) and is not linked from the home page.",
      "evidence": "skip to content login – vercel sign up log in to vercel terms privacy policy log in to vercel continue with email continue with google continue with github continue with chatgpt continue with saml sso continue with passkey show other options don't have an acc…",
      "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 /agent covers 2 of 4 expected topics (welcomed agents and identity verification stated; refused agents and a contact route missing) and is linked from the home page.",
      "evidence": "vercel agent skip to content copy wordmark copy logo download brand assets brand guidelines products agent stack ai sdk ai gateway sandbox passport connect eve core platform security content delivery fluid compute observability workflows ci/cd tools next.js v…",
      "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": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "security.txt at /.well-known/security.txt declares 2 Contacts and an Expires 2027-09-28T12:00:00.000Z in the future. Not scored: its Policy URL is on security.vercel.com, which this scan does not request.",
      "evidence": "Contact: https://hackerone.com/vercel Contact: mailto:responsible.disclosure@vercel.com Expires: 2027-09-28T12:00:00.000Z Preferred-Languages: en Policy: https://security.vercel.com/ Canonical: https://vercel.com/.well-known/security.txt Hiring: https://verce…",
      "fix": null
    },
    {
      "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": "User-Agent: * Content-Signal: search=yes, ai-input=yes, ai-train=no # Allow robots to be able to crawl the OG Image API route and all the subpaths Allow: /api/og/* Allow: /api/docs-og* Allow: /api/product-og* Allow: /api/dynamic-og* Allow:…",
      "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": "warn",
      "points": 0.2,
      "counted": true,
      "excluded": null,
      "detail": "/ai.txt answered HTTP 200 with HTML rather than a text declaration, so 0 of 3 expected topics are covered.",
      "evidence": "<!DOCTYPE html><html data-dpl-id=\"dpl_EvJRL9hSJtDHL8xWaMrkxoYbQhqo\" class=\"VEU71W_className M8bjnG_className VEU71W_variable M8bjnG_variable dash\" lang=\"en-US\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, ma…",
      "fix": "# ai.txt - access declaration for example.com\nSite: https://example.com\nContact: agents@example.com\nPolicy: https://example.com/ai-policy\n\nAllow:\n- Indexing, retrieval and citation by identified search and answer engines.\n- Summarising public pages with attribution and a link to the source.\n\nDisallow:\n- Training, fine-tuning or distilling a model on this content.\n- Bulk scraping, resale or redistribution of content or data."
    },
    {
      "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": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "No MCP server card was served as JSON at the 3 declared paths (/.well-known/mcp/server-card.json 404 text/plain; /.well-known/mcp.json 404 text/plain; /mcp.json 200 text/html).",
      "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": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "No OpenAPI document was found: 5 candidate paths (0 advertised, 5 standard) returned no JSON OpenAPI 3.x document.",
      "evidence": "tried: /openapi.json 200 | /openapi.yaml 200 html | /.well-known/openapi.json 404 | /api/openapi.json 404 | /swagger.json 200 html",
      "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": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "RFC 8414 metadata at /.well-known/openid-configuration declares issuer https://vercel.com, authorization_endpoint, token_endpoint and 1 response type.",
      "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": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "A linkset is served at /.well-known/api-catalog with 2 entries, but 1 of them pairs an anchor with a service-desc link, so no callable API is identified. 1 same-origin target was declared but never fetched by this scan, and 1 target on another host was not followed, so no callable API was observed. Not scored: the status target is on www.vercel-status.com, which this scan does not request.",
      "evidence": "relations: item, service-desc, service-doc, status",
      "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": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "Agent skills index at /.well-known/agent-skills/index.json lists 9 skills with name, description, url and a digest, but 9 of 9 declared artifact urls (https://github.com/vercel-labs/agent-skills/releases/download/agent-skills-063bee94c3f4df8453406c830b0a7df0f2860278/deploy-to-vercel.tar.gz) are on another host, which this scan does not follow.",
      "evidence": null,
      "fix": "{\n  \"$schema\": \"https://schemas.agentskills.io/discovery/0.2.0/schema.json\",\n  \"skills\": [\n    {\n      \"name\": \"invoice-reconciliation\",\n      \"type\": \"skill-md\",\n      \"description\": \"Reconcile invoices against payments and flag unmatched line items.\",\n      \"url\": \"/.well-known/agent-skills/invoice-reconciliation/SKILL.md\",\n      \"digest\": \"sha256:9f2c1a4b7d8e0f3a5c6b1d2e4f7089a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6\"\n    }\n  ]\n}"
    },
    {
      "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/plain; /.well-known/agent.json 404 text/plain).",
      "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": "warn",
      "points": 0.5,
      "counted": true,
      "excluded": null,
      "detail": "An authentication guide is served at /auth.md but it serves an HTML sign-in page instead of a markdown guide, so an agent cannot register itself.",
      "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": "fail",
      "points": 0,
      "counted": true,
      "excluded": null,
      "detail": "No WebMCP declaration was found: the 3 manifest paths served no tools array and the homepage contains 0 registerTool calls.",
      "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/ai-catalog.json lists 4 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 /docs (homepage anchor) and returns HTTP 200 text/html with 1371 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": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "Homepage JSON-LD carries 1 complete offer node, the first stating price 0 with priceCurrency USD and availability https://schema.org/OnlineOnly.",
      "evidence": "{\"price\":0,\"priceCurrency\":\"USD\",\"availability\":\"https://schema.org/OnlineOnly\"}",
      "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": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "Homepage JSON-LD declares a service-like node offering \"Agentic infrastructure platform\" from Vercel Inc. to Worldwide, among 10 total model nodes.",
      "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 3 organization nodes 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": "A status document is advertised at /status (HTTP 200) but the homepage advertises 0 Atom or RSS changelog feeds.",
      "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": "pass",
      "points": 1,
      "counted": true,
      "excluded": null,
      "detail": "Homepage JSON-LD declares Offer among its 8 schema types.",
      "evidence": "homepage @type: Organization, Service, SoftwareApplication, Offer, ImageObject, Person, ContactPoint, PostalAddress",
      "fix": null
    },
    {
      "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": "warn",
      "points": 0.7,
      "counted": true,
      "excluded": null,
      "detail": "Exactly one agent-payment signal (agent-purchase grant stated on /docs); the 7 readable payment and policy pages name no second standard, manifest or agent-purchase wording.",
      "evidence": "paths read: 7/8; standards: none",
      "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 200, /agent-policy HTTP 200, /terms HTTP 200, /agentic-commerce HTTP 200, /ai HTTP 200).",
      "evidence": "readable pages: /ai-policy, /agent-policy, /terms, /agentic-commerce, /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": "warn",
      "points": 0.65,
      "counted": true,
      "excluded": null,
      "detail": "/returns, /shipping, /refund-policy responded but none of the 4 documents read declares MerchantReturnPolicy or OfferShippingDetails.",
      "evidence": "readable return pages: /returns 333724 bytes, /shipping 333728 bytes, /refund-policy 333748 bytes",
      "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 603262 bytes; vendors: none; markers: events-none\"/><img alt=\"build a…, agent</span></span></a></li><li…",
      "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, and the site type could not be confirmed (best candidates: saas, api). Declare the type to have it measured.",
      "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, and the site type could not be confirmed (best candidates: saas, api). Declare the type to have it measured.",
      "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, and the site type could not be confirmed (best candidates: saas, api). Declare the type to have it measured.",
      "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": "na",
      "points": 0,
      "counted": false,
      "excluded": "out-of-scope",
      "detail": "Not scored: this check applies to saas or api sites, and the site type could not be confirmed (best candidates: saas, api). Declare the type to have it measured.",
      "evidence": null,
      "fix": null
    },
    {
      "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": "na",
      "points": 0,
      "counted": false,
      "excluded": "out-of-scope",
      "detail": "Not scored: this check applies to api sites, and the site type could not be confirmed (best candidates: saas, api). Declare the type to have it measured.",
      "evidence": null,
      "fix": null
    },
    {
      "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, and the site type could not be confirmed (best candidates: saas, api). Declare the type to have it measured.",
      "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, and the site type could not be confirmed (best candidates: saas, api). Declare the type to have it measured.",
      "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, and the site type could not be confirmed (best candidates: saas, api). Declare the type to have it measured.",
      "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, and the site type could not be confirmed (best candidates: saas, api). Declare the type to have it measured.",
      "evidence": null,
      "fix": null
    }
  ],
  "counts": {
    "pass": 19,
    "warn": 17,
    "fail": 15,
    "na": 10,
    "total": 61
  },
  "blockedBy": {
    "level": 2,
    "levelName": "Bot-Aware",
    "checks": [
      "robots-txt",
      "ai-rules"
    ]
  },
  "nextLevelGaps": [
    "robots-txt",
    "ai-rules"
  ],
  "ratio": {
    "passed": 19,
    "applicable": 51,
    "label": "19/51"
  },
  "meta": {
    "title": "Agentic Infrastructure - Vercel",
    "description": "The autonomous stack for every app and agent.",
    "lang": "en",
    "words": 534,
    "tokensEst": 721,
    "bytes": 603262
  },
  "requests_log": [
    {
      "path": "/",
      "status": 200,
      "bytes": 603262,
      "ms": 248,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/robots.txt",
      "status": 200,
      "bytes": 629,
      "ms": 206,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/sitemap.xml",
      "status": 200,
      "bytes": 1201699,
      "ms": 2027,
      "contentType": "application/xml",
      "hops": 1
    },
    {
      "path": "/llms.txt",
      "status": 200,
      "bytes": 4935,
      "ms": 334,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/llms-full.txt",
      "status": 200,
      "bytes": 2563329,
      "ms": 1617,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/AGENTS.md",
      "status": 200,
      "bytes": 2517867,
      "ms": 1469,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/sitemap.md",
      "status": 200,
      "bytes": 2608461,
      "ms": 1172,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/ai.txt",
      "status": 200,
      "bytes": 2563038,
      "ms": 1544,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/ai-policy",
      "status": 200,
      "bytes": 333732,
      "ms": 684,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/ai-usage",
      "status": 200,
      "bytes": 333728,
      "ms": 517,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/ai",
      "status": 200,
      "bytes": 633155,
      "ms": 66,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/terms/ai",
      "status": 200,
      "bytes": 2615261,
      "ms": 1657,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/yapay-zeka-politikasi",
      "status": 200,
      "bytes": 333780,
      "ms": 851,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/auth.md",
      "status": 200,
      "bytes": 2563266,
      "ms": 1537,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/.well-known/auth.md",
      "status": 404,
      "bytes": 9,
      "ms": 423,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/.well-known/http-message-signatures-directory",
      "status": 404,
      "bytes": 9,
      "ms": 268,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-permissions.json",
      "status": 404,
      "bytes": 9,
      "ms": 232,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/agent-permissions.json",
      "status": 200,
      "bytes": 2609139,
      "ms": 1362,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/.well-known/mcp/server-card.json",
      "status": 404,
      "bytes": 9,
      "ms": 485,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/.well-known/mcp.json",
      "status": 404,
      "bytes": 9,
      "ms": 245,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/mcp.json",
      "status": 200,
      "bytes": 2563314,
      "ms": 1359,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-card.json",
      "status": 404,
      "bytes": 9,
      "ms": 240,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/.well-known/agent.json",
      "status": 404,
      "bytes": 9,
      "ms": 391,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/.well-known/oauth-authorization-server",
      "status": 200,
      "bytes": 2213,
      "ms": 47,
      "contentType": "application/json",
      "hops": 0
    },
    {
      "path": "/.well-known/oauth-protected-resource",
      "status": 404,
      "bytes": 9,
      "ms": 250,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/.well-known/openid-configuration",
      "status": 200,
      "bytes": 2213,
      "ms": 49,
      "contentType": "application/json",
      "hops": 0
    },
    {
      "path": "/.well-known/api-catalog",
      "status": 200,
      "bytes": 405,
      "ms": 44,
      "contentType": "application/linkset+json",
      "hops": 0
    },
    {
      "path": "/api-catalog.json",
      "status": 200,
      "bytes": 2654112,
      "ms": 1301,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/.well-known/ai-plugin.json",
      "status": 404,
      "bytes": 9,
      "ms": 228,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-skills/index.json",
      "status": 200,
      "bytes": 5846,
      "ms": 42,
      "contentType": "application/json",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-skills.json",
      "status": 404,
      "bytes": 9,
      "ms": 359,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/.well-known/skills.json",
      "status": 404,
      "bytes": 9,
      "ms": 203,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/.well-known/security.txt",
      "status": 200,
      "bytes": 374,
      "ms": 39,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/security.txt",
      "status": 200,
      "bytes": 2563268,
      "ms": 1168,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/.well-known/webmcp.json",
      "status": 404,
      "bytes": 9,
      "ms": 244,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/.well-known/webmcp",
      "status": 404,
      "bytes": 9,
      "ms": 407,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/webmcp.json",
      "status": 200,
      "bytes": 2563222,
      "ms": 1608,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/.well-known/ard.json",
      "status": 404,
      "bytes": 9,
      "ms": 231,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/.well-known/agent-resources.json",
      "status": 404,
      "bytes": 9,
      "ms": 206,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/.well-known/ai-catalog.json",
      "status": 200,
      "bytes": 1410,
      "ms": 34,
      "contentType": "application/ai-catalog+json",
      "hops": 0
    },
    {
      "path": "/ard.json",
      "status": 200,
      "bytes": 2608436,
      "ms": 1389,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/.well-known/ucp",
      "status": 404,
      "bytes": 9,
      "ms": 231,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/.well-known/ucp.json",
      "status": 404,
      "bytes": 9,
      "ms": 181,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/openapi.json",
      "status": 200,
      "bytes": 3145752,
      "ms": 96,
      "contentType": "application/json",
      "hops": 0
    },
    {
      "path": "/openapi.yaml",
      "status": 200,
      "bytes": 2517966,
      "ms": 1016,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/.well-known/openapi.json",
      "status": 404,
      "bytes": 9,
      "ms": 238,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/api/openapi.json",
      "status": 404,
      "bytes": 84,
      "ms": 282,
      "contentType": "application/json",
      "hops": 0
    },
    {
      "path": "/swagger.json",
      "status": 200,
      "bytes": 2608600,
      "ms": 1476,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/.well-known/ai",
      "status": 404,
      "bytes": 9,
      "ms": 405,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/api",
      "status": 200,
      "bytes": 1738360,
      "ms": 1658,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/bot",
      "status": 200,
      "bytes": 333708,
      "ms": 642,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/bots",
      "status": 200,
      "bytes": 333708,
      "ms": 958,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/agents",
      "status": 200,
      "bytes": 504540,
      "ms": 326,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/agent",
      "status": 200,
      "bytes": 608806,
      "ms": 72,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/agent-policy",
      "status": 200,
      "bytes": 333744,
      "ms": 897,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/agentic-commerce",
      "status": 200,
      "bytes": 333760,
      "ms": 943,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/terms",
      "status": 200,
      "bytes": 793158,
      "ms": 108,
      "contentType": "text/html",
      "hops": 1
    },
    {
      "path": "/pricing",
      "status": 200,
      "bytes": 1226939,
      "ms": 58,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/fiyatlandirma",
      "status": 200,
      "bytes": 333748,
      "ms": 1127,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/fiyat",
      "status": 200,
      "bytes": 333716,
      "ms": 755,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/plans",
      "status": 200,
      "bytes": 333716,
      "ms": 1125,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/contact",
      "status": 200,
      "bytes": 440449,
      "ms": 211,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/iletisim",
      "status": 200,
      "bytes": 333724,
      "ms": 1118,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/contact-us",
      "status": 200,
      "bytes": 333736,
      "ms": 948,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/faq",
      "status": 200,
      "bytes": 333708,
      "ms": 757,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/sss",
      "status": 200,
      "bytes": 333708,
      "ms": 872,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/sikca-sorulan-sorular",
      "status": 200,
      "bytes": 333780,
      "ms": 922,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/help",
      "status": 200,
      "bytes": 307004,
      "ms": 257,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/yardim",
      "status": 200,
      "bytes": 333720,
      "ms": 961,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/docs",
      "status": 200,
      "bytes": 869642,
      "ms": 770,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/documentation",
      "status": 200,
      "bytes": 869642,
      "ms": 756,
      "contentType": "text/html",
      "hops": 1
    },
    {
      "path": "/developers",
      "status": 200,
      "bytes": 333736,
      "ms": 816,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/gelistiriciler",
      "status": 200,
      "bytes": 333752,
      "ms": 570,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/status",
      "status": 200,
      "bytes": 333720,
      "ms": 664,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/changelog",
      "status": 200,
      "bytes": 557712,
      "ms": 221,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/releases",
      "status": 200,
      "bytes": 333728,
      "ms": 878,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/whats-new",
      "status": 200,
      "bytes": 333732,
      "ms": 1276,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/returns",
      "status": 200,
      "bytes": 333724,
      "ms": 1084,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/shipping",
      "status": 200,
      "bytes": 333728,
      "ms": 588,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/iade",
      "status": 200,
      "bytes": 333710,
      "ms": 943,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/kargo",
      "status": 200,
      "bytes": 333716,
      "ms": 559,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/refund-policy",
      "status": 200,
      "bytes": 333748,
      "ms": 835,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/about",
      "status": 200,
      "bytes": 555152,
      "ms": 141,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/products",
      "status": 200,
      "bytes": 2563033,
      "ms": 1481,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/shop",
      "status": 200,
      "bytes": 2562843,
      "ms": 1424,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/store",
      "status": 404,
      "bytes": 265052,
      "ms": 190,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/urunler",
      "status": 200,
      "bytes": 333724,
      "ms": 588,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/magaza",
      "status": 200,
      "bytes": 333720,
      "ms": 631,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/cart",
      "status": 200,
      "bytes": 333712,
      "ms": 980,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/sepet",
      "status": 200,
      "bytes": 333712,
      "ms": 899,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/docs/sandbox",
      "status": 200,
      "bytes": 971965,
      "ms": 758,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/sandbox",
      "status": 200,
      "bytes": 920114,
      "ms": 78,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/developers/sandbox",
      "status": 200,
      "bytes": 2641741,
      "ms": 1118,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/rate-limits.json",
      "status": 200,
      "bytes": 2563489,
      "ms": 1197,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/.well-known/rate-limits.json",
      "status": 404,
      "bytes": 9,
      "ms": 374,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/docs/rate-limits",
      "status": 404,
      "bytes": 264371,
      "ms": 62,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/licensing",
      "status": 200,
      "bytes": 333732,
      "ms": 948,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/.well-known/tdmrep.json",
      "status": 404,
      "bytes": 9,
      "ms": 474,
      "contentType": "text/plain",
      "hops": 0
    },
    {
      "path": "/book",
      "status": 200,
      "bytes": 333712,
      "ms": 731,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/appointment",
      "status": 200,
      "bytes": 333740,
      "ms": 421,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/documents",
      "status": 200,
      "bytes": 333732,
      "ms": 940,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/publications",
      "status": 200,
      "bytes": 333744,
      "ms": 831,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/reports",
      "status": 200,
      "bytes": 333724,
      "ms": 959,
      "contentType": "text/html",
      "hops": 2
    },
    {
      "path": "/get-started.md",
      "status": 200,
      "bytes": 7704,
      "ms": 57,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/docs/getting-started-with-vercel.md",
      "status": 200,
      "bytes": 9605,
      "ms": 220,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/docs/agent-resources/vercel-plugin.md",
      "status": 200,
      "bytes": 17243,
      "ms": 399,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/docs/agent-resources/skills.md",
      "status": 200,
      "bytes": 15161,
      "ms": 348,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/docs/products.md",
      "status": 200,
      "bytes": 2302,
      "ms": 326,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/docs/sitemap.md",
      "status": 200,
      "bytes": 475994,
      "ms": 744,
      "contentType": "text/markdown",
      "hops": 0
    },
    {
      "path": "/docs/frameworks/full-stack/nuxt",
      "status": 200,
      "bytes": 1623253,
      "ms": 800,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/docs/frameworks/full-stack/sveltekit",
      "status": 200,
      "bytes": 1588327,
      "ms": 881,
      "contentType": "text/html",
      "hops": 0
    },
    {
      "path": "/",
      "status": 200,
      "bytes": 1762,
      "ms": 223,
      "contentType": "text/markdown",
      "hops": 0
    }
  ]
}