{
 "openapi": "3.1.0",
 "info": {
  "title": "Agent Ready Checkout API",
  "version": "1.0.0",
  "summary": "Read-only API, MCP server and NLWeb endpoint over the datasets of agentreadycheckout.com.",
  "description": "the Protocol Support Matrix (12 agent payment protocols against 27 processors, platforms, retailers and agent surfaces, 324 cells, each with a status, a note, a source URL and a read date), the liability and rules tracker (23 dated rows from card networks and frameworks, each with the document, the page and who carries the dispute) and the share of probed domains that serve a commerce discovery file, from a shared crawl.\n\nAccess: every endpoint is public and read-only; there is no API key, no OAuth and no scope, because nothing here can be written or belongs to a user. Rate limit: 120 requests a minute per client address, announced in RateLimit and RateLimit-Policy headers; a 429 carries Retry-After. Errors are JSON ({\"error\":{\"code\",\"message\",\"hint\",\"status\",\"docs\"}}), never HTML. Versioning: the path prefix /api/v1 is the contract; a breaking change ships under /api/v2 with the old prefix kept for at least 180 days and announced on https://agentreadycheckout.vercel.app/developers and in this document's info.version. Additive changes (new fields, new tools) do not change the prefix. Idempotency: every operation is a read, so retries are safe and no idempotency key exists. Long-running operations: none; every call answers in one response. Data edition: 2026-11-04; the same rows are downloadable whole from /data/.",
  "license": {
   "name": "CC BY 4.0",
   "url": "https://creativecommons.org/licenses/by/4.0/"
  },
  "x-authentication": "none",
  "x-rate-limit": {
   "requests": 120,
   "window_seconds": 60,
   "headers": [
    "RateLimit",
    "RateLimit-Policy",
    "Retry-After"
   ]
  },
  "x-versioning-policy": {
   "current": "v1",
   "breaking_changes": "new path prefix, old prefix kept for 180 days",
   "announcements": "https://agentreadycheckout.vercel.app/developers"
  },
  "x-idempotency": "all operations are reads; retries are safe",
  "x-dataset-edition": "2026-11-04"
 },
 "externalDocs": {
  "description": "API and MCP server documentation",
  "url": "https://agentreadycheckout.vercel.app/developers"
 },
 "servers": [
  {
   "url": "https://agentreadycheckout.vercel.app",
   "description": "The host that serves this surface today; page and dataset URLs in the answers stay on https://agentreadycheckout.com"
  }
 ],
 "tags": [
  {
   "name": "tools",
   "description": "One GET endpoint per MCP tool."
  },
  {
   "name": "nlweb",
   "description": "NLWeb 0.55 ask endpoint."
  },
  {
   "name": "downloads",
   "description": "Whole-dataset files."
  },
  {
   "name": "index"
  }
 ],
 "security": [],
 "paths": {
  "/api": {
   "get": {
    "operationId": "getApiIndex",
    "tags": [
     "index"
    ],
    "summary": "API index",
    "description": "Links to every endpoint, dataset download, the OpenAPI document, the MCP server and the NLWeb endpoint, plus the rate limit and the versioning policy.",
    "responses": {
     "200": {
      "description": "The index.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ApiIndex"
        }
       }
      }
     },
     "429": {
      "description": "More than the published rate limit; Retry-After says when to try again.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/get_matrix_cell": {
   "get": {
    "operationId": "get_matrix_cell",
    "tags": [
     "tools"
    ],
    "summary": "One matrix cell",
    "description": "Returns one cell of the protocol support matrix: the status (live, pilot, announced, not supported or no statement found), what that status means, the note, the source URL, the date the source was read and the page to cite. Call it to answer whether one protocol works with one processor, platform, retailer or agent surface. The same tool is callable over MCP at /mcp.",
    "parameters": [
     {
      "name": "protocol_id",
      "in": "query",
      "required": true,
      "description": "The protocol id, case-insensitive; the short name also works, for example acp, ucp, x402 or Visa TAP.",
      "schema": {
       "type": "string",
       "examples": [
        "acp",
        "ucp",
        "ap2",
        "visa-trusted-agent-protocol",
        "visa-intelligent-commerce",
        "mastercard-agent-pay",
        "agent-pay-for-machines",
        "amex-ace",
        "x402",
        "mpp",
        "stripe-link-for-agents",
        "verifiable-intent"
       ]
      },
      "example": "acp"
     },
     {
      "name": "column_id",
      "in": "query",
      "required": true,
      "description": "The processor, platform, retailer or agent surface id; the short name also works, for example stripe, shopify or chatgpt-shopping.",
      "schema": {
       "type": "string",
       "examples": [
        "stripe",
        "adyen-agentic",
        "paypal",
        "checkout-com",
        "braintree",
        "worldpay",
        "coinbase",
        "crossmint",
        "skyfire",
        "payos",
        "shopify",
        "bigcommerce",
        "salesforce-commerce-cloud",
        "adobe-commerce",
        "commercetools",
        "woocommerce",
        "amazon",
        "walmart",
        "target",
        "etsy",
        "wayfair",
        "chatgpt-shopping",
        "google-ai-mode-and-gemini-checkout",
        "perplexity-shopping",
        "amazon-rufus-and-buy-for-me",
        "meta-muse",
        "microsoft-copilot"
       ]
      },
      "example": "stripe"
     }
    ],
    "responses": {
     "200": {
      "description": "The result, the same object the MCP tool returns as structuredContent.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "protocol": {
           "type": "object",
           "properties": {
            "id": {
             "type": "string"
            },
            "name": {
             "type": "string"
            },
            "short": {
             "type": "string"
            },
            "operator": {
             "type": "string"
            },
            "homepage": {
             "type": "string",
             "format": "uri"
            },
            "url": {
             "type": "string",
             "format": "uri"
            }
           },
           "required": [
            "id",
            "name",
            "short",
            "url"
           ]
          },
          "column": {
           "type": "object",
           "properties": {
            "id": {
             "type": "string"
            },
            "name": {
             "type": "string"
            },
            "short": {
             "type": "string"
            },
            "group": {
             "type": "string",
             "enum": [
              "processor",
              "platform",
              "retailer",
              "surface"
             ]
            },
            "operator": {
             "type": "string"
            },
            "homepage": {
             "type": "string",
             "format": "uri"
            },
            "url": {
             "type": "string",
             "format": "uri"
            }
           },
           "required": [
            "id",
            "name",
            "short",
            "group",
            "url"
           ]
          },
          "status": {
           "type": "string",
           "enum": [
            "live",
            "pilot",
            "announced",
            "not_supported",
            "no_statement"
           ]
          },
          "note": {
           "type": "string"
          },
          "source_url": {
           "type": "string",
           "format": "uri"
          },
          "read_date": {
           "type": "string"
          },
          "url": {
           "type": "string",
           "format": "uri"
          },
          "status_meaning": {
           "type": "string"
          },
          "source_notes": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "text": {
              "type": "string"
             },
             "source_url": {
              "type": "string",
              "format": "uri"
             }
            },
            "required": [
             "text",
             "source_url"
            ]
           }
          },
          "edition": {
           "type": "string"
          }
         },
         "required": [
          "protocol",
          "column",
          "status",
          "status_meaning",
          "note",
          "source_url",
          "read_date",
          "url",
          "edition"
         ]
        }
       }
      }
     },
     "400": {
      "description": "A parameter is missing or has the wrong type; error.hint lists the parameters.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "No such endpoint or record.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "More than the published rate limit; Retry-After says when to try again.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "Internal error; the datasets could not be read.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/list_protocol_support": {
   "get": {
    "operationId": "list_protocol_support",
    "tags": [
     "tools"
    ],
    "summary": "One protocol across the columns",
    "description": "Lists one protocol across the 27 processors, platforms, retailers and agent surfaces: each column's status, note, source URL, read date and cell page, with the count of cells per status. Filter by status or by column group. Call it to answer where a protocol is live, in pilot or only announced. Paginated: pass limit (1 to 100) and the next_cursor of the previous page as cursor. The same tool is callable over MCP at /mcp.",
    "parameters": [
     {
      "name": "protocol_id",
      "in": "query",
      "required": true,
      "description": "The protocol id, case-insensitive; the short name also works, for example ucp, ap2 or Mastercard Agent Pay.",
      "schema": {
       "type": "string",
       "examples": [
        "acp",
        "ucp",
        "ap2",
        "visa-trusted-agent-protocol",
        "visa-intelligent-commerce",
        "mastercard-agent-pay",
        "agent-pay-for-machines",
        "amex-ace",
        "x402",
        "mpp",
        "stripe-link-for-agents",
        "verifiable-intent"
       ]
      },
      "example": "ucp"
     },
     {
      "name": "status",
      "in": "query",
      "required": false,
      "description": "Keep only cells with this status.",
      "schema": {
       "type": "string",
       "enum": [
        "live",
        "pilot",
        "announced",
        "not_supported",
        "no_statement"
       ]
      },
      "example": "live"
     },
     {
      "name": "group",
      "in": "query",
      "required": false,
      "description": "Keep only one column group: processor, platform, retailer or surface.",
      "schema": {
       "type": "string",
       "enum": [
        "processor",
        "platform",
        "retailer",
        "surface"
       ]
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Page size, 1 to 100 (default 20).",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 100,
       "default": 20
      }
     },
     {
      "name": "cursor",
      "in": "query",
      "required": false,
      "description": "Opaque cursor from next_cursor of the previous page.",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "The result, the same object the MCP tool returns as structuredContent.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "protocol": {
           "type": "object",
           "properties": {
            "id": {
             "type": "string"
            },
            "name": {
             "type": "string"
            },
            "short": {
             "type": "string"
            },
            "operator": {
             "type": "string"
            },
            "homepage": {
             "type": "string",
             "format": "uri"
            },
            "url": {
             "type": "string",
             "format": "uri"
            }
           },
           "required": [
            "id",
            "name",
            "short",
            "url"
           ]
          },
          "counts": {
           "type": "object",
           "properties": {
            "live": {
             "type": "integer"
            },
            "pilot": {
             "type": "integer"
            },
            "announced": {
             "type": "integer"
            },
            "not_supported": {
             "type": "integer"
            },
            "no_statement": {
             "type": "integer"
            }
           },
           "required": [
            "live",
            "pilot",
            "announced",
            "not_supported",
            "no_statement"
           ],
           "description": "Cells per status across the whole row or column, before any filter."
          },
          "items": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "column_id": {
              "type": "string"
             },
             "column": {
              "type": "string"
             },
             "group": {
              "type": "string",
              "enum": [
               "processor",
               "platform",
               "retailer",
               "surface"
              ]
             },
             "status": {
              "type": "string",
              "enum": [
               "live",
               "pilot",
               "announced",
               "not_supported",
               "no_statement"
              ]
             },
             "note": {
              "type": "string"
             },
             "source_url": {
              "type": "string",
              "format": "uri"
             },
             "read_date": {
              "type": "string"
             },
             "url": {
              "type": "string",
              "format": "uri"
             }
            },
            "required": [
             "column_id",
             "column",
             "group",
             "status",
             "note",
             "source_url",
             "read_date",
             "url"
            ]
           }
          },
          "total": {
           "type": "integer"
          },
          "limit": {
           "type": "integer"
          },
          "next_cursor": {
           "type": [
            "string",
            "null"
           ]
          },
          "edition": {
           "type": "string"
          },
          "url": {
           "type": "string",
           "format": "uri"
          }
         },
         "required": [
          "protocol",
          "counts",
          "items",
          "total",
          "limit",
          "next_cursor",
          "edition",
          "url"
         ]
        }
       }
      }
     },
     "400": {
      "description": "A parameter is missing or has the wrong type; error.hint lists the parameters.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "No such endpoint or record.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "More than the published rate limit; Retry-After says when to try again.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "Internal error; the datasets could not be read.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/list_column_support": {
   "get": {
    "operationId": "list_column_support",
    "tags": [
     "tools"
    ],
    "summary": "One column across the protocols",
    "description": "Lists one processor, platform, retailer or agent surface across the 12 protocols: each protocol's status, note, source URL, read date and cell page, with the count of cells per status. Filter by status. Call it to answer which agent payment protocols a given product supports. Paginated: pass limit (1 to 100) and the next_cursor of the previous page as cursor. The same tool is callable over MCP at /mcp.",
    "parameters": [
     {
      "name": "column_id",
      "in": "query",
      "required": true,
      "description": "The processor, platform, retailer or agent surface id, case-insensitive; the short name also works, for example stripe, shopify, walmart or ChatGPT.",
      "schema": {
       "type": "string",
       "examples": [
        "stripe",
        "adyen-agentic",
        "paypal",
        "checkout-com",
        "braintree",
        "worldpay",
        "coinbase",
        "crossmint",
        "skyfire",
        "payos",
        "shopify",
        "bigcommerce",
        "salesforce-commerce-cloud",
        "adobe-commerce",
        "commercetools",
        "woocommerce",
        "amazon",
        "walmart",
        "target",
        "etsy",
        "wayfair",
        "chatgpt-shopping",
        "google-ai-mode-and-gemini-checkout",
        "perplexity-shopping",
        "amazon-rufus-and-buy-for-me",
        "meta-muse",
        "microsoft-copilot"
       ]
      },
      "example": "shopify"
     },
     {
      "name": "status",
      "in": "query",
      "required": false,
      "description": "Keep only cells with this status.",
      "schema": {
       "type": "string",
       "enum": [
        "live",
        "pilot",
        "announced",
        "not_supported",
        "no_statement"
       ]
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Page size, 1 to 100 (default 20).",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 100,
       "default": 20
      }
     },
     {
      "name": "cursor",
      "in": "query",
      "required": false,
      "description": "Opaque cursor from next_cursor of the previous page.",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "The result, the same object the MCP tool returns as structuredContent.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "column": {
           "type": "object",
           "properties": {
            "id": {
             "type": "string"
            },
            "name": {
             "type": "string"
            },
            "short": {
             "type": "string"
            },
            "group": {
             "type": "string",
             "enum": [
              "processor",
              "platform",
              "retailer",
              "surface"
             ]
            },
            "operator": {
             "type": "string"
            },
            "homepage": {
             "type": "string",
             "format": "uri"
            },
            "url": {
             "type": "string",
             "format": "uri"
            }
           },
           "required": [
            "id",
            "name",
            "short",
            "group",
            "url"
           ]
          },
          "counts": {
           "type": "object",
           "properties": {
            "live": {
             "type": "integer"
            },
            "pilot": {
             "type": "integer"
            },
            "announced": {
             "type": "integer"
            },
            "not_supported": {
             "type": "integer"
            },
            "no_statement": {
             "type": "integer"
            }
           },
           "required": [
            "live",
            "pilot",
            "announced",
            "not_supported",
            "no_statement"
           ],
           "description": "Cells per status across the whole row or column, before any filter."
          },
          "items": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "protocol_id": {
              "type": "string"
             },
             "protocol": {
              "type": "string"
             },
             "status": {
              "type": "string",
              "enum": [
               "live",
               "pilot",
               "announced",
               "not_supported",
               "no_statement"
              ]
             },
             "note": {
              "type": "string"
             },
             "source_url": {
              "type": "string",
              "format": "uri"
             },
             "read_date": {
              "type": "string"
             },
             "url": {
              "type": "string",
              "format": "uri"
             }
            },
            "required": [
             "protocol_id",
             "protocol",
             "status",
             "note",
             "source_url",
             "read_date",
             "url"
            ]
           }
          },
          "total": {
           "type": "integer"
          },
          "limit": {
           "type": "integer"
          },
          "next_cursor": {
           "type": [
            "string",
            "null"
           ]
          },
          "edition": {
           "type": "string"
          },
          "url": {
           "type": "string",
           "format": "uri"
          }
         },
         "required": [
          "column",
          "counts",
          "items",
          "total",
          "limit",
          "next_cursor",
          "edition",
          "url"
         ]
        }
       }
      }
     },
     "400": {
      "description": "A parameter is missing or has the wrong type; error.hint lists the parameters.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "No such endpoint or record.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "More than the published rate limit; Retry-After says when to try again.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "Internal error; the datasets could not be read.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/search_rules": {
   "get": {
    "operationId": "search_rules",
    "tags": [
     "tools"
    ],
    "summary": "Liability and rules tracker",
    "description": "Searches the liability and rules tracker: dated changes in card-network rulebooks and agent payment frameworks, each with the document, the page or section, who carries the dispute, the source and the read date. Filter by network, by words and by a start date. Newest first. Paginated: pass limit (1 to 100) and the next_cursor of the previous page as cursor. The same tool is callable over MCP at /mcp.",
    "parameters": [
     {
      "name": "network",
      "in": "query",
      "required": false,
      "description": "visa, mastercard, amex, ap2 (FIDO Alliance) or other (other rule and policy changes).",
      "schema": {
       "type": "string",
       "enum": [
        "visa",
        "mastercard",
        "amex",
        "ap2",
        "other"
       ]
      },
      "example": "visa"
     },
     {
      "name": "q",
      "in": "query",
      "required": false,
      "description": "Words that must all appear in the change, the document title, the page or the dispute reading, for example \"agentic token\" or \"chargeback\".",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "since",
      "in": "query",
      "required": false,
      "description": "Only rows dated on or after this day, YYYY-MM-DD, for example 2026-09-01.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "Page size, 1 to 100 (default 20).",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 100,
       "default": 20
      }
     },
     {
      "name": "cursor",
      "in": "query",
      "required": false,
      "description": "Opaque cursor from next_cursor of the previous page.",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "The result, the same object the MCP tool returns as structuredContent.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "items": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "date": {
              "type": "string"
             },
             "network": {
              "type": "string",
              "enum": [
               "visa",
               "mastercard",
               "amex",
               "ap2",
               "other"
              ]
             },
             "change": {
              "type": "string"
             },
             "document_title": {
              "type": "string"
             },
             "document_url": {
              "type": "string",
              "format": "uri"
             },
             "page_or_section": {
              "type": "string"
             },
             "who_carries_the_dispute": {
              "type": "string"
             },
             "source_url": {
              "type": "string",
              "format": "uri"
             },
             "read_date": {
              "type": "string"
             },
             "url": {
              "type": "string",
              "format": "uri"
             }
            },
            "required": [
             "date",
             "network",
             "change",
             "document_title",
             "document_url",
             "page_or_section",
             "who_carries_the_dispute",
             "source_url",
             "read_date",
             "url"
            ]
           }
          },
          "total": {
           "type": "integer"
          },
          "limit": {
           "type": "integer"
          },
          "next_cursor": {
           "type": [
            "string",
            "null"
           ]
          },
          "edition": {
           "type": "string"
          },
          "url": {
           "type": "string",
           "format": "uri"
          }
         },
         "required": [
          "items",
          "total",
          "limit",
          "next_cursor",
          "edition",
          "url"
         ]
        }
       }
      }
     },
     "400": {
      "description": "A parameter is missing or has the wrong type; error.hint lists the parameters.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "No such endpoint or record.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "More than the published rate limit; Retry-After says when to try again.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "Internal error; the datasets could not be read.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/get_discovery_prevalence": {
   "get": {
    "operationId": "get_discovery_prevalence",
    "tags": [
     "tools"
    ],
    "summary": "Commerce discovery file prevalence",
    "description": "Returns how many probed domains serve a valid commerce discovery file (a UCP profile, ACP and x402 paths, an agent registry file, OpenAPI, agents.json, web bot auth keys) in each crawl group: domains probed, answers of 403 or 429, valid files and the share, with the caveats and the page to cite. Call it for how common these files are. The same tool is callable over MCP at /mcp.",
    "parameters": [
     {
      "name": "group",
      "in": "query",
      "required": false,
      "description": "Keep one crawl group by id: commerce-categories, top-10000 or payments-fintech.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "path",
      "in": "query",
      "required": false,
      "description": "Keep the probe paths that contain this text, for example ucp, x402 or openapi.",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "The result, the same object the MCP tool returns as structuredContent.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "crawl_date": {
           "type": "string"
          },
          "rows_in_file": {
           "type": "integer"
          },
          "rows_in_supplement": {
           "type": "integer"
          },
          "groups": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "id": {
              "type": "string"
             },
             "label": {
              "type": "string"
             },
             "n_domains": {
              "type": "integer"
             },
             "n_reachable": {
              "type": "integer"
             },
             "probes": {
              "type": "array",
              "items": {
               "type": "object",
               "properties": {
                "path": {
                 "type": "string"
                },
                "n_domains": {
                 "type": "integer"
                },
                "n_403": {
                 "type": "integer"
                },
                "robots_checked": {
                 "type": "boolean"
                },
                "n_ok": {
                 "type": "integer"
                },
                "n_json": {
                 "type": "integer"
                },
                "n_valid": {
                 "type": "integer"
                },
                "share_valid": {
                 "type": "number"
                }
               },
               "required": [
                "path",
                "n_domains",
                "n_403",
                "n_ok",
                "n_json",
                "n_valid",
                "share_valid"
               ]
              }
             },
             "domains_with_any": {
              "type": "array",
              "items": {
               "type": "string"
              }
             }
            },
            "required": [
             "id",
             "label",
             "n_domains",
             "n_reachable",
             "probes"
            ]
           }
          },
          "caveats": {
           "type": "array",
           "items": {
            "type": "string"
           }
          },
          "url": {
           "type": "string",
           "format": "uri"
          },
          "edition": {
           "type": "string"
          }
         },
         "required": [
          "crawl_date",
          "groups",
          "caveats",
          "url",
          "edition"
         ]
        }
       }
      }
     },
     "400": {
      "description": "A parameter is missing or has the wrong type; error.hint lists the parameters.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "No such endpoint or record.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "More than the published rate limit; Retry-After says when to try again.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "500": {
      "description": "Internal error; the datasets could not be read.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/ask": {
   "get": {
    "operationId": "askGet",
    "tags": [
     "nlweb"
    ],
    "summary": "Ask (NLWeb, GET)",
    "description": "NLWeb 0.55. Searches the site's records and pages for the question and returns schema.org objects, each with a source URL. Add streaming=true (or Accept: text/event-stream) for server-sent events start, result, error and complete.",
    "parameters": [
     {
      "name": "query",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string",
       "maxLength": 500
      },
      "description": "The question or search text."
     },
     {
      "name": "site",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      },
      "description": "Ignored unless it names this site; present for NLWeb compatibility."
     },
     {
      "name": "mode",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "list",
        "summarize"
       ]
      },
      "description": "list (default) or summarize, which adds a SearchSummary item."
     },
     {
      "name": "streaming",
      "in": "query",
      "required": false,
      "schema": {
       "type": "boolean"
      },
      "description": "true for text/event-stream."
     },
     {
      "name": "response_format",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "conversational_search",
        "chatgpt_app"
       ]
      }
     }
    ],
    "responses": {
     "200": {
      "description": "An NLWeb answer, or a failure with code NO_RESULTS.",
      "content": {
       "application/json": {
        "schema": {
         "oneOf": [
          {
           "$ref": "#/components/schemas/AskAnswer"
          },
          {
           "$ref": "#/components/schemas/AskFailure"
          }
         ]
        }
       },
       "text/event-stream": {
        "schema": {
         "type": "string",
         "description": "Events start, result (one per item), error, complete; each data line is JSON."
        }
       }
      }
     },
     "400": {
      "description": "INVALID_QUERY, UNSUPPORTED_MODE or UNSUPPORTED_FORMAT.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/AskFailure"
        }
       }
      }
     },
     "429": {
      "description": "More than the published rate limit; Retry-After says when to try again.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   },
   "post": {
    "operationId": "askPost",
    "tags": [
     "nlweb"
    ],
    "summary": "Ask (NLWeb, POST)",
    "description": "NLWeb 0.55 request object: query.text (required), query.site, prefer.streaming, prefer.mode, prefer.response_format, meta.version. The context object is accepted and ignored: answers come from the site's data, not from a model.",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/AskRequest"
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "An NLWeb answer, or a failure with code NO_RESULTS.",
      "content": {
       "application/json": {
        "schema": {
         "oneOf": [
          {
           "$ref": "#/components/schemas/AskAnswer"
          },
          {
           "$ref": "#/components/schemas/AskFailure"
          }
         ]
        }
       },
       "text/event-stream": {
        "schema": {
         "type": "string"
        }
       }
      }
     },
     "400": {
      "description": "INVALID_QUERY, UNSUPPORTED_MODE or UNSUPPORTED_FORMAT.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/AskFailure"
        }
       }
      }
     },
     "429": {
      "description": "More than the published rate limit; Retry-After says when to try again.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/data/protocol-matrix-2026-11-04.json": {
   "get": {
    "operationId": "download_protocol_matrix_2026_11_04_json",
    "tags": [
     "downloads"
    ],
    "summary": "Protocol support matrix (json)",
    "description": "The 324 cells of the matrix: protocol, column, status, note, source URL and read date, with the status legend and the column groups. Whole-file download; the tools above answer questions over the same rows.",
    "responses": {
     "200": {
      "description": "The file.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "additionalProperties": true
        }
       }
      }
     }
    }
   }
  },
  "/data/protocol-matrix-2026-11-04.csv": {
   "get": {
    "operationId": "download_protocol_matrix_2026_11_04_csv",
    "tags": [
     "downloads"
    ],
    "summary": "Protocol support matrix (csv)",
    "description": "The 324 cells of the matrix: protocol, column, status, note, source URL and read date, with the status legend and the column groups. Whole-file download; the tools above answer questions over the same rows.",
    "responses": {
     "200": {
      "description": "The file.",
      "content": {
       "text/csv": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/data/matrix-names-2026-11-04.json": {
   "get": {
    "operationId": "download_matrix_names_2026_11_04_json",
    "tags": [
     "downloads"
    ],
    "summary": "Matrix names (json)",
    "description": "The name, short name, operator, homepage and page of each protocol and each column, for the ids used in the matrix file. Whole-file download; the tools above answer questions over the same rows.",
    "responses": {
     "200": {
      "description": "The file.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "additionalProperties": true
        }
       }
      }
     }
    }
   }
  },
  "/data/liability-rules-tracker-2026-11-04.json": {
   "get": {
    "operationId": "download_liability_rules_tracker_2026_11_04_json",
    "tags": [
     "downloads"
    ],
    "summary": "Liability and rules tracker (json)",
    "description": "The 23 dated rule and policy changes with network, document, page or section and who carries the dispute. Whole-file download; the tools above answer questions over the same rows.",
    "responses": {
     "200": {
      "description": "The file.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "additionalProperties": true
        }
       }
      }
     }
    }
   }
  },
  "/data/liability-rules-tracker-2026-11-04.csv": {
   "get": {
    "operationId": "download_liability_rules_tracker_2026_11_04_csv",
    "tags": [
     "downloads"
    ],
    "summary": "Liability and rules tracker (csv)",
    "description": "The 23 dated rule and policy changes with network, document, page or section and who carries the dispute. Whole-file download; the tools above answer questions over the same rows.",
    "responses": {
     "200": {
      "description": "The file.",
      "content": {
       "text/csv": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/data/commerce-discovery-prevalence-2026-11-04.json": {
   "get": {
    "operationId": "download_commerce_discovery_prevalence_2026_11_04_json",
    "tags": [
     "downloads"
    ],
    "summary": "Commerce discovery file prevalence (json)",
    "description": "Per crawl group and probe path: domains probed, answers of 403 or 429, valid files and the share, with the caveats. Whole-file download; the tools above answer questions over the same rows.",
    "responses": {
     "200": {
      "description": "The file.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "additionalProperties": true
        }
       }
      }
     }
    }
   }
  },
  "/data/commerce-discovery-prevalence-2026-11-04.csv": {
   "get": {
    "operationId": "download_commerce_discovery_prevalence_2026_11_04_csv",
    "tags": [
     "downloads"
    ],
    "summary": "Commerce discovery file prevalence (csv)",
    "description": "Per crawl group and probe path: domains probed, answers of 403 or 429, valid files and the share, with the caveats. Whole-file download; the tools above answer questions over the same rows.",
    "responses": {
     "200": {
      "description": "The file.",
      "content": {
       "text/csv": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  }
 },
 "components": {
  "securitySchemes": {},
  "schemas": {
   "Error": {
    "type": "object",
    "required": [
     "error"
    ],
    "properties": {
     "error": {
      "type": "object",
      "required": [
       "code",
       "message",
       "status"
      ],
      "properties": {
       "code": {
        "type": "string",
        "enum": [
         "invalid_params",
         "not_found",
         "method_not_allowed",
         "unsupported_media_type",
         "rate_limited",
         "internal"
        ]
       },
       "message": {
        "type": "string"
       },
       "hint": {
        "type": "string"
       },
       "status": {
        "type": "integer"
       },
       "docs": {
        "type": "string",
        "format": "uri"
       },
       "openapi": {
        "type": "string",
        "format": "uri"
       }
      }
     }
    }
   },
   "ApiIndex": {
    "type": "object",
    "properties": {
     "name": {
      "type": "string"
     },
     "version": {
      "type": "string"
     },
     "edition": {
      "type": "string"
     },
     "documentation": {
      "type": "string",
      "format": "uri"
     },
     "openapi": {
      "type": "string",
      "format": "uri"
     },
     "endpoints": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "path": {
         "type": "string"
        },
        "method": {
         "type": "string"
        },
        "summary": {
         "type": "string"
        }
       }
      }
     },
     "datasets": {
      "type": "array",
      "items": {
       "type": "object"
      }
     },
     "mcp": {
      "type": "object"
     },
     "ask": {
      "type": "object"
     },
     "rate_limit": {
      "type": "object"
     },
     "versioning": {
      "type": "object"
     }
    }
   },
   "AskRequest": {
    "type": "object",
    "required": [
     "query"
    ],
    "properties": {
     "query": {
      "type": "object",
      "required": [
       "text"
      ],
      "properties": {
       "text": {
        "type": "string",
        "maxLength": 500
       },
       "site": {
        "type": "string"
       }
      }
     },
     "context": {
      "type": "object",
      "additionalProperties": true
     },
     "prefer": {
      "type": "object",
      "properties": {
       "streaming": {
        "type": "boolean"
       },
       "mode": {
        "type": "string",
        "description": "list, summarize, or both comma-separated"
       },
       "response_format": {
        "type": "string",
        "enum": [
         "conversational_search",
         "chatgpt_app"
        ]
       }
      }
     },
     "meta": {
      "type": "object",
      "properties": {
       "version": {
        "type": "string"
       },
       "query_id": {
        "type": "string"
       }
      }
     }
    }
   },
   "AskMeta": {
    "type": "object",
    "required": [
     "response_type",
     "version"
    ],
    "properties": {
     "response_type": {
      "type": "string",
      "enum": [
       "answer",
       "failure"
      ]
     },
     "response_format": {
      "type": "string"
     },
     "version": {
      "type": "string"
     },
     "site": {
      "type": "string"
     },
     "edition": {
      "type": "string"
     },
     "query_id": {
      "type": "string"
     }
    }
   },
   "AskResult": {
    "type": "object",
    "required": [
     "@type",
     "name",
     "url"
    ],
    "properties": {
     "@type": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "url": {
      "type": "string",
      "format": "uri"
     },
     "description": {
      "type": "string"
     },
     "score": {
      "type": "number"
     },
     "grounding": {
      "type": "object",
      "properties": {
       "source": {
        "type": "string",
        "format": "uri"
       },
       "dataset": {
        "type": "string"
       },
       "edition": {
        "type": "string"
       },
       "publisher": {
        "type": "string"
       }
      }
     }
    },
    "additionalProperties": true
   },
   "AskAnswer": {
    "type": "object",
    "required": [
     "_meta"
    ],
    "properties": {
     "_meta": {
      "$ref": "#/components/schemas/AskMeta"
     },
     "results": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/AskResult"
      }
     },
     "content": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "type": {
         "type": "string"
        },
        "text": {
         "type": "string"
        }
       }
      }
     },
     "structuredData": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/AskResult"
      }
     }
    }
   },
   "AskFailure": {
    "type": "object",
    "required": [
     "_meta",
     "failure"
    ],
    "properties": {
     "_meta": {
      "$ref": "#/components/schemas/AskMeta"
     },
     "failure": {
      "type": "object",
      "required": [
       "code"
      ],
      "properties": {
       "code": {
        "type": "string",
        "enum": [
         "NO_RESULTS",
         "INVALID_QUERY",
         "UNSUPPORTED_FORMAT",
         "UNSUPPORTED_MODE",
         "RATE_LIMITED",
         "INTERNAL_ERROR"
        ]
       },
       "message": {
        "type": "string"
       }
      }
     }
    }
   }
  }
 }
}
