{
  "sample": true,
  "notice": "SAMPLE DATA. Relaykit is a fictional company; these numbers are illustrative, not measurements.",
  "workspace": {
    "name": "Relaykit",
    "slug": "demo",
    "product": "Relaykit"
  },
  "period": {
    "start": "2026-10-19",
    "end": "2026-10-25",
    "label": "Oct 19 – Oct 25, 2026"
  },
  "generated_at": "2026-10-27T08:00:00.000Z",
  "method_version": "found-v2 · used-v4 · fix-v1",
  "notes": [
    "Rates are fractions from 0 to 1. ci_lo/ci_hi are the Wilson 95% range.",
    "null means unknown, never zero; null_reason says why. too_few_n means the sample is below our minimum, so the value is withheld.",
    "Assistant results come from the official APIs, not the consumer apps."
  ],
  "headline": [
    "It worked: Unblock OAI-SearchBot — share of OpenAI bot requests you blocked went from 16% to 0% (n=43), a real change, not week-to-week wobble.",
    "Assistants cited you in 24% of 600 answers, about the same as last week (+3 pts, too small to call).",
    "The biggest leak: Courierly was cited in 57% of 600 answers; you in 24%."
  ],
  "metrics": [
    {
      "key": "found.cited_in_questions",
      "label": "Buyer questions where an assistant cited you",
      "module": "found",
      "unit": "count",
      "value": 5,
      "n": 30,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-25"
    },
    {
      "key": "found.top_competitor.cited_in_questions",
      "label": "Buyer questions citing your top competitor (Courierly)",
      "module": "found",
      "unit": "count",
      "value": 20,
      "n": 30,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-25"
    },
    {
      "key": "found.assistants_answered",
      "label": "Assistants that answered",
      "module": "found",
      "unit": "count",
      "value": 5,
      "n": 5,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-25"
    },
    {
      "key": "found.cited_rate.claude",
      "label": "Claude: share of answers citing you",
      "module": "found",
      "unit": "rate",
      "value": 0.23333333333333336,
      "n": 120,
      "ci_lo": 0.16665469513089648,
      "ci_hi": 0.31655611609893264,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-25"
    },
    {
      "key": "found.cited_rate.openai",
      "label": "ChatGPT: share of answers citing you",
      "module": "found",
      "unit": "rate",
      "value": 0.23333333333333336,
      "n": 120,
      "ci_lo": 0.16665469513089648,
      "ci_hi": 0.31655611609893264,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-25"
    },
    {
      "key": "found.cited_rate.gemini",
      "label": "Gemini: share of answers citing you",
      "module": "found",
      "unit": "rate",
      "value": 0.275,
      "n": 120,
      "ci_lo": 0.2030277984147616,
      "ci_hi": 0.3609313235604068,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-25"
    },
    {
      "key": "found.cited_rate.grok",
      "label": "Grok: share of answers citing you",
      "module": "found",
      "unit": "rate",
      "value": 0.21666666666666667,
      "n": 120,
      "ci_lo": 0.15236622842757383,
      "ci_hi": 0.2985452585041196,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-25"
    },
    {
      "key": "found.cited_rate.perplexity",
      "label": "Perplexity: share of answers citing you",
      "module": "found",
      "unit": "rate",
      "value": 0.21666666666666667,
      "n": 120,
      "ci_lo": 0.15236622842757383,
      "ci_hi": 0.2985452585041196,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-25"
    },
    {
      "key": "used.fulfilled_rate",
      "label": "Agent calls that got what they needed",
      "module": "used",
      "unit": "rate",
      "value": 0.75,
      "n": 32,
      "ci_lo": 0.5789310822975338,
      "ci_hi": 0.8674775601737845,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.funnel.discovered",
      "label": "Agents that discovered you",
      "module": "used",
      "unit": "count",
      "value": 17,
      "n": 17,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.funnel.connected",
      "label": "Agents that connected",
      "module": "used",
      "unit": "count",
      "value": 3,
      "n": 17,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.funnel.called",
      "label": "Agents that called a tool or endpoint",
      "module": "used",
      "unit": "count",
      "value": 3,
      "n": 17,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.funnel.got_data",
      "label": "Agents that got data back",
      "module": "used",
      "unit": "count",
      "value": 3,
      "n": 17,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.funnel.came_back",
      "label": "Agents that came back later",
      "module": "used",
      "unit": "count",
      "value": 3,
      "n": 17,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.claude_code.connected",
      "label": "Claude Code: connected",
      "module": "used",
      "unit": "count",
      "value": 4,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.claude_code.called",
      "label": "Claude Code: called",
      "module": "used",
      "unit": "count",
      "value": 4,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.claude_code.got_data",
      "label": "Claude Code: got data",
      "module": "used",
      "unit": "count",
      "value": 4,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.claude_code.came_back",
      "label": "Claude Code: came back",
      "module": "used",
      "unit": "count",
      "value": 4,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.cursor.connected",
      "label": "Cursor: connected",
      "module": "used",
      "unit": "count",
      "value": 3,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.cursor.called",
      "label": "Cursor: called",
      "module": "used",
      "unit": "count",
      "value": 3,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.cursor.got_data",
      "label": "Cursor: got data",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.cursor.came_back",
      "label": "Cursor: came back",
      "module": "used",
      "unit": "count",
      "value": 3,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.chatgpt_connector.connected",
      "label": "ChatGPT connector: connected",
      "module": "used",
      "unit": "count",
      "value": 2,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.chatgpt_connector.called",
      "label": "ChatGPT connector: called",
      "module": "used",
      "unit": "count",
      "value": 2,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.chatgpt_connector.got_data",
      "label": "ChatGPT connector: got data",
      "module": "used",
      "unit": "count",
      "value": 2,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.chatgpt_connector.came_back",
      "label": "ChatGPT connector: came back",
      "module": "used",
      "unit": "count",
      "value": 2,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.claude_cowork.connected",
      "label": "Claude Cowork: connected",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.claude_cowork.called",
      "label": "Claude Cowork: called",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.claude_cowork.got_data",
      "label": "Claude Cowork: got data",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.claude_cowork.came_back",
      "label": "Claude Cowork: came back",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.goose.connected",
      "label": "Goose: connected",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.goose.called",
      "label": "Goose: called",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.goose.got_data",
      "label": "Goose: got data",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.goose.came_back",
      "label": "Goose: came back",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.probably_muse.connected",
      "label": "Probably Muse: connected",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.probably_muse.called",
      "label": "Probably Muse: called",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.probably_muse.got_data",
      "label": "Probably Muse: got data",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.probably_muse.came_back",
      "label": "Probably Muse: came back",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.github_copilot.connected",
      "label": "GitHub Copilot: connected",
      "module": "used",
      "unit": "count",
      "value": 2,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.github_copilot.called",
      "label": "GitHub Copilot: called",
      "module": "used",
      "unit": "count",
      "value": 0,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.github_copilot.got_data",
      "label": "GitHub Copilot: got data",
      "module": "used",
      "unit": "count",
      "value": 0,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.github_copilot.came_back",
      "label": "GitHub Copilot: came back",
      "module": "used",
      "unit": "count",
      "value": 0,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.headless_chrome.connected",
      "label": "Headless Chrome: connected",
      "module": "used",
      "unit": "count",
      "value": 0,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.headless_chrome.called",
      "label": "Headless Chrome: called",
      "module": "used",
      "unit": "count",
      "value": 0,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.headless_chrome.got_data",
      "label": "Headless Chrome: got data",
      "module": "used",
      "unit": "count",
      "value": 0,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.headless_chrome.came_back",
      "label": "Headless Chrome: came back",
      "module": "used",
      "unit": "count",
      "value": 0,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.signed_agent_from_cloud_example_net.connected",
      "label": "Signed agent from cloud.example.net: connected",
      "module": "used",
      "unit": "count",
      "value": 0,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.signed_agent_from_cloud_example_net.called",
      "label": "Signed agent from cloud.example.net: called",
      "module": "used",
      "unit": "count",
      "value": 0,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.signed_agent_from_cloud_example_net.got_data",
      "label": "Signed agent from cloud.example.net: got data",
      "module": "used",
      "unit": "count",
      "value": 0,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.client.signed_agent_from_cloud_example_net.came_back",
      "label": "Signed agent from cloud.example.net: came back",
      "module": "used",
      "unit": "count",
      "value": 0,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.oai_searchbot.requests",
      "label": "OAI-SearchBot: requests",
      "module": "used",
      "unit": "count",
      "value": 24,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.oai_searchbot.refused_rate",
      "label": "OAI-SearchBot: share of requests refused (403/429)",
      "module": "used",
      "unit": "rate",
      "value": 0,
      "n": 24,
      "ci_lo": 0,
      "ci_hi": 0.13798057582897535,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.chatgpt_user.requests",
      "label": "ChatGPT-User: requests",
      "module": "used",
      "unit": "count",
      "value": 14,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.chatgpt_user.refused_rate",
      "label": "ChatGPT-User: share of requests refused (403/429)",
      "module": "used",
      "unit": "rate",
      "value": 0,
      "n": 14,
      "ci_lo": 0,
      "ci_hi": 0.21531701192718145,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.googlebot.requests",
      "label": "Googlebot: requests",
      "module": "used",
      "unit": "count",
      "value": 14,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.googlebot.refused_rate",
      "label": "Googlebot: share of requests refused (403/429)",
      "module": "used",
      "unit": "rate",
      "value": 0,
      "n": 14,
      "ci_lo": 0,
      "ci_hi": 0.21531701192718145,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.perplexitybot.requests",
      "label": "PerplexityBot: requests",
      "module": "used",
      "unit": "count",
      "value": 14,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.perplexitybot.refused_rate",
      "label": "PerplexityBot: share of requests refused (403/429)",
      "module": "used",
      "unit": "rate",
      "value": 0,
      "n": 14,
      "ci_lo": 0,
      "ci_hi": 0.21531701192718145,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.perplexitybot_not_verified.requests",
      "label": "PerplexityBot (not verified): requests",
      "module": "used",
      "unit": "count",
      "value": 14,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.perplexitybot_not_verified.refused_rate",
      "label": "PerplexityBot (not verified): share of requests refused (403/429)",
      "module": "used",
      "unit": "rate",
      "value": null,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": "no_data",
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.claudebot.requests",
      "label": "ClaudeBot: requests",
      "module": "used",
      "unit": "count",
      "value": 12,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.claudebot.refused_rate",
      "label": "ClaudeBot: share of requests refused (403/429)",
      "module": "used",
      "unit": "rate",
      "value": 0,
      "n": 12,
      "ci_lo": 0,
      "ci_hi": 0.2425007574992425,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.gptbot.requests",
      "label": "GPTBot: requests",
      "module": "used",
      "unit": "count",
      "value": 12,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.gptbot.refused_rate",
      "label": "GPTBot: share of requests refused (403/429)",
      "module": "used",
      "unit": "rate",
      "value": 0,
      "n": 12,
      "ci_lo": 0,
      "ci_hi": 0.2425007574992425,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.claude_searchbot.requests",
      "label": "Claude-SearchBot: requests",
      "module": "used",
      "unit": "count",
      "value": 10,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.claude_searchbot.refused_rate",
      "label": "Claude-SearchBot: share of requests refused (403/429)",
      "module": "used",
      "unit": "rate",
      "value": 0,
      "n": 10,
      "ci_lo": 0,
      "ci_hi": 0.2775401687666166,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.claude_user.requests",
      "label": "Claude-User: requests",
      "module": "used",
      "unit": "count",
      "value": 8,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.claude_user.refused_rate",
      "label": "Claude-User: share of requests refused (403/429)",
      "module": "used",
      "unit": "rate",
      "value": null,
      "n": 8,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": "no_data",
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.perplexity_user.requests",
      "label": "Perplexity-User: requests",
      "module": "used",
      "unit": "count",
      "value": 8,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.perplexity_user.refused_rate",
      "label": "Perplexity-User: share of requests refused (403/429)",
      "module": "used",
      "unit": "rate",
      "value": null,
      "n": 8,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": "no_data",
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.applebot.requests",
      "label": "Applebot: requests",
      "module": "used",
      "unit": "count",
      "value": 6,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.applebot.refused_rate",
      "label": "Applebot: share of requests refused (403/429)",
      "module": "used",
      "unit": "rate",
      "value": null,
      "n": 6,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": "no_data",
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.bingbot.requests",
      "label": "bingbot: requests",
      "module": "used",
      "unit": "count",
      "value": 6,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.crawler.bingbot.refused_rate",
      "label": "bingbot: share of requests refused (403/429)",
      "module": "used",
      "unit": "rate",
      "value": null,
      "n": 6,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": "no_data",
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.unfulfilled.get_delivery_status.empty",
      "label": "get_delivery_status: agents that got empty",
      "module": "used",
      "unit": "count",
      "value": 2,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.unfulfilled.search_docs.empty",
      "label": "search_docs: agents that got empty",
      "module": "used",
      "unit": "count",
      "value": 2,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.unfulfilled.list_domains.error",
      "label": "list_domains: agents that got error",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.unfulfilled.list_templates.error",
      "label": "list_templates: agents that got error",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.unfulfilled.send_email.rejected",
      "label": "send_email: agents that got rejected",
      "module": "used",
      "unit": "count",
      "value": 1,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.noise_excluded.total",
      "label": "Requests removed as noise",
      "module": "used",
      "unit": "count",
      "value": 74,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.noise_excluded.discovery_sweep",
      "label": "Removed as noise: discovery sweep",
      "module": "used",
      "unit": "count",
      "value": 12,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.noise_excluded.probe",
      "label": "Removed as noise: probe",
      "module": "used",
      "unit": "count",
      "value": 5,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.noise_excluded.enumeration",
      "label": "Removed as noise: enumeration",
      "module": "used",
      "unit": "count",
      "value": 9,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.noise_excluded.list_sweep",
      "label": "Removed as noise: list sweep",
      "module": "used",
      "unit": "count",
      "value": 6,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.noise_excluded.spoofed",
      "label": "Removed as noise: spoofed",
      "module": "used",
      "unit": "count",
      "value": 28,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.noise_excluded.own",
      "label": "Removed as noise: own",
      "module": "used",
      "unit": "count",
      "value": 14,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.ai_referred.visits",
      "label": "Visits sent by AI assistants",
      "module": "used",
      "unit": "count",
      "value": 36,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    },
    {
      "key": "used.ai_referred.signups",
      "label": "Signups sent by AI assistants",
      "module": "used",
      "unit": "count",
      "value": 6,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "used-v4",
      "date": "2026-10-25"
    }
  ],
  "read_not_cited": [
    {
      "question": "What email API documentation is easiest for coding agents to read?",
      "engine": "claude",
      "cited_instead": [
        "news.ycombinator.com",
        "reddit.com",
        "registry.modelcontextprotocol.io"
      ],
      "reason": "Claude read relaykit.example but cited news.ycombinator.com, reddit.com and registry.modelcontextprotocol.io."
    },
    {
      "question": "Which email API has the simplest developer experience?",
      "engine": "claude",
      "cited_instead": [
        "reddit.com",
        "devtoolsdigest.example"
      ],
      "reason": "Claude read docs.relaykit.example/quickstart but cited reddit.com and devtoolsdigest.example."
    },
    {
      "question": "Compare transactional email APIs by pricing and deliverability",
      "engine": "claude",
      "cited_instead": [
        "courierly.example",
        "emailtools.example"
      ],
      "reason": "Claude read relaykit.example/pricing but cited courierly.example and emailtools.example."
    },
    {
      "question": "Are there email APIs with no monthly minimum?",
      "engine": "claude",
      "cited_instead": [
        "courierly.example",
        "sendwright.example",
        "mailforge.example",
        "devtoolsdigest.example"
      ],
      "reason": "Claude read relaykit.example/pricing but cited courierly.example, sendwright.example and mailforge.example."
    },
    {
      "question": "How do I verify a sending domain with SPF, DKIM and DMARC?",
      "engine": "claude",
      "cited_instead": [
        "courierly.example",
        "docs.python.org"
      ],
      "reason": "Claude read docs.relaykit.example/quickstart but cited courierly.example and docs.python.org."
    },
    {
      "question": "What email API documentation is easiest for coding agents to read?",
      "engine": "gemini",
      "cited_instead": [
        "github.com",
        "sendwright.example"
      ],
      "reason": "Gemini read github.com/relaykit/relaykit-node but cited github.com and sendwright.example."
    }
  ],
  "fixes": [
    {
      "rank": 1,
      "title": "Make docs.relaykit.example/quickstart worth citing",
      "why": "Claude, Gemini and Grok read docs.relaykit.example/quickstart in 9 of 360 answers and cited courierly.example, devtoolsdigest.example and docs.python.org instead. A page that answers the buyer question in its first lines, with specifics and a clear date, gets cited more.",
      "owner": "agent",
      "effort": "m",
      "verify_by": "2026-11-24",
      "steps": [
        "Open docs.relaykit.example/quickstart. Claude, Gemini and Grok read it and still cited courierly.example, devtoolsdigest.example and docs.python.org for the same questions.",
        "Add one heading per question and answer it in the first two sentences under it, starting with: \"Which email API has the simplest developer experience?\"; \"How do I verify a sending domain with SPF, DKIM and DMARC?\"; \"Best email API with a generous free tier for side projects\".",
        "Under each answer put the specifics a buyer checks (limits, prices, versions, one example request) in plain text, and show a last-updated date on the page.",
        "Serve the same page as markdown (docs.relaykit.example/quickstart.md, or on Accept: text/markdown) so coding agents get clean text.",
        "Re-check in 28 days: we compare how many answers read this page and still cite someone else."
      ],
      "how": "1. Open docs.relaykit.example/quickstart. Claude, Gemini and Grok read it and still cited courierly.example, devtoolsdigest.example and docs.python.org for the same questions.\n2. Add one heading per question and answer it in the first two sentences under it, starting with: \"Which email API has the simplest developer experience?\"; \"How do I verify a sending domain with SPF, DKIM and DMARC?\"; \"Best email API with a generous free tier for side projects\".\n3. Under each answer put the specifics a buyer checks (limits, prices, versions, one example request) in plain text, and show a last-updated date on the page.\n4. Serve the same page as markdown (docs.relaykit.example/quickstart.md, or on Accept: text/markdown) so coding agents get clean text.\n5. Re-check in 28 days: we compare how many answers read this page and still cite someone else.",
      "patch": {
        "kind": "answer_block",
        "target": "https://docs.relaykit.example/quickstart",
        "language": "markdown",
        "content": "## Which email API has the simplest developer experience?\n\nA transactional email API for developers.\n",
        "note": "Add this block near the top of /quickstart, under the page's main heading. The sentences are copied from your own pages. Your pages never mention: has, simplest, experience. Check every claim, and keep the question as the heading."
      },
      "snippet": {
        "language": "markdown",
        "code": "## Which email API has the simplest developer experience?\n\nA transactional email API for developers.\n"
      },
      "evidence": [
        "Page: docs.relaykit.example/quickstart",
        "Claude read your pages but cited someone else: 10 of 120 answers",
        "Gemini read your pages but cited someone else: 13 of 120 answers",
        "Grok read your pages but cited someone else: 11 of 120 answers",
        "Cited instead: courierly.example, devtoolsdigest.example and docs.python.org",
        "Example question: Which email API has the simplest developer experience?",
        "Example question: How do I verify a sending domain with SPF, DKIM and DMARC?"
      ],
      "method_version": "fix-v1"
    },
    {
      "rank": 2,
      "title": "Make github.com/relaykit/relaykit-node worth citing",
      "why": "Claude, ChatGPT, Gemini and Perplexity read github.com/relaykit/relaykit-node in 12 of 480 answers and cited github.com, postlane.example and courierly.example instead. A page that answers the buyer question in its first lines, with specifics and a clear date, gets cited more.",
      "owner": "agent",
      "effort": "m",
      "verify_by": "2026-11-16",
      "steps": [
        "Open github.com/relaykit/relaykit-node. Claude, ChatGPT, Gemini and Perplexity read it and still cited github.com, postlane.example and courierly.example for the same questions.",
        "Add one heading per question and answer it in the first two sentences under it, starting with: \"How do I test transactional email in CI without sending real messages?\"; \"Which email API works with AI agents through an MCP server?\"; \"How do I receive inbound email in my application through an API?\".",
        "Under each answer put the specifics a buyer checks (limits, prices, versions, one example request) in plain text, and show a last-updated date on the page.",
        "Re-check in 28 days: we compare how many answers read this page and still cite someone else."
      ],
      "how": "1. Open github.com/relaykit/relaykit-node. Claude, ChatGPT, Gemini and Perplexity read it and still cited github.com, postlane.example and courierly.example for the same questions.\n2. Add one heading per question and answer it in the first two sentences under it, starting with: \"How do I test transactional email in CI without sending real messages?\"; \"Which email API works with AI agents through an MCP server?\"; \"How do I receive inbound email in my application through an API?\".\n3. Under each answer put the specifics a buyer checks (limits, prices, versions, one example request) in plain text, and show a last-updated date on the page.\n4. Re-check in 28 days: we compare how many answers read this page and still cite someone else.",
      "patch": {
        "kind": "answer_block",
        "target": "https://relaykit.example",
        "language": "markdown",
        "content": "## Which email API works with AI agents through an MCP server?\n\nSend receipts, password resets and alerts with one request, with delivery webhooks and an MCP server for AI agents.\n",
        "note": "Add this block near the top of /, under the page's main heading. The sentences are copied from your own pages. Your pages never mention: works, through. Check every claim, and keep the question as the heading."
      },
      "snippet": {
        "language": "markdown",
        "code": "## Which email API works with AI agents through an MCP server?\n\nSend receipts, password resets and alerts with one request, with delivery webhooks and an MCP server for AI agents.\n"
      },
      "evidence": [
        "Page: github.com/relaykit/relaykit-node",
        "Claude read your pages but cited someone else: 14 of 120 answers",
        "ChatGPT read your pages but cited someone else: 12 of 120 answers",
        "Gemini read your pages but cited someone else: 11 of 120 answers",
        "Perplexity read your pages but cited someone else: 10 of 120 answers",
        "Cited instead: github.com, postlane.example and courierly.example",
        "Example question: How do I test transactional email in CI without sending real messages?",
        "Example question: Which email API works with AI agents through an MCP server?"
      ],
      "method_version": "fix-v1"
    },
    {
      "rank": 3,
      "title": "Make relaykit.example worth citing",
      "why": "Claude, ChatGPT, Gemini and Perplexity read relaykit.example in 15 of 480 answers and cited courierly.example, mailforge.example and news.ycombinator.com instead. A page that answers the buyer question in its first lines, with specifics and a clear date, gets cited more.",
      "owner": "agent",
      "effort": "m",
      "verify_by": "2026-11-16",
      "steps": [
        "Open relaykit.example. Claude, ChatGPT, Gemini and Perplexity read it and still cited courierly.example, mailforge.example and news.ycombinator.com for the same questions.",
        "Add one heading per question and answer it in the first two sentences under it, starting with: \"What email API documentation is easiest for coding agents to read?\"; \"Which email API has the simplest developer experience?\"; \"Can an AI coding agent set up transactional email for my project by itself?\".",
        "Under each answer put the specifics a buyer checks (limits, prices, versions, one example request) in plain text, and show a last-updated date on the page.",
        "Re-check in 28 days: we compare how many answers read this page and still cite someone else."
      ],
      "how": "1. Open relaykit.example. Claude, ChatGPT, Gemini and Perplexity read it and still cited courierly.example, mailforge.example and news.ycombinator.com for the same questions.\n2. Add one heading per question and answer it in the first two sentences under it, starting with: \"What email API documentation is easiest for coding agents to read?\"; \"Which email API has the simplest developer experience?\"; \"Can an AI coding agent set up transactional email for my project by itself?\".\n3. Under each answer put the specifics a buyer checks (limits, prices, versions, one example request) in plain text, and show a last-updated date on the page.\n4. Re-check in 28 days: we compare how many answers read this page and still cite someone else.",
      "patch": {
        "kind": "answer_block",
        "target": "https://docs.relaykit.example/quickstart",
        "language": "markdown",
        "content": "## Which email API has the simplest developer experience?\n\nA transactional email API for developers.\n",
        "note": "Add this block near the top of /quickstart, under the page's main heading. The sentences are copied from your own pages. Your pages never mention: has, simplest, experience. Check every claim, and keep the question as the heading."
      },
      "snippet": {
        "language": "markdown",
        "code": "## Which email API has the simplest developer experience?\n\nA transactional email API for developers.\n"
      },
      "evidence": [
        "Page: relaykit.example",
        "Claude read your pages but cited someone else: 10 of 120 answers",
        "ChatGPT read your pages but cited someone else: 12 of 120 answers",
        "Gemini read your pages but cited someone else: 13 of 120 answers",
        "Grok read your pages but cited someone else: 13 of 120 answers",
        "Perplexity read your pages but cited someone else: 14 of 120 answers",
        "Cited instead: courierly.example, devtoolsdigest.example and mailforge.example",
        "Example question: What email API documentation is easiest for coding agents to read?",
        "Example question: What is the best email API for sending transactional email from a Node.js app?"
      ],
      "method_version": "fix-v1"
    },
    {
      "rank": 4,
      "title": "Make relaykit.example/pricing worth citing",
      "why": "Claude, ChatGPT, Grok and Perplexity read relaykit.example/pricing in 21 of 480 answers and cited courierly.example, emailtools.example and reddit.com instead. A page that answers the buyer question in its first lines, with specifics and a clear date, gets cited more.",
      "owner": "agent",
      "effort": "m",
      "verify_by": "2026-11-16",
      "steps": [
        "Open relaykit.example/pricing. Claude, ChatGPT, Grok and Perplexity read it and still cited courierly.example, emailtools.example and reddit.com for the same questions.",
        "Add one heading per question and answer it in the first two sentences under it, starting with: \"Compare transactional email APIs by pricing and deliverability\"; \"Are there email APIs with no monthly minimum?\"; \"Which email API is best for a SaaS that needs custom sending domains per customer?\".",
        "Under each answer put the specifics a buyer checks (limits, prices, versions, one example request) in plain text, and show a last-updated date on the page.",
        "Re-check in 28 days: we compare how many answers read this page and still cite someone else."
      ],
      "how": "1. Open relaykit.example/pricing. Claude, ChatGPT, Grok and Perplexity read it and still cited courierly.example, emailtools.example and reddit.com for the same questions.\n2. Add one heading per question and answer it in the first two sentences under it, starting with: \"Compare transactional email APIs by pricing and deliverability\"; \"Are there email APIs with no monthly minimum?\"; \"Which email API is best for a SaaS that needs custom sending domains per customer?\".\n3. Under each answer put the specifics a buyer checks (limits, prices, versions, one example request) in plain text, and show a last-updated date on the page.\n4. Re-check in 28 days: we compare how many answers read this page and still cite someone else.",
      "patch": {
        "kind": "answer_block",
        "target": "https://docs.relaykit.example/quickstart",
        "language": "markdown",
        "content": "## Which email API has the simplest developer experience?\n\nA transactional email API for developers.\n",
        "note": "Add this block near the top of /quickstart, under the page's main heading. The sentences are copied from your own pages. Your pages never mention: has, simplest, experience. Check every claim, and keep the question as the heading."
      },
      "snippet": {
        "language": "markdown",
        "code": "## Which email API has the simplest developer experience?\n\nA transactional email API for developers.\n"
      },
      "evidence": [
        "Page: relaykit.example/pricing",
        "Claude read your pages but cited someone else: 10 of 120 answers",
        "ChatGPT read your pages but cited someone else: 12 of 120 answers",
        "Gemini read your pages but cited someone else: 11 of 120 answers",
        "Grok read your pages but cited someone else: 11 of 120 answers",
        "Perplexity read your pages but cited someone else: 14 of 120 answers",
        "Cited instead: courierly.example, emailtools.example and reddit.com",
        "Example question: Compare transactional email APIs by pricing and deliverability",
        "Example question: Are there email APIs with no monthly minimum?"
      ],
      "method_version": "fix-v1"
    },
    {
      "rank": 5,
      "title": "Make 3 more pages worth citing",
      "why": "ChatGPT, Gemini, Grok and Perplexity read docs.relaykit.example/mcp, docs.relaykit.example/webhooks and github.com/relaykit/relaykit-node in 15 of 480 answers and cited github.com, courierly.example and sendwright.example instead. A page that answers the buyer question in its first lines, with specifics and a clear date, gets cited more.",
      "owner": "agent",
      "effort": "m",
      "verify_by": "2026-11-16",
      "steps": [
        "Open docs.relaykit.example/mcp, docs.relaykit.example/webhooks and github.com/relaykit/relaykit-node. ChatGPT, Gemini, Grok and Perplexity read it and still cited github.com, courierly.example and sendwright.example for the same questions.",
        "Add one heading per question and answer it in the first two sentences under it, starting with: \"What email API documentation is easiest for coding agents to read?\"; \"Which email API works with AI agents through an MCP server?\"; \"How do I verify a sending domain with SPF, DKIM and DMARC?\".",
        "Under each answer put the specifics a buyer checks (limits, prices, versions, one example request) in plain text, and show a last-updated date on the page.",
        "Re-check in 28 days: we compare how many answers read this page and still cite someone else."
      ],
      "how": "1. Open docs.relaykit.example/mcp, docs.relaykit.example/webhooks and github.com/relaykit/relaykit-node. ChatGPT, Gemini, Grok and Perplexity read it and still cited github.com, courierly.example and sendwright.example for the same questions.\n2. Add one heading per question and answer it in the first two sentences under it, starting with: \"What email API documentation is easiest for coding agents to read?\"; \"Which email API works with AI agents through an MCP server?\"; \"How do I verify a sending domain with SPF, DKIM and DMARC?\".\n3. Under each answer put the specifics a buyer checks (limits, prices, versions, one example request) in plain text, and show a last-updated date on the page.\n4. Re-check in 28 days: we compare how many answers read this page and still cite someone else.",
      "patch": {
        "kind": "answer_block",
        "target": "https://relaykit.example",
        "language": "markdown",
        "content": "## Which email API has the simplest developer experience?\n\nA transactional email API for developers.\n",
        "note": "Add this block near the top of /, under the page's main heading. The sentences are copied from your own pages. Your pages never mention: has, simplest, experience. Check every claim, and keep the question as the heading."
      },
      "snippet": {
        "language": "markdown",
        "code": "## Which email API has the simplest developer experience?\n\nA transactional email API for developers.\n"
      },
      "evidence": [
        "ChatGPT read your pages but cited someone else: 12 of 120 answers",
        "Gemini read your pages but cited someone else: 13 of 120 answers",
        "Grok read your pages but cited someone else: 11 of 120 answers",
        "Perplexity read your pages but cited someone else: 14 of 120 answers"
      ],
      "method_version": "fix-v1"
    },
    {
      "rank": 6,
      "title": "Fix: Docs are available as markdown",
      "why": "Your docs only come as HTML on all 3 pages we sampled. Coding agents read markdown far more reliably.",
      "owner": "agent",
      "effort": "s",
      "verify_by": "2026-10-30",
      "steps": [
        "Start at https://docs.relaykit.example/. Serve each docs page as markdown at the same URL plus .md (we asked for https://docs.relaykit.example/index.md and did not get markdown).",
        "Also return markdown when a request sends the header Accept: text/markdown, with Content-Type: text/markdown; charset=utf-8, and add Vary: Accept so caches keep both versions apart.",
        "Keep code examples copy-paste ready in the markdown and say plainly what each endpoint is not for."
      ],
      "how": "1. Start at https://docs.relaykit.example/. Serve each docs page as markdown at the same URL plus .md (we asked for https://docs.relaykit.example/index.md and did not get markdown).\n2. Also return markdown when a request sends the header Accept: text/markdown, with Content-Type: text/markdown; charset=utf-8, and add Vary: Accept so caches keep both versions apart.\n3. Keep code examples copy-paste ready in the markdown and say plainly what each endpoint is not for.",
      "patch": {
        "kind": "markdown_route",
        "target": "/quickstart.md",
        "language": "ts",
        "content": "// Web-standard handler (Express/Hono/Deno/Bun/Workers): call it first in your request handler\nconst MARKDOWN = [\n  \"# Quickstart\",\n  \"\",\n  \"Install the SDK and send your first email.\",\n].join(\"\\n\") + \"\\n\";\nconst MD_PATH = \"/quickstart.md\";\nconst PAGE_PATH = \"/quickstart\";\n\nexport function markdownFor(request: Request): Response | null {\n  const url = new URL(request.url);\n  const wantsMd = request.headers.get(\"accept\")?.includes(\"text/markdown\") ?? false;\n  if (url.pathname === MD_PATH || (url.pathname === PAGE_PATH && wantsMd)) {\n    return new Response(MARKDOWN, { headers: { \"content-type\": \"text/markdown; charset=utf-8\", vary: \"accept\", \"cache-control\": \"public, max-age=3600\" } });\n  }\n  return null;\n}\n",
        "note": "Your docs only come as HTML. Serves /quickstart.md on docs.relaykit.example as text/markdown, with the page text drafted from the live page (links to other sites and text addressed to AI readers are left out). Written as a Web-standard handler; adapt the wrapper to your framework. Check the drafted markdown against the page before you ship it, and generate it from your source files so it never goes stale."
      },
      "snippet": {
        "language": "ts",
        "code": "// Web-standard handler (Express/Hono/Deno/Bun/Workers): call it first in your request handler\nconst MARKDOWN = [\n  \"# Quickstart\",\n  \"\",\n  \"Install the SDK and send your first email.\",\n].join(\"\\n\") + \"\\n\";\nconst MD_PATH = \"/quickstart.md\";\nconst PAGE_PATH = \"/quickstart\";\n\nexport function markdownFor(request: Request): Response | null {\n  const url = new URL(request.url);\n  const wantsMd = request.headers.get(\"accept\")?.includes(\"text/markdown\") ?? false;\n  if (url.pathname === MD_PATH || (url.pathname === PAGE_PATH && wantsMd)) {\n    return new Response(MARKDOWN, { headers: { \"content-type\": \"text/markdown; charset=utf-8\", vary: \"accept\", \"cache-control\": \"public, max-age=3600\" } });\n  }\n  return null;\n}\n"
      },
      "evidence": [
        "Docs are available as markdown: Your docs only come as HTML on all 3 pages we sampled. Coding agents read markdown far more reliably.",
        "What we saw: https://docs.relaykit.example/ -> html only (https://docs.relaykit.example/index.md -> 404); https://docs.relaykit.example/api-reference -> html only (https://docs.relaykit.example/api-reference.md -> 404); https://docs.relaykit.example/qu…",
        "Page: https://docs.relaykit.example/"
      ],
      "method_version": "fix-v1"
    },
    {
      "rank": 7,
      "title": "Block fake a search bot traffic",
      "why": "Requests pretending to be a search bot waste capacity and distort bot numbers. We exclude them from your results; you can also block them.",
      "owner": "human",
      "effort": "s",
      "verify_by": "2026-11-03",
      "steps": [
        "14 requests claimed to be a search bot (12.2% of everything using that name) from 2 network ranges the vendor does not use, ASN 64501.",
        "In your WAF, allow a User-Agent containing \"a search bot\" only from the IP ranges the vendor publishes for a search bot; challenge or block the rest.",
        "Do not block by user-agent text alone: the real bot has to stay allowed, and we already leave the fake requests out of your numbers."
      ],
      "how": "1. 14 requests claimed to be a search bot (12.2% of everything using that name) from 2 network ranges the vendor does not use, ASN 64501.\n2. In your WAF, allow a User-Agent containing \"a search bot\" only from the IP ranges the vendor publishes for a search bot; challenge or block the rest.\n3. Do not block by user-agent text alone: the real bot has to stay allowed, and we already leave the fake requests out of your numbers.",
      "patch": null,
      "snippet": null,
      "evidence": [
        "Fake bot requests: 14",
        "Share of that name's traffic: 12.2%",
        "Network ranges: 2"
      ],
      "method_version": "fix-v1"
    },
    {
      "rank": 8,
      "title": "Close the gap with Courierly on cited questions",
      "why": "Courierly is cited where you are not. Their pages answer these buyer questions; yours may not.",
      "owner": "cmo",
      "effort": "l",
      "verify_by": "2026-11-16",
      "steps": [
        "Courierly is cited in 343 of 600 answers, you in 141. Read what Courierly publishes for \"Email API versus running my own SMTP relay: which is better for a small team?\" (Claude, ChatGPT, Gemini, Grok and Perplexity); \"What should I look for in a transactional email provider?\" (Claude, ChatGPT, Gemini, Grok and Perplexity); \"What email API documentation is easiest for coding agents to read?\" (Claude, ChatGPT, Gemini, …",
        "Publish or rewrite your page for each of those questions so its first two sentences answer it, with your own numbers and limits.",
        "Link each page from your homepage and docs index so crawlers reach it in two clicks.",
        "Re-check in four weeks: we compare your share of citations on the same questions."
      ],
      "how": "1. Courierly is cited in 343 of 600 answers, you in 141. Read what Courierly publishes for \"Email API versus running my own SMTP relay: which is better for a small team?\" (Claude, ChatGPT, Gemini, Grok and Perplexity); \"What should I look for in a transactional email provider?\" (Claude, ChatGPT, Gemini, Grok and Perplexity); \"What email API documentation is easiest for coding agents to read?\" (Claude, ChatGPT, Gemini, …\n2. Publish or rewrite your page for each of those questions so its first two sentences answer it, with your own numbers and limits.\n3. Link each page from your homepage and docs index so crawlers reach it in two clicks.\n4. Re-check in four weeks: we compare your share of citations on the same questions.",
      "patch": {
        "kind": "answer_block",
        "target": "https://relaykit.example",
        "language": "markdown",
        "content": "## What should I look for in a transactional email provider?\n\nA transactional email API for developers.\n",
        "note": "Add this block near the top of /, under the page's main heading. The sentences are copied from your own pages. Your pages never mention: look, provider. Check every claim, and keep the question as the heading."
      },
      "snippet": {
        "language": "markdown",
        "code": "## What should I look for in a transactional email provider?\n\nA transactional email API for developers.\n"
      },
      "evidence": [
        "Answers citing Courierly: 343 of 600",
        "Answers citing you: 141 of 600",
        "Question: Email API versus running my own SMTP relay: which is better for a small team? (Claude, ChatGPT, Gemini, Grok and Perplexity)",
        "Question: What should I look for in a transactional email provider? (Claude, ChatGPT, Gemini, Grok and Perplexity)"
      ],
      "method_version": "fix-v1"
    },
    {
      "rank": 9,
      "title": "Close the gap with Sendwright on cited questions",
      "why": "Sendwright is cited where you are not. Their pages answer these buyer questions; yours may not.",
      "owner": "cmo",
      "effort": "l",
      "verify_by": "2026-11-16",
      "steps": [
        "Sendwright is cited in 180 of 600 answers, you in 123. Read what Sendwright publishes for \"Is it worth paying for a dedicated IP with an email API?\" (Claude, ChatGPT, Gemini and Perplexity); \"Which email API works with AI agents through an MCP server?\" (Claude, Gemini and Perplexity).",
        "Publish or rewrite your page for each of those questions so its first two sentences answer it, with your own numbers and limits.",
        "Link each page from your homepage and docs index so crawlers reach it in two clicks.",
        "Re-check in four weeks: we compare your share of citations on the same questions."
      ],
      "how": "1. Sendwright is cited in 180 of 600 answers, you in 123. Read what Sendwright publishes for \"Is it worth paying for a dedicated IP with an email API?\" (Claude, ChatGPT, Gemini and Perplexity); \"Which email API works with AI agents through an MCP server?\" (Claude, Gemini and Perplexity).\n2. Publish or rewrite your page for each of those questions so its first two sentences answer it, with your own numbers and limits.\n3. Link each page from your homepage and docs index so crawlers reach it in two clicks.\n4. Re-check in four weeks: we compare your share of citations on the same questions.",
      "patch": {
        "kind": "answer_block",
        "target": "https://relaykit.example",
        "language": "markdown",
        "content": "## Which email API works with AI agents through an MCP server?\n\nSend receipts, password resets and alerts with one request, with delivery webhooks and an MCP server for AI agents.\n",
        "note": "Add this block near the top of /, under the page's main heading. The sentences are copied from your own pages. Your pages never mention: works, through. Check every claim, and keep the question as the heading."
      },
      "snippet": {
        "language": "markdown",
        "code": "## Which email API works with AI agents through an MCP server?\n\nSend receipts, password resets and alerts with one request, with delivery webhooks and an MCP server for AI agents.\n"
      },
      "evidence": [
        "Answers citing Sendwright: 180 of 600",
        "Answers citing you: 123 of 600",
        "Question: Is it worth paying for a dedicated IP with an email API? (Claude, ChatGPT, Gemini and Perplexity)",
        "Question: Which email API works with AI agents through an MCP server? (Claude, Gemini and Perplexity)"
      ],
      "method_version": "fix-v1"
    }
  ],
  "last_week": [
    {
      "title": "Block fake PerplexityBot traffic",
      "status": "failed",
      "note": "It went the wrong way: Requests pretending to be an AI bot moved from 14 to 26.",
      "statusSetBy": "primetra",
      "statusSetAt": "2026-10-19T10:00:00.000Z"
    },
    {
      "title": "Unblock OAI-SearchBot",
      "status": "verified",
      "note": "It worked: Share of OpenAI bot requests you blocked went from 16% to 0% (n=43), a real change, not week-to-week wobble.",
      "statusSetBy": "you",
      "statusSetAt": "2026-10-19T10:00:00.000Z"
    }
  ]
}
