{
  "openapi": "3.1.0",
  "info": {
    "title": "CheckWebsiteNow website checker",
    "version": "1.2.0",
    "description": "Public HTTPS homepage response evidence with safe bounded redirects and HEAD/GET header fallback. One measurement point. Not a remote MCP server. Separate explicit bounded static content inspection; no actual provider-bot or WebMCP runtime verdict."
  },
  "servers": [
    {
      "url": "/",
      "description": "Same origin as this description"
    }
  ],
  "paths": {
    "/api/v1/check": {
      "post": {
        "operationId": "checkPublicWebsite",
        "summary": "Check one public HTTPS homepage",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "hostname"
                ],
                "additionalProperties": false,
                "properties": {
                  "hostname": {
                    "type": "string",
                    "maxLength": 300,
                    "examples": [
                      "example.com"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Observation, including inconclusive states.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckResult"
                }
              }
            }
          },
          "400": {
            "description": "Request or measurement service error; never a target outage verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Request or measurement service error; never a target outage verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "408": {
            "description": "Request or measurement service error; never a target outage verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Request or measurement service error; never a target outage verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "415": {
            "description": "Request or measurement service error; never a target outage verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Request or measurement service error; never a target outage verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Request or measurement service error; never a target outage verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/methodology": {
      "get": {
        "operationId": "getMethodology",
        "summary": "Get scope and limitations",
        "responses": {
          "200": {
            "description": "Documented measurement scope",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/agent-check": {
      "post": {
        "operationId": "checkAgentReadability",
        "summary": "Inspect bounded public content and published bot rules",
        "description": "Explicit GET of homepage and robots.txt/llms.txt on final homepage origin. Shared ten-second retrieval deadline, nine total requests, at most five redirects/resource, 512 KiB HTML and 64 KiB metadata each, identity encoding only. No JavaScript or linked-resource execution. Three requests per minute per client; four shared probe slots. No cache or persistent page bodies. Static WebMCP hints only; optional absence is not a failed article. Plain chunked framing is strictly validated; chunk extensions and other transfer codings remain unknown. Bounded parsing follows retrieval; no total CPU-time guarantee. No noindex evaluation.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "hostname"
                ],
                "additionalProperties": false,
                "properties": {
                  "hostname": {
                    "type": "string",
                    "maxLength": 300,
                    "examples": [
                      "example.com"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "Request or measurement service error; never a target outage verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Request or measurement service error; never a target outage verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "408": {
            "description": "Request or measurement service error; never a target outage verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Request or measurement service error; never a target outage verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "415": {
            "description": "Request or measurement service error; never a target outage verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Request or measurement service error; never a target outage verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Request or measurement service error; never a target outage verdict.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "object",
                      "required": [
                        "code",
                        "message"
                      ],
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "200": {
            "description": "Bounded static observations; unavailable resources are findings, not proof of global failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "schema_version",
                    "target",
                    "checked_at",
                    "duration_ms",
                    "measurement_region",
                    "cached",
                    "status",
                    "summary",
                    "findings",
                    "limitations",
                    "final_url",
                    "final_origin",
                    "final_url_truncated"
                  ],
                  "properties": {
                    "schema_version": {
                      "const": "1.0"
                    },
                    "target": {
                      "type": "string"
                    },
                    "checked_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "duration_ms": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "measurement_region": {
                      "type": "string"
                    },
                    "cached": {
                      "const": false
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "complete",
                        "partial",
                        "unavailable"
                      ]
                    },
                    "summary": {
                      "type": "object",
                      "required": [
                        "passed",
                        "needs_help",
                        "unknown",
                        "not_applicable",
                        "total"
                      ],
                      "properties": {
                        "passed": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "needs_help": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "unknown": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "not_applicable": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "total": {
                          "type": "integer",
                          "minimum": 0
                        }
                      }
                    },
                    "findings": {
                      "type": "array",
                      "minItems": 6,
                      "maxItems": 6,
                      "items": {
                        "type": "object",
                        "required": [
                          "id",
                          "title",
                          "status",
                          "summary",
                          "evidence",
                          "action"
                        ],
                        "properties": {
                          "id": {
                            "type": "string",
                            "enum": [
                              "document",
                              "structure",
                              "robots",
                              "llms",
                              "metadata",
                              "webmcp"
                            ]
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "passed",
                              "needs_help",
                              "unknown",
                              "not_applicable"
                            ]
                          },
                          "title": {
                            "type": "string"
                          },
                          "summary": {
                            "type": "string"
                          },
                          "evidence": {
                            "type": "string"
                          },
                          "action": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "limitations": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "final_url": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "maxLength": 255,
                      "description": "Tested final homepage without query or fragment; may be explicitly truncated."
                    },
                    "final_origin": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Final homepage origin used for robots.txt and llms.txt."
                    },
                    "final_url_truncated": {
                      "type": "boolean"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "CheckResult": {
        "type": "object",
        "required": [
          "schema_version",
          "target",
          "status",
          "http_status",
          "checked_at",
          "duration_ms",
          "cached",
          "limitations",
          "evidence",
          "method",
          "measurement_region",
          "final_url",
          "redirect_count",
          "redirect_chain",
          "redirect_stop_reason"
        ],
        "properties": {
          "schema_version": {
            "type": "string"
          },
          "target": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "reachable",
              "redirected",
              "access_restricted",
              "http_error",
              "dns_error",
              "tls_error",
              "timeout",
              "probe_error"
            ]
          },
          "http_status": {
            "type": [
              "integer",
              "null"
            ]
          },
          "checked_at": {
            "type": "string",
            "format": "date-time"
          },
          "duration_ms": {
            "type": "integer",
            "minimum": 0
          },
          "cached": {
            "type": "boolean"
          },
          "method": {
            "type": "string",
            "enum": [
              "HEAD",
              "GET"
            ]
          },
          "measurement_region": {
            "type": "string"
          },
          "limitations": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "next_steps": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "evidence": {
            "type": "object",
            "properties": {
              "dns_addresses": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "transport_reachable": {
                "type": "boolean"
              },
              "get_fallback_used": {
                "type": "boolean"
              },
              "requests": {
                "type": "array",
                "maxItems": 12,
                "items": {
                  "type": "object"
                }
              }
            }
          },
          "final_url": {
            "type": "string",
            "format": "uri"
          },
          "redirect_count": {
            "type": "integer",
            "minimum": 0,
            "maximum": 5
          },
          "redirect_chain": {
            "type": "array",
            "maxItems": 5,
            "items": {
              "type": "object",
              "required": [
                "from_url",
                "to_url",
                "http_status"
              ],
              "properties": {
                "from_url": {
                  "type": "string"
                },
                "to_url": {
                  "type": "string"
                },
                "http_status": {
                  "type": "integer"
                }
              }
            }
          },
          "redirect_stop_reason": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      }
    }
  }
}
