{
  "openapi": "3.1.0",
  "jsonSchemaDialect": "https://spec.openapis.org/oas/3.1/dialect/base",
  "info": {
    "title": "Journeyed answers",
    "version": "1",
    "summary": "Read-only, static JSON answers to local questions, with a source and a checked date on every fact.",
    "description": "Static GET endpoints; no key, no rate plan, no write operations. Every page has a markdown twin at <path>.md; every question, place and hub page also has a JSON twin at <path>.json. Rankings are computed by published code (see the methodology page); sponsored placements are a separate, labelled array and never move a rank or score. No review text or star ratings are published."
  },
  "servers": [
    {
      "url": "https://journeyed.org"
    }
  ],
  "x-mcp": {
    "url": "https://journeyed.org/mcp",
    "transport": "streamable-http",
    "authentication": "none",
    "discovery": "https://journeyed.org/.well-known/mcp.json"
  },
  "paths": {
    "/answers.json": {
      "get": {
        "operationId": "listAnswers",
        "summary": "Every published question with its answer and top three",
        "description": "Each entry links the question page (url), its JSON twin (jsonUrl) and its markdown twin (markdownUrl), with its need id and anchor. markets[] links each market routing index.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Every published question with its answer and top three",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnswersIndex"
                }
              }
            }
          },
          "404": {
            "description": "No such page. Twins are not redirected: when a page moved or a question fell below the publish threshold, its HTML URL redirects but its .json and .md twins return 404, so re-read answers.json."
          }
        }
      }
    },
    "/hotels/{market}.json": {
      "get": {
        "operationId": "getHotelsMarketHub",
        "summary": "A market hub: every scored place and every published question",
        "description": "Places are ordered by the place score; questions and anchor hubs are linked.",
        "parameters": [
          {
            "name": "market",
            "in": "path",
            "required": true,
            "description": "Market slug, from answers.json or llms.txt.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "los-angeles"
          }
        ],
        "responses": {
          "200": {
            "description": "A market hub: every scored place and every published question",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HubTwin"
                }
              }
            }
          },
          "404": {
            "description": "No such page. Twins are not redirected: when a page moved or a question fell below the publish threshold, its HTML URL redirects but its .json and .md twins return 404, so re-read answers.json."
          }
        }
      }
    },
    "/agents/hotels/{market}/anchors.json": {
      "get": {
        "operationId": "getHotelsAnchorIndex",
        "summary": "Start here for a request: anchors with aliases, needs, and the questions and facts file of each anchor",
        "description": "Match the place in a request to an anchor (name or alias) and the need to a need id (by its words). Fetch a question jsonUrl with that need, or the anchor factsUrl to filter hotels on the need fact keys and distance.",
        "parameters": [
          {
            "name": "market",
            "in": "path",
            "required": true,
            "description": "Market slug, from answers.json or llms.txt.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "los-angeles"
          }
        ],
        "responses": {
          "200": {
            "description": "Start here for a request: anchors with aliases, needs, and the questions and facts file of each anchor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnchorIndex"
                }
              }
            }
          },
          "404": {
            "description": "No such page. Twins are not redirected: when a page moved or a question fell below the publish threshold, its HTML URL redirects but its .json and .md twins return 404, so re-read answers.json."
          }
        }
      }
    },
    "/agents/hotels/{market}/facts/{anchor}.json": {
      "get": {
        "operationId": "getHotelsAnchorFacts",
        "summary": "Every scored hotel within one anchor radius with every verified fact",
        "description": "Nearest first, with distance, score, phone, website and facts (value, source, checked date). Filter on distanceMi and on fact keys, reading each fact value: a fact can be a verified no.",
        "parameters": [
          {
            "name": "market",
            "in": "path",
            "required": true,
            "description": "Market slug, from answers.json or llms.txt.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "los-angeles"
          },
          {
            "name": "anchor",
            "in": "path",
            "required": true,
            "description": "Anchor slug, from anchors.json.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "alhambra"
          }
        ],
        "responses": {
          "200": {
            "description": "Every scored hotel within one anchor radius with every verified fact",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnchorFacts"
                }
              }
            }
          },
          "404": {
            "description": "No such page. Twins are not redirected: when a page moved or a question fell below the publish threshold, its HTML URL redirects but its .json and .md twins return 404, so re-read answers.json."
          }
        }
      }
    },
    "/agents/hotels/{market}/facts.json": {
      "get": {
        "operationId": "getHotelsFactIndex",
        "summary": "The fact dictionary and every verified fact in a market",
        "description": "keys lists every fact key with its meaning, kind, unit and allowed values. hotels lists every hotel with a verified fact beyond contact details, one per line, each fact with its source and checked date. A key missing from a hotel is unknown, not absent.",
        "parameters": [
          {
            "name": "market",
            "in": "path",
            "required": true,
            "description": "Market slug, from answers.json or llms.txt.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "los-angeles"
          }
        ],
        "responses": {
          "200": {
            "description": "The fact dictionary and every verified fact in a market",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FactIndex"
                }
              }
            }
          },
          "404": {
            "description": "No such page. Twins are not redirected: when a page moved or a question fell below the publish threshold, its HTML URL redirects but its .json and .md twins return 404, so re-read answers.json."
          }
        }
      }
    },
    "/agents/hotels/{market}/places.json": {
      "get": {
        "operationId": "getHotelsPlaceDirectory",
        "summary": "Every place in a market, one per line",
        "description": "Contact, coordinates, score, verified fact keys and nearby anchors. Large; prefer anchors.json and an anchor facts file for a request.",
        "parameters": [
          {
            "name": "market",
            "in": "path",
            "required": true,
            "description": "Market slug, from answers.json or llms.txt.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "los-angeles"
          }
        ],
        "responses": {
          "200": {
            "description": "Every place in a market, one per line",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlaceDirectory"
                }
              }
            }
          },
          "404": {
            "description": "No such page. Twins are not redirected: when a page moved or a question fell below the publish threshold, its HTML URL redirects but its .json and .md twins return 404, so re-read answers.json."
          }
        }
      }
    },
    "/hotels/{market}/questions.json": {
      "get": {
        "operationId": "getHotelsQuestionIndex",
        "summary": "Every published question in a market, grouped by need (page 1)",
        "description": "Follow nextUrl for later pages (/hotels/{market}/questions/page/<n>.json); they share this schema.",
        "parameters": [
          {
            "name": "market",
            "in": "path",
            "required": true,
            "description": "Market slug, from answers.json or llms.txt.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "los-angeles"
          }
        ],
        "responses": {
          "200": {
            "description": "Every published question in a market, grouped by need (page 1)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuestionIndexTwin"
                }
              }
            }
          },
          "404": {
            "description": "No such page. Twins are not redirected: when a page moved or a question fell below the publish threshold, its HTML URL redirects but its .json and .md twins return 404, so re-read answers.json."
          }
        }
      }
    },
    "/hotels/{market}/{question}.json": {
      "get": {
        "operationId": "getHotelsQuestion",
        "summary": "A ranked, sourced answer to one question",
        "description": "The ranked places with their Fit Score, place score, distance and the sourced facts that answer the question; sponsored placements are a separate array. A slug that starts with \"best-\" (from answers.json bestOf[]) is a best-of page and returns BestOfTwin (type \"best-of\") instead; a slug that starts with \"hotels-within-walking-distance-of-\" (answers.json walking[]) is a walking page and returns WalkingTwin (type \"walking\").",
        "parameters": [
          {
            "name": "market",
            "in": "path",
            "required": true,
            "description": "Market slug, from answers.json or llms.txt.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "los-angeles"
          },
          {
            "name": "question",
            "in": "path",
            "required": true,
            "description": "Question slug, from answers.json (questions[], bestOf[] or walking[]).",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "can-i-stay-near-lax-and-visit-disneyland"
          }
        ],
        "responses": {
          "200": {
            "description": "A ranked, sourced answer to one question",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/QuestionTwin"
                    },
                    {
                      "$ref": "#/components/schemas/BestOfTwin"
                    },
                    {
                      "$ref": "#/components/schemas/WalkingTwin"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "No such page. Twins are not redirected: when a page moved or a question fell below the publish threshold, its HTML URL redirects but its .json and .md twins return 404, so re-read answers.json."
          }
        }
      }
    },
    "/hotels/{market}/{question}.md": {
      "get": {
        "operationId": "getHotelsQuestionMarkdown",
        "summary": "A question page as markdown",
        "parameters": [
          {
            "name": "market",
            "in": "path",
            "required": true,
            "description": "Market slug, from answers.json or llms.txt.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "los-angeles"
          },
          {
            "name": "question",
            "in": "path",
            "required": true,
            "description": "Question slug, from answers.json.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "can-i-stay-near-lax-and-visit-disneyland"
          }
        ],
        "responses": {
          "200": {
            "description": "A question page as markdown",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such page."
          }
        }
      }
    },
    "/hotels/{market}/anchors/{anchor}.json": {
      "get": {
        "operationId": "getHotelsAnchorHub",
        "summary": "Places near one anchor (airport, venue, neighborhood)",
        "description": "Places within the anchor radius by place score, and the questions about that anchor.",
        "parameters": [
          {
            "name": "market",
            "in": "path",
            "required": true,
            "description": "Market slug, from answers.json or llms.txt.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "los-angeles"
          },
          {
            "name": "anchor",
            "in": "path",
            "required": true,
            "description": "Anchor slug, from the market hub.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "alhambra"
          }
        ],
        "responses": {
          "200": {
            "description": "Places near one anchor (airport, venue, neighborhood)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HubTwin"
                }
              }
            }
          },
          "404": {
            "description": "No such page. Twins are not redirected: when a page moved or a question fell below the publish threshold, its HTML URL redirects but its .json and .md twins return 404, so re-read answers.json."
          }
        }
      }
    },
    "/hotel/{place}.json": {
      "get": {
        "operationId": "getHotel",
        "summary": "One place with every sourced fact",
        "description": "Contact details, coordinates, score and history, every fact with its source and checked date, counted mentions, distances to anchors and the questions it ranks for.",
        "parameters": [
          {
            "name": "place",
            "in": "path",
            "required": true,
            "description": "Place slug, from a question or hub.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "short-stories-hotel-los-angeles-00147d"
          }
        ],
        "responses": {
          "200": {
            "description": "One place with every sourced fact",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlaceTwin"
                }
              }
            }
          },
          "404": {
            "description": "No such page. Twins are not redirected: when a page moved or a question fell below the publish threshold, its HTML URL redirects but its .json and .md twins return 404, so re-read answers.json."
          }
        }
      }
    },
    "/hotel/{place}.md": {
      "get": {
        "operationId": "getHotelMarkdown",
        "summary": "One place page as markdown",
        "parameters": [
          {
            "name": "place",
            "in": "path",
            "required": true,
            "description": "Place slug, from a question or hub.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "short-stories-hotel-los-angeles-00147d"
          }
        ],
        "responses": {
          "200": {
            "description": "One place page as markdown",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such page."
          }
        }
      }
    },
    "/hotel/{place}/q/{question}.json": {
      "get": {
        "operationId": "getHotelQuestion",
        "summary": "One question about one place, answered from its sourced facts",
        "description": "The question, the answer with its source and checked date, the related facts and nearby places with the same fact. Exists only where the place states the answer.",
        "parameters": [
          {
            "name": "place",
            "in": "path",
            "required": true,
            "description": "Place slug, from hotel-answers.json or a place twin.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "short-stories-hotel-los-angeles-00147d"
          },
          {
            "name": "question",
            "in": "path",
            "required": true,
            "description": "Question id, from hotel-answers.json questionIds or a place twin questionPages.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "parking-type"
          }
        ],
        "responses": {
          "200": {
            "description": "One question about one place, answered from its sourced facts",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HotelQuestionTwin"
                }
              }
            }
          },
          "404": {
            "description": "No such page. Twins are not redirected: when a page moved or a question fell below the publish threshold, its HTML URL redirects but its .json and .md twins return 404, so re-read answers.json."
          }
        }
      }
    },
    "/hotel/{place}/q/{question}.md": {
      "get": {
        "operationId": "getHotelQuestionMarkdown",
        "summary": "A hotel question page as markdown",
        "parameters": [
          {
            "name": "place",
            "in": "path",
            "required": true,
            "description": "Place slug, from hotel-answers.json or a place twin.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "short-stories-hotel-los-angeles-00147d"
          },
          {
            "name": "question",
            "in": "path",
            "required": true,
            "description": "Question id, from hotel-answers.json questionIds or a place twin questionPages.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "parking-type"
          }
        ],
        "responses": {
          "200": {
            "description": "A hotel question page as markdown",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such page."
          }
        }
      }
    },
    "/hotel-answers.json": {
      "get": {
        "operationId": "listHotelAnswers",
        "summary": "Every hotel question page: question, answer, source and checked date",
        "description": "One entry per (hotel, question) with a sourced answer. Fetch url with .json in place of the trailing slash for the full twin.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Every hotel question page: question, answer, source and checked date",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HotelAnswersIndex"
                }
              }
            }
          },
          "404": {
            "description": "No such page. Twins are not redirected: when a page moved or a question fell below the publish threshold, its HTML URL redirects but its .json and .md twins return 404, so re-read answers.json."
          }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "operationId": "getLlmsTxt",
        "summary": "Site guide for language models (llmstxt.org)",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Site guide for language models (llmstxt.org)",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such page."
          }
        }
      }
    },
    "/llms-full.txt": {
      "get": {
        "operationId": "getLlmsFullTxt",
        "summary": "Every hub and question page as one markdown file",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Every hub and question page as one markdown file",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No such page."
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Publisher": {
        "type": "object",
        "description": "The publisher. disclosure and parent are present only when the publisher has a parent company.",
        "required": [
          "name"
        ],
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          },
          "disclosure": {
            "type": "string"
          },
          "parent": {
            "type": "string"
          }
        }
      },
      "Weights": {
        "type": "object",
        "description": "Component weights the ranking used; they sum to 1.",
        "required": [
          "facts",
          "opinion",
          "proximity",
          "reachability"
        ],
        "additionalProperties": false,
        "properties": {
          "facts": {
            "type": "number"
          },
          "opinion": {
            "type": "number"
          },
          "proximity": {
            "type": "number"
          },
          "reachability": {
            "type": "number"
          }
        }
      },
      "Coordinates": {
        "type": "object",
        "required": [
          "lat",
          "lon"
        ],
        "additionalProperties": false,
        "properties": {
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          }
        }
      },
      "Fact": {
        "type": "object",
        "description": "One sourced fact. Exactly one of sourceUrl and dataset is set. text is the wording the page shows; value is the stored canonical value.",
        "required": [
          "key",
          "text",
          "value",
          "unit",
          "sourceUrl",
          "dataset",
          "sourceLabel",
          "licenseBasis",
          "checkedOn"
        ],
        "additionalProperties": false,
        "properties": {
          "key": {
            "type": "string"
          },
          "text": {
            "type": "string"
          },
          "value": {
            "type": [
              "string",
              "null"
            ]
          },
          "unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "sourceUrl": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "dataset": {
            "type": [
              "string",
              "null"
            ]
          },
          "sourceLabel": {
            "type": "string"
          },
          "licenseBasis": {
            "type": "string"
          },
          "checkedOn": {
            "type": "string",
            "format": "date"
          }
        }
      },
      "Source": {
        "type": "object",
        "required": [
          "label",
          "url",
          "dataset",
          "licenseBasis",
          "checkedOn"
        ],
        "additionalProperties": false,
        "properties": {
          "label": {
            "type": "string"
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "dataset": {
            "type": [
              "string",
              "null"
            ]
          },
          "licenseBasis": {
            "type": "string"
          },
          "checkedOn": {
            "type": "string",
            "format": "date"
          }
        }
      },
      "RoutedDistance": {
        "type": "object",
        "description": "A distance along OpenStreetMap streets and paths between a hotel and a landmark, beside the straight-line distanceMi and never shorter than it. walkMin is the routing engine's estimate (say \"about\"), never a measured time. driveMi is a distance only: no drive time is published. A null part is not on record.",
        "required": [
          "walkMi",
          "walkMin",
          "driveMi"
        ],
        "additionalProperties": false,
        "properties": {
          "walkMi": {
            "type": [
              "number",
              "null"
            ]
          },
          "walkMin": {
            "type": [
              "integer",
              "null"
            ]
          },
          "driveMi": {
            "type": [
              "number",
              "null"
            ]
          }
        }
      },
      "Routing": {
        "type": "object",
        "description": "What sources every routed figure of a twin: the credit (OpenStreetMap contributors, routed with the named engine), the date of the map data, the date computed and the method of each figure.",
        "required": [
          "source",
          "engine",
          "mapDataOn",
          "computedOn",
          "walkMethod",
          "driveMethod",
          "note"
        ],
        "additionalProperties": false,
        "properties": {
          "source": {
            "$ref": "#/components/schemas/Source"
          },
          "engine": {
            "type": "string"
          },
          "mapDataOn": {
            "type": "string",
            "format": "date"
          },
          "computedOn": {
            "type": "string",
            "format": "date"
          },
          "walkMethod": {
            "type": "string"
          },
          "driveMethod": {
            "type": "string"
          },
          "note": {
            "type": "string"
          }
        }
      },
      "FactSheetRoutedRow": {
        "type": "object",
        "description": "One computed distance of a fact sheet: straight-line miles to a landmark and the walking and driving distance along OpenStreetMap ways, with method, source and the date computed (checkedOn).",
        "required": [
          "anchor",
          "url",
          "straightMi",
          "walkMi",
          "walkMin",
          "driveMi",
          "method",
          "sourceLabel",
          "sourceUrl",
          "licenseBasis",
          "checkedOn"
        ],
        "additionalProperties": false,
        "properties": {
          "anchor": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "straightMi": {
            "type": "number"
          },
          "walkMi": {
            "type": [
              "number",
              "null"
            ]
          },
          "walkMin": {
            "type": [
              "integer",
              "null"
            ]
          },
          "driveMi": {
            "type": [
              "number",
              "null"
            ]
          },
          "method": {
            "type": "string"
          },
          "sourceLabel": {
            "type": "string"
          },
          "sourceUrl": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "licenseBasis": {
            "type": "string"
          },
          "checkedOn": {
            "type": "string",
            "format": "date"
          }
        }
      },
      "FactSheetRow": {
        "type": "object",
        "description": "One verified fact of a fact sheet: what the key means (label, group), its stored value and unit, the page wording, its source (exactly one of sourceUrl and dataset), the date it was checked and its data tier (1 open data, 2 the hotel website, 3 licensed, 4 first-party, 5 claimed by the business).",
        "required": [
          "key",
          "label",
          "group",
          "value",
          "unit",
          "text",
          "sourceUrl",
          "dataset",
          "checkedOn",
          "tier",
          "licenseBasis"
        ],
        "additionalProperties": false,
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "group": {
            "type": "string"
          },
          "value": {
            "type": [
              "string",
              "null"
            ]
          },
          "unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "text": {
            "type": "string"
          },
          "sourceUrl": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "dataset": {
            "type": [
              "string",
              "null"
            ]
          },
          "checkedOn": {
            "type": "string",
            "format": "date"
          },
          "tier": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5
          },
          "licenseBasis": {
            "type": "string"
          }
        }
      },
      "FactSheet": {
        "type": "object",
        "description": "The complete fact sheet of one hotel: every verified fact, and every registered fact key that is not verified yet (unknown). Unknown is not no: never fill it in. keysUrl is the market fact dictionary.",
        "required": [
          "about",
          "keysUrl",
          "known",
          "unknownCount",
          "facts",
          "unknown",
          "brandStandardKeys",
          "routed"
        ],
        "additionalProperties": false,
        "properties": {
          "about": {
            "type": "string"
          },
          "keysUrl": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "known": {
            "type": "integer"
          },
          "unknownCount": {
            "type": "integer"
          },
          "facts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FactSheetRow"
            }
          },
          "unknown": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "brandStandardKeys": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "routed": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FactSheetRoutedRow"
            }
          }
        }
      },
      "Link": {
        "type": "object",
        "required": [
          "text",
          "url",
          "jsonUrl"
        ],
        "additionalProperties": false,
        "properties": {
          "text": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Backing": {
        "type": "object",
        "description": "What is on record behind a hotel score, in counts: facts read from the hotel own website (and the newest date they were checked), contact details from the open place record, recognized awards, counted reader votes, and how many of the standard facts the score counts are verified.",
        "required": [
          "ownSiteFacts",
          "ownSiteCheckedOn",
          "recordFacts",
          "awards",
          "votes",
          "standardFacts",
          "standardTotal"
        ],
        "additionalProperties": false,
        "properties": {
          "ownSiteFacts": {
            "type": "integer"
          },
          "ownSiteCheckedOn": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "recordFacts": {
            "type": "integer"
          },
          "awards": {
            "type": "integer"
          },
          "votes": {
            "type": "integer"
          },
          "standardFacts": {
            "type": "integer"
          },
          "standardTotal": {
            "type": "integer"
          }
        }
      },
      "BestOfParts": {
        "type": "object",
        "description": "The five parts of a best-of order, in points.",
        "required": [
          "awards",
          "class",
          "facts",
          "votes",
          "distance"
        ],
        "additionalProperties": false,
        "properties": {
          "awards": {
            "type": "number"
          },
          "class": {
            "type": "number"
          },
          "facts": {
            "type": "number"
          },
          "votes": {
            "type": "number"
          },
          "distance": {
            "type": "number"
          }
        }
      },
      "RankedPlace": {
        "type": "object",
        "description": "A ranked place on a question. fit is the question Fit Score (0 to 100), score the place score (0 to 100), distanceMi straight-line miles from the anchor. phone (E.164) and website come from the place record (its dataset is listed in sources[]). backing counts what is on record behind the score.",
        "required": [
          "rank",
          "placeId",
          "name",
          "url",
          "jsonUrl",
          "fit",
          "score",
          "distanceMi",
          "routed",
          "why",
          "address",
          "phone",
          "website",
          "coordinates",
          "answeringFacts"
        ],
        "additionalProperties": false,
        "properties": {
          "rank": {
            "type": "integer"
          },
          "placeId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "fit": {
            "type": "number"
          },
          "score": {
            "type": "number"
          },
          "distanceMi": {
            "type": "number"
          },
          "routed": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/RoutedDistance"
              },
              {
                "type": "null"
              }
            ]
          },
          "why": {
            "type": "string"
          },
          "address": {
            "type": [
              "string",
              "null"
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ]
          },
          "website": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "coordinates": {
            "$ref": "#/components/schemas/Coordinates"
          },
          "answeringFacts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Fact"
            }
          },
          "backing": {
            "$ref": "#/components/schemas/Backing"
          }
        }
      },
      "SponsoredPlace": {
        "type": "object",
        "description": "A labelled paid placement. It never appears inside ranked[] and never changes a rank or score; organicRank is its own untouched position.",
        "required": [
          "label",
          "placeId",
          "name",
          "url",
          "fit",
          "organicRank"
        ],
        "additionalProperties": false,
        "properties": {
          "label": {
            "type": "string"
          },
          "placeId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "fit": {
            "type": "number"
          },
          "organicRank": {
            "type": [
              "integer",
              "null"
            ]
          }
        }
      },
      "ListSponsoredPlace": {
        "type": "object",
        "description": "A labelled paid card above a best-of, walking or landmark list. Never inside ranked[] and never a change to any rank or score: organicRank is the hotel position in ranked[] when the list shows it, else null; score is its unchanged place score.",
        "required": [
          "label",
          "placeId",
          "name",
          "url",
          "organicRank",
          "score",
          "distanceMi"
        ],
        "additionalProperties": false,
        "properties": {
          "label": {
            "type": "string"
          },
          "placeId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "organicRank": {
            "type": [
              "integer",
              "null"
            ]
          },
          "score": {
            "type": "number"
          },
          "distanceMi": {
            "type": "number"
          },
          "rankedOn": {
            "type": "object",
            "description": "Event pages: the hotel position on the full best-of list the page links to, as that list publishes it, when the page shows only its first rows.",
            "required": [
              "rank",
              "total",
              "title",
              "url"
            ],
            "additionalProperties": false,
            "properties": {
              "rank": {
                "type": "integer"
              },
              "total": {
                "type": "integer"
              },
              "title": {
                "type": "string"
              },
              "url": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "CompareTable": {
        "type": "object",
        "description": "The comparison table a list page shows under its answer: one row per listed hotel, in the list order; cells are in column order. distance is straight-line miles; walk, walkMin, walkMi and drive follow OpenStreetMap ways (walk times are estimates). of names the guide section whose hotels the rows are. routing is present when the twin has no routing of its own.",
        "required": [
          "heading",
          "caption",
          "anchorUrl",
          "columns",
          "rows"
        ],
        "additionalProperties": false,
        "properties": {
          "heading": {
            "type": "string"
          },
          "caption": {
            "type": "string"
          },
          "anchorUrl": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "of": {
            "type": "string"
          },
          "columns": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "label"
              ],
              "additionalProperties": false,
              "properties": {
                "id": {
                  "enum": [
                    "distance",
                    "walk",
                    "walkMin",
                    "walkMi",
                    "drive",
                    "parking",
                    "answer",
                    "checkin",
                    "pets",
                    "recognition",
                    "verified",
                    "profile"
                  ]
                },
                "label": {
                  "type": "string"
                }
              }
            }
          },
          "rows": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "rank",
                "placeId",
                "name",
                "url",
                "jsonUrl",
                "cells"
              ],
              "additionalProperties": false,
              "properties": {
                "rank": {
                  "type": "integer"
                },
                "placeId": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "jsonUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "cells": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "description": "One cell. facts are the sourced facts the text was worded from; a cell without them is computed (a distance, a walk, a count, a band). \"not stated\" means the value is not on record, never that it is no.",
                    "required": [
                      "text"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "text": {
                        "type": "string"
                      },
                      "facts": {
                        "type": "array",
                        "items": {
                          "$ref": "#/components/schemas/Fact"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "routing": {
            "$ref": "#/components/schemas/Routing"
          }
        }
      },
      "WalkingTwin": {
        "type": "object",
        "description": "JSON twin of a walking page (/<category>/<market>/hotels-within-walking-distance-of-<anchor>.json): every hotel with a walking route to the place on record, shortest estimated walk first. within counts the hotels inside 10, 20 and 30 minutes. Not a quality ranking. sponsored (present only when the page shows one) holds labelled paid cards, never part of ranked.",
        "required": [
          "schemaVersion",
          "url",
          "jsonUrl",
          "markdownUrl",
          "asOf",
          "publisher",
          "type",
          "title",
          "market",
          "answer",
          "answerSentences",
          "countLine",
          "method",
          "anchor",
          "total",
          "within",
          "ranked",
          "table",
          "routing",
          "qa",
          "related",
          "alsoAskedAs",
          "sources"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "type": {
            "const": "walking"
          },
          "title": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          },
          "answerSentences": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 2,
            "maxItems": 2
          },
          "countLine": {
            "type": "string"
          },
          "method": {
            "type": "string"
          },
          "anchor": {
            "type": "object",
            "required": [
              "name",
              "url",
              "lat",
              "lon",
              "kind"
            ],
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string"
              },
              "url": {
                "type": "string",
                "format": "uri"
              },
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "kind": {
                "type": "string"
              }
            }
          },
          "total": {
            "type": "integer"
          },
          "within": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "minutes",
                "hotels"
              ],
              "additionalProperties": false,
              "properties": {
                "minutes": {
                  "type": "integer"
                },
                "hotels": {
                  "type": "integer"
                }
              }
            }
          },
          "ranked": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A hotel in walking order. routed.walkMin is the routing engine estimate (say \"about\"), never a measured time; distanceMi is straight-line miles.",
              "required": [
                "rank",
                "placeId",
                "name",
                "url",
                "jsonUrl",
                "distanceMi",
                "routed",
                "address",
                "coordinates",
                "facts",
                "score",
                "scoreBand",
                "backing",
                "backedBy"
              ],
              "additionalProperties": false,
              "properties": {
                "rank": {
                  "type": "integer"
                },
                "placeId": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "jsonUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "distanceMi": {
                  "type": "number"
                },
                "routed": {
                  "$ref": "#/components/schemas/RoutedDistance"
                },
                "address": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "coordinates": {
                  "$ref": "#/components/schemas/Coordinates"
                },
                "facts": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Fact"
                  }
                },
                "score": {
                  "type": "number"
                },
                "scoreBand": {
                  "type": "string"
                },
                "backing": {
                  "$ref": "#/components/schemas/Backing"
                },
                "backedBy": {
                  "type": "string"
                }
              }
            }
          },
          "table": {
            "$ref": "#/components/schemas/CompareTable"
          },
          "routing": {
            "$ref": "#/components/schemas/Routing"
          },
          "qa": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "question",
                "answer"
              ],
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "question": {
                  "type": "string"
                },
                "answer": {
                  "type": "string"
                }
              }
            }
          },
          "related": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Link"
            }
          },
          "alsoAskedAs": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Source"
            }
          },
          "sponsored": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ListSponsoredPlace"
            }
          }
        }
      },
      "QuestionTwin": {
        "type": "object",
        "description": "JSON twin of a question page (<path>.json). bestOf links the best-of list of the same place and walking its walking page, when the build has one. table is the comparison table the page shows under its answer. parkingPrices lists stated parking prices lowest first on a question that asks what parking costs.",
        "required": [
          "schemaVersion",
          "url",
          "jsonUrl",
          "markdownUrl",
          "asOf",
          "publisher",
          "type",
          "question",
          "answer",
          "answerSentences",
          "countLine",
          "market",
          "anchor",
          "ranked",
          "rankedTotal",
          "notYetVerified",
          "notYetVerifiedTotal",
          "sponsored",
          "related",
          "methodology",
          "sources",
          "routing"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "type": {
            "const": "question"
          },
          "question": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          },
          "answerSentences": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 2,
            "maxItems": 2
          },
          "countLine": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "anchor": {
            "type": "object",
            "required": [
              "name",
              "url",
              "lat",
              "lon"
            ],
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string"
              },
              "url": {
                "type": "string",
                "format": "uri"
              },
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              }
            }
          },
          "ranked": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RankedPlace"
            }
          },
          "rankedTotal": {
            "type": "integer"
          },
          "notYetVerified": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "url",
                "jsonUrl",
                "missing"
              ],
              "additionalProperties": false,
              "properties": {
                "name": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "jsonUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "missing": {
                  "type": "string"
                }
              }
            }
          },
          "notYetVerifiedTotal": {
            "type": "integer"
          },
          "sponsored": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SponsoredPlace"
            }
          },
          "related": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Link"
            }
          },
          "methodology": {
            "type": "object",
            "required": [
              "formulaVersion",
              "weights",
              "lines",
              "url"
            ],
            "additionalProperties": false,
            "properties": {
              "formulaVersion": {
                "type": "string"
              },
              "weights": {
                "$ref": "#/components/schemas/Weights"
              },
              "lines": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "url": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Source"
            }
          },
          "routing": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Routing"
              },
              {
                "type": "null"
              }
            ]
          },
          "whyTrust": {
            "type": "object",
            "description": "Why trust this ranking: three checkable statements with the market counts.",
            "required": [
              "bullets",
              "url"
            ],
            "additionalProperties": false,
            "properties": {
              "bullets": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "url": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "bestOf": {
            "$ref": "#/components/schemas/Link"
          },
          "walking": {
            "$ref": "#/components/schemas/Link"
          },
          "table": {
            "$ref": "#/components/schemas/CompareTable"
          },
          "parkingPrices": {
            "type": "object",
            "description": "Questions that ask what parking costs: every compared hotel that states a parking price, lowest first; total counts them all, rows shows at most 25. The ranked list keeps its own Fit order.",
            "required": [
              "heading",
              "answerSentences",
              "caption",
              "total",
              "rows"
            ],
            "additionalProperties": false,
            "properties": {
              "heading": {
                "type": "string"
              },
              "answerSentences": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "caption": {
                "type": "string"
              },
              "total": {
                "type": "integer"
              },
              "rows": {
                "type": "array",
                "items": {
                  "type": "object",
                  "description": "A hotel that states a parking price: position is its place by nightly price (then straight-line miles), never a rank. kind valet means the hotel states no self parking price. nightlyUsd is the low end of a range, 0 when free.",
                  "required": [
                    "position",
                    "placeId",
                    "name",
                    "url",
                    "jsonUrl",
                    "price",
                    "kind",
                    "nightlyUsd",
                    "distanceMi",
                    "hotelClass",
                    "facts"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "position": {
                      "type": "integer"
                    },
                    "placeId": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "jsonUrl": {
                      "type": "string",
                      "format": "uri"
                    },
                    "price": {
                      "type": "string"
                    },
                    "kind": {
                      "enum": [
                        "self",
                        "valet"
                      ]
                    },
                    "nightlyUsd": {
                      "type": "number"
                    },
                    "distanceMi": {
                      "type": "number"
                    },
                    "hotelClass": {
                      "type": "string"
                    },
                    "facts": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Fact"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "BestOfTwin": {
        "type": "object",
        "description": "JSON twin of a best-of page (/<category>/<market>/best-...json): hotels that can be ranked, ordered by a published formula of recognized awards, hotel class, verified facts, reader votes and distance. Never a review score. sponsored (present only when the page shows one) holds labelled paid cards, never part of ranked.",
        "required": [
          "schemaVersion",
          "url",
          "jsonUrl",
          "markdownUrl",
          "asOf",
          "publisher",
          "type",
          "title",
          "kind",
          "market",
          "answer",
          "answerSentences",
          "countLine",
          "anchor",
          "need",
          "considered",
          "eligible",
          "eligibility",
          "formula",
          "votes",
          "ranked",
          "rankedTotal",
          "sections",
          "routing",
          "whyTrust",
          "qa",
          "related",
          "alsoAskedAs",
          "sources"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "type": {
            "const": "best-of"
          },
          "title": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "anchor",
              "need"
            ]
          },
          "market": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          },
          "answerSentences": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 2,
            "maxItems": 2
          },
          "countLine": {
            "type": "string"
          },
          "anchor": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "name",
                  "url",
                  "lat",
                  "lon",
                  "radiusMi",
                  "kind"
                ],
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "url": {
                    "type": "string",
                    "format": "uri"
                  },
                  "lat": {
                    "type": "number"
                  },
                  "lon": {
                    "type": "number"
                  },
                  "radiusMi": {
                    "type": "number"
                  },
                  "kind": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "need": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "id",
                  "label",
                  "definition"
                ],
                "additionalProperties": false,
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "label": {
                    "type": "string"
                  },
                  "definition": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "considered": {
            "type": "integer"
          },
          "eligible": {
            "type": "integer"
          },
          "eligibility": {
            "type": "string"
          },
          "formula": {
            "type": "object",
            "description": "What best means on this page: points per part (they sum to 100), in two sentences and one line per part.",
            "required": [
              "version",
              "weights",
              "sentences",
              "lines",
              "url"
            ],
            "additionalProperties": false,
            "properties": {
              "version": {
                "type": "string"
              },
              "weights": {
                "$ref": "#/components/schemas/BestOfParts"
              },
              "sentences": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "minItems": 2,
                "maxItems": 2
              },
              "lines": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "url": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "votes": {
            "type": "object",
            "description": "Reader opinion enters only as Yes or No votes on details. Never reviews.",
            "required": [
              "counted",
              "note"
            ],
            "additionalProperties": false,
            "properties": {
              "counted": {
                "type": "integer"
              },
              "note": {
                "type": "string"
              }
            }
          },
          "ranked": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A ranked hotel. points is the best-of total (0 to 100), not the place score; why holds the sourced facts behind its place, awards first (value is the level, unit the list year).",
              "required": [
                "rank",
                "placeId",
                "name",
                "url",
                "jsonUrl",
                "points",
                "parts",
                "eligibleBy",
                "score",
                "scoreBand",
                "distanceMi",
                "routed",
                "address",
                "coordinates",
                "why",
                "backing",
                "backedBy",
                "questionPages"
              ],
              "additionalProperties": false,
              "properties": {
                "rank": {
                  "type": "integer"
                },
                "placeId": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "jsonUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "points": {
                  "type": "number"
                },
                "parts": {
                  "$ref": "#/components/schemas/BestOfParts"
                },
                "eligibleBy": {
                  "enum": [
                    "profile",
                    "award",
                    "both"
                  ]
                },
                "score": {
                  "type": "number"
                },
                "scoreBand": {
                  "type": "string"
                },
                "distanceMi": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "routed": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/RoutedDistance"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "address": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "coordinates": {
                  "$ref": "#/components/schemas/Coordinates"
                },
                "why": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Fact"
                  }
                },
                "backing": {
                  "$ref": "#/components/schemas/Backing"
                },
                "backedBy": {
                  "type": "string"
                },
                "questionPages": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Link"
                  }
                }
              }
            }
          },
          "rankedTotal": {
            "type": "integer"
          },
          "sections": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "heading",
                "note",
                "rows"
              ],
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "heading": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                },
                "rows": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "placeId",
                      "name",
                      "url",
                      "distanceMi",
                      "routed",
                      "score",
                      "rank",
                      "fact"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "placeId": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      },
                      "url": {
                        "type": "string",
                        "format": "uri"
                      },
                      "distanceMi": {
                        "type": [
                          "number",
                          "null"
                        ]
                      },
                      "routed": {
                        "oneOf": [
                          {
                            "$ref": "#/components/schemas/RoutedDistance"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "score": {
                        "type": "number"
                      },
                      "rank": {
                        "type": [
                          "integer",
                          "null"
                        ]
                      },
                      "fact": {
                        "$ref": "#/components/schemas/Fact"
                      }
                    }
                  }
                }
              }
            }
          },
          "routing": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Routing"
              },
              {
                "type": "null"
              }
            ]
          },
          "whyTrust": {
            "type": "object",
            "required": [
              "bullets",
              "url"
            ],
            "additionalProperties": false,
            "properties": {
              "bullets": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "url": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "qa": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "question",
                "answer"
              ],
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "question": {
                  "type": "string"
                },
                "answer": {
                  "type": "string"
                }
              }
            }
          },
          "related": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Link"
            }
          },
          "alsoAskedAs": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Source"
            }
          },
          "walking": {
            "$ref": "#/components/schemas/Link"
          },
          "table": {
            "$ref": "#/components/schemas/CompareTable"
          },
          "sponsored": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ListSponsoredPlace"
            }
          }
        }
      },
      "PlaceTwin": {
        "type": "object",
        "description": "JSON twin of a place page (<path>.json). photos is present when the build ships photos; videos when the place has YouTube videos; questionPages when the hotel has question pages.",
        "required": [
          "schemaVersion",
          "url",
          "jsonUrl",
          "markdownUrl",
          "asOf",
          "publisher",
          "type",
          "placeId",
          "name",
          "market",
          "contact",
          "coordinates",
          "scoreName",
          "score",
          "scoreHistory",
          "facts",
          "factSheet",
          "mentionCounts",
          "anchors",
          "routing",
          "formerNames",
          "nameSource",
          "questions",
          "sources",
          "claimUrl",
          "qa",
          "brandStandard"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "type": {
            "const": "place"
          },
          "placeId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "contact": {
            "type": "object",
            "description": "Contact details from the open place record, plus ownerGuide when the owner publishes a guide site of their own (null when none is on record).",
            "required": [
              "phone",
              "website",
              "address",
              "source",
              "ownerGuide"
            ],
            "additionalProperties": false,
            "properties": {
              "phone": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "website": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "uri"
              },
              "address": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "source": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/Source"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "ownerGuide": {
                "oneOf": [
                  {
                    "type": "object",
                    "description": "A guide site the hotel owner publishes, apart from the brand site in website; the date a person checked it in a browser.",
                    "required": [
                      "url",
                      "checkedOn"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "url": {
                        "type": "string",
                        "format": "uri"
                      },
                      "checkedOn": {
                        "type": "string",
                        "format": "date"
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          },
          "coordinates": {
            "$ref": "#/components/schemas/Coordinates"
          },
          "scoreName": {
            "type": "string"
          },
          "score": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "value",
                  "formulaVersion",
                  "asOf"
                ],
                "additionalProperties": false,
                "properties": {
                  "value": {
                    "type": "number"
                  },
                  "formulaVersion": {
                    "type": "string"
                  },
                  "asOf": {
                    "type": "string",
                    "format": "date"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "scoreHistory": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "asOf",
                "score"
              ],
              "additionalProperties": false,
              "properties": {
                "asOf": {
                  "type": "string",
                  "format": "date"
                },
                "score": {
                  "type": "number"
                }
              }
            }
          },
          "facts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Fact"
            }
          },
          "factSheet": {
            "$ref": "#/components/schemas/FactSheet"
          },
          "mentionCounts": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "Counted guest mentions from licensed sources. Never text, never a star rating.",
              "required": [
                "aspect",
                "positive",
                "neutral",
                "negative"
              ],
              "additionalProperties": false,
              "properties": {
                "aspect": {
                  "type": "string"
                },
                "positive": {
                  "type": "integer"
                },
                "neutral": {
                  "type": "integer"
                },
                "negative": {
                  "type": "integer"
                }
              }
            }
          },
          "anchors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "url",
                "distanceMi",
                "routed"
              ],
              "additionalProperties": false,
              "properties": {
                "name": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "distanceMi": {
                  "type": "number"
                },
                "routed": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/RoutedDistance"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              }
            }
          },
          "routing": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Routing"
              },
              {
                "type": "null"
              }
            ]
          },
          "formerNames": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "nameSource": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Source"
              },
              {
                "type": "null"
              }
            ]
          },
          "questions": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "question",
                "url",
                "jsonUrl",
                "rank"
              ],
              "additionalProperties": false,
              "properties": {
                "question": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "jsonUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "rank": {
                  "type": "integer"
                }
              }
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Source"
            }
          },
          "claimUrl": {
            "type": "string",
            "format": "uri"
          },
          "qa": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A question about this hotel and its answer, restating one sourced fact (basis \"fact:<key>\") or one anchor distance (basis \"distance:<anchor url>\") on the page, with its source and checked date. Generated deterministically from the facts, never written by a model.",
              "required": [
                "id",
                "question",
                "answer",
                "source",
                "basis"
              ],
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "question": {
                  "type": "string"
                },
                "answer": {
                  "type": "string"
                },
                "source": {
                  "$ref": "#/components/schemas/Source"
                },
                "basis": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "brandStandard": {
            "oneOf": [
              {
                "type": "object",
                "description": "What the hotel brand says all its hotels offer. Not a fact about this property.",
                "required": [
                  "brand",
                  "items"
                ],
                "additionalProperties": false,
                "properties": {
                  "brand": {
                    "type": "string"
                  },
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "key",
                        "text",
                        "source"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "key": {
                          "type": "string"
                        },
                        "text": {
                          "type": "string"
                        },
                        "source": {
                          "$ref": "#/components/schemas/Source"
                        }
                      }
                    }
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "questionPages": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A page that answers one question about this hotel from its sourced facts (HotelQuestionTwin).",
              "required": [
                "id",
                "question",
                "url",
                "jsonUrl"
              ],
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "question": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "jsonUrl": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "recognition": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Fact"
            }
          },
          "backing": {
            "$ref": "#/components/schemas/Backing"
          },
          "backedBy": {
            "type": "string"
          },
          "scoreBand": {
            "type": "string"
          },
          "bestOf": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A best-of list this hotel is ranked on.",
              "required": [
                "title",
                "url",
                "jsonUrl",
                "rank"
              ],
              "additionalProperties": false,
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "jsonUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "rank": {
                  "type": "integer"
                }
              }
            }
          },
          "photos": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Photo"
            }
          },
          "videos": {
            "type": "object",
            "description": "J15: YouTube videos that name this hotel (title and channel as YouTube returns them, not verified). YouTube API data, refreshed or dropped within 30 days.",
            "required": [
              "source",
              "note",
              "terms",
              "videos"
            ],
            "additionalProperties": false,
            "properties": {
              "source": {
                "const": "YouTube Data API v3"
              },
              "note": {
                "type": "string"
              },
              "terms": {
                "type": "string",
                "format": "uri"
              },
              "videos": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "videoId",
                    "title",
                    "channel",
                    "channelUrl",
                    "url",
                    "embedUrl",
                    "thumbnailUrl",
                    "kind",
                    "isShort",
                    "durationSec",
                    "uploadDate",
                    "fetchedOn"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "videoId": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    },
                    "channel": {
                      "type": "string"
                    },
                    "channelUrl": {
                      "type": "string",
                      "format": "uri"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "embedUrl": {
                      "type": "string",
                      "format": "uri"
                    },
                    "thumbnailUrl": {
                      "type": "string",
                      "format": "uri"
                    },
                    "kind": {
                      "enum": [
                        "room-tour",
                        "walk-through",
                        "review",
                        "other"
                      ]
                    },
                    "isShort": {
                      "type": "boolean"
                    },
                    "durationSec": {
                      "type": "integer"
                    },
                    "uploadDate": {
                      "type": "string",
                      "format": "date"
                    },
                    "fetchedOn": {
                      "type": "string",
                      "format": "date"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "HotelQuestionTwin": {
        "type": "object",
        "description": "JSON twin of a hotel question page (/hotel/<place>/q/<question>.json): ONE question about ONE hotel, answered from the fact(s) in basis, which share the source and checked date given. answerText is the answer followed by its source sentence. A hotel without a page for a question id has no verified answer (unknown, not no).",
        "required": [
          "schemaVersion",
          "url",
          "jsonUrl",
          "markdownUrl",
          "asOf",
          "publisher",
          "type",
          "questionId",
          "topic",
          "question",
          "answer",
          "answerText",
          "source",
          "checkedOn",
          "basis",
          "hotel",
          "related",
          "nearby",
          "vote",
          "otherQuestions",
          "otherQuestionsTotal",
          "alsoAskedAs"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "type": {
            "const": "hotel-question"
          },
          "questionId": {
            "type": "string"
          },
          "topic": {
            "type": "string"
          },
          "question": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          },
          "answerText": {
            "type": "string"
          },
          "source": {
            "$ref": "#/components/schemas/Source"
          },
          "checkedOn": {
            "type": "string",
            "format": "date"
          },
          "basis": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Fact"
            }
          },
          "hotel": {
            "type": "object",
            "required": [
              "placeId",
              "name",
              "url",
              "jsonUrl",
              "address",
              "coordinates",
              "market",
              "scoreName",
              "score"
            ],
            "additionalProperties": false,
            "properties": {
              "placeId": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "url": {
                "type": "string",
                "format": "uri"
              },
              "jsonUrl": {
                "type": "string",
                "format": "uri"
              },
              "address": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "coordinates": {
                "$ref": "#/components/schemas/Coordinates"
              },
              "market": {
                "type": "string"
              },
              "scoreName": {
                "type": "string"
              },
              "score": {
                "oneOf": [
                  {
                    "type": "object",
                    "required": [
                      "value",
                      "band",
                      "formulaVersion",
                      "asOf"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "value": {
                        "type": "number"
                      },
                      "band": {
                        "type": "string"
                      },
                      "formulaVersion": {
                        "type": "string"
                      },
                      "asOf": {
                        "type": "string",
                        "format": "date"
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          },
          "related": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Fact"
            }
          },
          "nearby": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "heading",
                  "withinMi",
                  "distanceSource",
                  "hotels"
                ],
                "additionalProperties": false,
                "properties": {
                  "heading": {
                    "type": "string"
                  },
                  "withinMi": {
                    "type": "number"
                  },
                  "distanceSource": {
                    "$ref": "#/components/schemas/Source"
                  },
                  "hotels": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "placeId",
                        "name",
                        "url",
                        "jsonUrl",
                        "hotelUrl",
                        "distanceMi",
                        "fact"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "placeId": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string",
                          "format": "uri"
                        },
                        "jsonUrl": {
                          "type": "string",
                          "format": "uri"
                        },
                        "hotelUrl": {
                          "type": "string",
                          "format": "uri"
                        },
                        "distanceMi": {
                          "type": "number"
                        },
                        "fact": {
                          "$ref": "#/components/schemas/Fact"
                        }
                      }
                    }
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "vote": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "detailId",
                  "question",
                  "action",
                  "fields",
                  "button"
                ],
                "additionalProperties": false,
                "properties": {
                  "detailId": {
                    "type": "string"
                  },
                  "question": {
                    "type": "string"
                  },
                  "action": {
                    "type": "string"
                  },
                  "fields": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "button": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "otherQuestions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Link"
            }
          },
          "otherQuestionsTotal": {
            "type": "integer"
          },
          "alsoAskedAs": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "HotelAnswersEntry": {
        "type": "object",
        "required": [
          "question",
          "answer",
          "url",
          "questionId",
          "hotel",
          "hotelUrl",
          "placeId",
          "source",
          "checkedOn"
        ],
        "additionalProperties": false,
        "properties": {
          "question": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "questionId": {
            "type": "string"
          },
          "hotel": {
            "type": "string"
          },
          "hotelUrl": {
            "type": "string",
            "format": "uri"
          },
          "placeId": {
            "type": "string"
          },
          "source": {
            "type": "object",
            "required": [
              "label",
              "url",
              "dataset"
            ],
            "additionalProperties": false,
            "properties": {
              "label": {
                "type": "string"
              },
              "url": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "uri"
              },
              "dataset": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "checkedOn": {
            "type": "string",
            "format": "date"
          }
        }
      },
      "HotelAnswersIndex": {
        "type": "object",
        "description": "Index of every hotel question page (/hotel-answers.json), one answer per line.",
        "required": [
          "schemaVersion",
          "type",
          "name",
          "description",
          "asOf",
          "count",
          "hotels",
          "questionIds",
          "citation",
          "publisher",
          "answers"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "type": {
            "const": "hotel-answers"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "count": {
            "type": "integer"
          },
          "hotels": {
            "type": "integer"
          },
          "questionIds": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "topic",
                "example",
                "count"
              ],
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "topic": {
                  "type": "string"
                },
                "example": {
                  "type": "string"
                },
                "count": {
                  "type": "integer"
                }
              }
            }
          },
          "citation": {
            "type": "object",
            "description": "How to cite a page of this site.",
            "required": [
              "name",
              "url",
              "format",
              "sources",
              "scores"
            ],
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string"
              },
              "url": {
                "type": "string"
              },
              "format": {
                "type": "string"
              },
              "sources": {
                "type": "string"
              },
              "scores": {
                "type": "string"
              }
            }
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "answers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HotelAnswersEntry"
            }
          }
        }
      },
      "Photo": {
        "type": "object",
        "description": "A licensed Wikimedia Commons photo the page shows. kind \"place\" is the hotel itself; \"area\" is a nearby landmark or city photo standing in for it (label says so); never treat an area photo as the hotel.",
        "required": [
          "url",
          "width",
          "height",
          "alt",
          "kind",
          "label",
          "credit"
        ],
        "additionalProperties": false,
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          },
          "width": {
            "type": "integer"
          },
          "height": {
            "type": "integer"
          },
          "alt": {
            "type": "string"
          },
          "kind": {
            "enum": [
              "place",
              "area",
              "landmark"
            ]
          },
          "label": {
            "type": [
              "string",
              "null"
            ]
          },
          "credit": {
            "type": "object",
            "required": [
              "author",
              "license",
              "licenseUrl",
              "commonsPage",
              "fileTitle"
            ],
            "additionalProperties": false,
            "properties": {
              "author": {
                "type": "string"
              },
              "license": {
                "type": "string"
              },
              "licenseUrl": {
                "type": "string",
                "format": "uri"
              },
              "commonsPage": {
                "type": "string",
                "format": "uri"
              },
              "fileTitle": {
                "type": "string"
              }
            }
          }
        }
      },
      "CreditsTwin": {
        "type": "object",
        "description": "JSON twin of /credits/: every photo the site shows, with its author, license and Commons page.",
        "required": [
          "schemaVersion",
          "url",
          "jsonUrl",
          "markdownUrl",
          "asOf",
          "publisher",
          "type",
          "photos",
          "maps"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "type": {
            "const": "credits"
          },
          "photos": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "url",
                "fileTitle",
                "author",
                "license",
                "licenseUrl",
                "commonsPage",
                "pages"
              ],
              "additionalProperties": false,
              "properties": {
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "fileTitle": {
                  "type": "string"
                },
                "author": {
                  "type": "string"
                },
                "license": {
                  "type": "string"
                },
                "licenseUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "commonsPage": {
                  "type": "string",
                  "format": "uri"
                },
                "pages": {
                  "type": "integer"
                }
              }
            }
          },
          "maps": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "attribution",
                  "url",
                  "license"
                ],
                "additionalProperties": false,
                "properties": {
                  "attribution": {
                    "type": "string"
                  },
                  "url": {
                    "type": "string",
                    "format": "uri"
                  },
                  "license": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "ScoredPlace": {
        "type": "object",
        "required": [
          "rank",
          "placeId",
          "name",
          "url",
          "jsonUrl",
          "score",
          "distanceMi"
        ],
        "additionalProperties": false,
        "properties": {
          "rank": {
            "type": "integer"
          },
          "placeId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "score": {
            "type": "number"
          },
          "distanceMi": {
            "type": "number"
          }
        }
      },
      "HubTwin": {
        "type": "object",
        "description": "JSON twin of a market hub or an anchor hub (<path>.json). bestOf lists the best-of pages (every one on a market hub, its own on an anchor hub). An anchor hub may carry its walking page, its upcoming event pages (events, soonest first), the comparison table of its first listed hotels and, only when the page shows one, labelled paid cards in sponsored (never part of ranked).",
        "required": [
          "schemaVersion",
          "url",
          "jsonUrl",
          "markdownUrl",
          "asOf",
          "publisher",
          "type",
          "title",
          "answer",
          "answerSentences",
          "market",
          "scoreName",
          "anchor",
          "countLine",
          "ranked",
          "questions",
          "anchors"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "type": {
            "enum": [
              "market-hub",
              "anchor-hub"
            ]
          },
          "title": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          },
          "answerSentences": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 2,
            "maxItems": 2
          },
          "market": {
            "type": "string"
          },
          "scoreName": {
            "type": "string"
          },
          "anchor": {
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "name",
                  "lat",
                  "lon",
                  "radiusMi"
                ],
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "lat": {
                    "type": "number"
                  },
                  "lon": {
                    "type": "number"
                  },
                  "radiusMi": {
                    "type": "number"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "countLine": {
            "type": [
              "string",
              "null"
            ]
          },
          "ranked": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ScoredPlace"
            }
          },
          "questions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Link"
            }
          },
          "anchors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Link"
            }
          },
          "bestOf": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Link"
            }
          },
          "walking": {
            "$ref": "#/components/schemas/Link"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "text",
                "url",
                "jsonUrl",
                "dates"
              ],
              "additionalProperties": false,
              "properties": {
                "text": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "jsonUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "dates": {
                  "type": "string"
                }
              }
            }
          },
          "table": {
            "$ref": "#/components/schemas/CompareTable"
          },
          "sponsored": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ListSponsoredPlace"
            }
          }
        }
      },
      "EventHotel": {
        "type": "object",
        "description": "A hotel on an event page list. distanceMi is straight-line miles to the venue; routed is the walk and drive on record (walkMin an estimate, a drive a distance only).",
        "required": [
          "rank",
          "placeId",
          "name",
          "url",
          "jsonUrl",
          "distanceMi",
          "routed",
          "score",
          "scoreBand"
        ],
        "additionalProperties": false,
        "properties": {
          "rank": {
            "type": "integer"
          },
          "placeId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "distanceMi": {
            "type": "number"
          },
          "routed": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/RoutedDistance"
              },
              {
                "type": "null"
              }
            ]
          },
          "score": {
            "type": "number"
          },
          "scoreBand": {
            "type": "string"
          }
        }
      },
      "EventTwin": {
        "type": "object",
        "description": "JSON twin of an event page (/<category>/<market>/events/<event>.json): where to stay for one event at a venue. ranked is the first rows of the venue best-of ranking, in its order; walking the shortest walks; parking the hotels within the venue radius that state a parking price, nearest first; drive every hotel above with its driving distance. sponsored (present only when the page shows one) holds labelled paid cards, never part of any list. parkingPrices links the venue question that lists every stated parking price lowest first; alsoAskedAs holds other wordings of the page question.",
        "required": [
          "schemaVersion",
          "url",
          "jsonUrl",
          "markdownUrl",
          "asOf",
          "publisher",
          "type",
          "title",
          "market",
          "answer",
          "answerSentences",
          "event",
          "ranked",
          "bestOf",
          "rankedTotal",
          "walking",
          "walkingPage",
          "parking",
          "parkingTotal",
          "drive",
          "routing",
          "related",
          "otherEvents",
          "sources"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "type": {
            "const": "event"
          },
          "title": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          },
          "answerSentences": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 2,
            "maxItems": 2
          },
          "event": {
            "type": "object",
            "description": "The event as the venue lists it on its official events page (source, basis official-calendar). Dates and start times only: no prices, nothing else about the event.",
            "required": [
              "name",
              "shortName",
              "dates",
              "nights",
              "through",
              "venue",
              "source"
            ],
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string"
              },
              "shortName": {
                "type": "string"
              },
              "dates": {
                "type": "string"
              },
              "nights": {
                "type": "array",
                "items": {
                  "type": "object",
                  "description": "One listed night: the date, the local start time (HH:MM) when the venue lists one, and the schema.org startDate (with the UTC offset when a time is listed).",
                  "required": [
                    "date",
                    "startTime",
                    "startDate"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "date": {
                      "type": "string",
                      "format": "date"
                    },
                    "startTime": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "startDate": {
                      "type": "string"
                    }
                  }
                }
              },
              "through": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date"
              },
              "venue": {
                "type": "object",
                "required": [
                  "name",
                  "url",
                  "lat",
                  "lon"
                ],
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "url": {
                    "type": "string",
                    "format": "uri"
                  },
                  "lat": {
                    "type": "number"
                  },
                  "lon": {
                    "type": "number"
                  }
                }
              },
              "source": {
                "$ref": "#/components/schemas/Source"
              }
            }
          },
          "ranked": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EventHotel"
            }
          },
          "bestOf": {
            "$ref": "#/components/schemas/Link"
          },
          "rankedTotal": {
            "type": "integer"
          },
          "walking": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EventHotel"
            }
          },
          "walkingPage": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Link"
              },
              {
                "type": "null"
              }
            ]
          },
          "parking": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "rank",
                "placeId",
                "name",
                "url",
                "jsonUrl",
                "distanceMi",
                "routed",
                "score",
                "scoreBand",
                "parking",
                "facts"
              ],
              "additionalProperties": false,
              "properties": {
                "rank": {
                  "type": "integer"
                },
                "placeId": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "jsonUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "distanceMi": {
                  "type": "number"
                },
                "routed": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/RoutedDistance"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "score": {
                  "type": "number"
                },
                "scoreBand": {
                  "type": "string"
                },
                "parking": {
                  "type": "string"
                },
                "facts": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Fact"
                  }
                }
              }
            }
          },
          "parkingTotal": {
            "type": "integer"
          },
          "parkingPrices": {
            "$ref": "#/components/schemas/Link"
          },
          "alsoAskedAs": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "drive": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EventHotel"
            }
          },
          "routing": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Routing"
              },
              {
                "type": "null"
              }
            ]
          },
          "related": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Link"
            }
          },
          "otherEvents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Link"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Source"
            }
          },
          "sponsored": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ListSponsoredPlace"
            }
          }
        }
      },
      "EventIndexTwin": {
        "type": "object",
        "description": "JSON twin of the event index (/<category>/<market>/events.json): every live event page, by venue, soonest first.",
        "required": [
          "schemaVersion",
          "url",
          "jsonUrl",
          "markdownUrl",
          "asOf",
          "publisher",
          "type",
          "title",
          "market",
          "intro",
          "countLine",
          "venues"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "type": {
            "const": "event-index"
          },
          "title": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "intro": {
            "type": "string"
          },
          "countLine": {
            "type": "string"
          },
          "venues": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "url",
                "events"
              ],
              "additionalProperties": false,
              "properties": {
                "name": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "events": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "text",
                      "url",
                      "jsonUrl",
                      "dates",
                      "firstDate"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "text": {
                        "type": "string"
                      },
                      "url": {
                        "type": "string",
                        "format": "uri"
                      },
                      "jsonUrl": {
                        "type": "string",
                        "format": "uri"
                      },
                      "dates": {
                        "type": "string"
                      },
                      "firstDate": {
                        "type": "string",
                        "format": "date"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "QuestionIndexTwin": {
        "type": "object",
        "description": "JSON twin of one page of the question listing (/<category>/<market>/questions.json, /questions/page/<n>.json).",
        "required": [
          "schemaVersion",
          "url",
          "jsonUrl",
          "markdownUrl",
          "asOf",
          "publisher",
          "type",
          "title",
          "market",
          "hubUrl",
          "page",
          "pageCount",
          "from",
          "to",
          "total",
          "groups",
          "prevUrl",
          "nextUrl"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "type": {
            "const": "question-index"
          },
          "title": {
            "type": "string"
          },
          "market": {
            "type": "string"
          },
          "hubUrl": {
            "type": "string",
            "format": "uri"
          },
          "page": {
            "type": "integer"
          },
          "pageCount": {
            "type": "integer"
          },
          "from": {
            "type": "integer"
          },
          "to": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          },
          "groups": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "label",
                "questions"
              ],
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "questions": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Link"
                  }
                }
              }
            }
          },
          "prevUrl": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "nextUrl": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          }
        }
      },
      "AnswersTopPlace": {
        "type": "object",
        "required": [
          "rank",
          "placeId",
          "name",
          "url",
          "jsonUrl",
          "fit",
          "score",
          "distanceMi"
        ],
        "additionalProperties": false,
        "properties": {
          "rank": {
            "type": "integer"
          },
          "placeId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "fit": {
            "type": "number"
          },
          "score": {
            "type": "number"
          },
          "distanceMi": {
            "type": "number"
          }
        }
      },
      "AnswersEntry": {
        "type": "object",
        "required": [
          "question",
          "url",
          "jsonUrl",
          "markdownUrl",
          "market",
          "anchor",
          "anchorUrl",
          "need",
          "answer",
          "asOf",
          "formulaVersion",
          "rankedTotal",
          "top",
          "alternates"
        ],
        "additionalProperties": false,
        "properties": {
          "question": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri"
          },
          "market": {
            "type": "string"
          },
          "anchor": {
            "type": "string"
          },
          "anchorUrl": {
            "type": "string",
            "format": "uri"
          },
          "need": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "formulaVersion": {
            "type": "string"
          },
          "rankedTotal": {
            "type": "integer"
          },
          "top": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AnswersTopPlace"
            },
            "maxItems": 3
          },
          "alternates": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 12,
            "description": "Other ways travelers ask this question, for matching a request to it."
          }
        }
      },
      "AnswersIndex": {
        "type": "object",
        "description": "Index of every published question (/answers.json). disclosure is present only when the publisher has a parent company; bestOf, guides and walking when the build has such pages.",
        "required": [
          "schemaVersion",
          "name",
          "description",
          "asOf",
          "count",
          "formulaVersions",
          "citation",
          "docs",
          "markets",
          "questions"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "name": {
            "type": "string"
          },
          "disclosure": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "count": {
            "type": "integer"
          },
          "formulaVersions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "citation": {
            "type": "object",
            "description": "How to cite a page of this site.",
            "required": [
              "name",
              "url",
              "format",
              "sources",
              "scores"
            ],
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string"
              },
              "url": {
                "type": "string"
              },
              "format": {
                "type": "string"
              },
              "sources": {
                "type": "string"
              },
              "scores": {
                "type": "string"
              }
            }
          },
          "docs": {
            "type": "object",
            "required": [
              "llms",
              "llmsFull",
              "openapi",
              "methodology",
              "agents"
            ],
            "additionalProperties": false,
            "properties": {
              "llms": {
                "type": "string",
                "format": "uri"
              },
              "llmsFull": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              },
              "agents": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "uri"
              },
              "hotelAnswers": {
                "type": "string",
                "format": "uri"
              },
              "mcp": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "markets": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "hubUrl",
                "anchorsUrl",
                "placesUrl"
              ],
              "additionalProperties": false,
              "properties": {
                "name": {
                  "type": "string"
                },
                "hubUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "anchorsUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "placesUrl": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "questions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AnswersEntry"
            }
          },
          "bestOf": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A best-of page (\"Best hotels near <place>\"): its two-sentence answer and top three by the published best-of formula.",
              "required": [
                "title",
                "url",
                "jsonUrl",
                "markdownUrl",
                "market",
                "kind",
                "anchor",
                "anchorUrl",
                "answer",
                "asOf",
                "formulaVersion",
                "considered",
                "eligible",
                "top",
                "alternates"
              ],
              "additionalProperties": false,
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "jsonUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "markdownUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "market": {
                  "type": "string"
                },
                "kind": {
                  "enum": [
                    "anchor",
                    "need"
                  ]
                },
                "anchor": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "anchorUrl": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "uri"
                },
                "answer": {
                  "type": "string"
                },
                "asOf": {
                  "type": "string",
                  "format": "date"
                },
                "formulaVersion": {
                  "type": "string"
                },
                "considered": {
                  "type": "integer"
                },
                "eligible": {
                  "type": "integer"
                },
                "top": {
                  "type": "array",
                  "maxItems": 3,
                  "items": {
                    "type": "object",
                    "required": [
                      "rank",
                      "placeId",
                      "name",
                      "url",
                      "jsonUrl",
                      "points",
                      "score",
                      "distanceMi"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "rank": {
                        "type": "integer"
                      },
                      "placeId": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      },
                      "url": {
                        "type": "string",
                        "format": "uri"
                      },
                      "jsonUrl": {
                        "type": "string",
                        "format": "uri"
                      },
                      "points": {
                        "type": "number"
                      },
                      "score": {
                        "type": "number"
                      },
                      "distanceMi": {
                        "type": [
                          "number",
                          "null"
                        ]
                      }
                    }
                  }
                },
                "alternates": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "maxItems": 8
                }
              }
            }
          },
          "guides": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "title",
                "kind",
                "url",
                "jsonUrl",
                "markdownUrl",
                "dateModified",
                "questions"
              ],
              "additionalProperties": false,
              "properties": {
                "title": {
                  "type": "string"
                },
                "kind": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "jsonUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "markdownUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "dateModified": {
                  "type": "string",
                  "format": "date"
                },
                "questions": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "walking": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A walking page (\"Hotels within walking distance of <place>\"): its two-sentence answer, how many hotels are within 10, 20 and 30 minutes on foot and the three shortest walks. walkMin is an estimate along OpenStreetMap paths (map data of mapDataOn).",
              "required": [
                "title",
                "url",
                "jsonUrl",
                "markdownUrl",
                "market",
                "anchor",
                "anchorUrl",
                "answer",
                "asOf",
                "mapDataOn",
                "total",
                "within",
                "top",
                "alternates"
              ],
              "additionalProperties": false,
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "jsonUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "markdownUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "market": {
                  "type": "string"
                },
                "anchor": {
                  "type": "string"
                },
                "anchorUrl": {
                  "type": "string",
                  "format": "uri"
                },
                "answer": {
                  "type": "string"
                },
                "asOf": {
                  "type": "string",
                  "format": "date"
                },
                "mapDataOn": {
                  "type": "string",
                  "format": "date"
                },
                "total": {
                  "type": "integer"
                },
                "within": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "minutes",
                      "hotels"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "minutes": {
                        "type": "integer"
                      },
                      "hotels": {
                        "type": "integer"
                      }
                    }
                  }
                },
                "top": {
                  "type": "array",
                  "maxItems": 3,
                  "items": {
                    "type": "object",
                    "required": [
                      "rank",
                      "placeId",
                      "name",
                      "url",
                      "jsonUrl",
                      "walkMin",
                      "walkMi",
                      "distanceMi"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "rank": {
                        "type": "integer"
                      },
                      "placeId": {
                        "type": "string"
                      },
                      "name": {
                        "type": "string"
                      },
                      "url": {
                        "type": "string",
                        "format": "uri"
                      },
                      "jsonUrl": {
                        "type": "string",
                        "format": "uri"
                      },
                      "walkMin": {
                        "type": "integer"
                      },
                      "walkMi": {
                        "type": "number"
                      },
                      "distanceMi": {
                        "type": "number"
                      }
                    }
                  }
                },
                "alternates": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "maxItems": 8
                }
              }
            }
          }
        }
      },
      "Need": {
        "type": "object",
        "description": "A traveler need: words people use for it (hints, not exhaustive) and the fact keys that answer it. Empty factKeys: distance alone answers it.",
        "required": [
          "id",
          "label",
          "words",
          "factKeys"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "words": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "factKeys": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "AnchorQuestion": {
        "type": "object",
        "required": [
          "need",
          "question",
          "url",
          "jsonUrl",
          "markdownUrl"
        ],
        "additionalProperties": false,
        "properties": {
          "need": {
            "type": "string"
          },
          "question": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "AnchorIndexEntry": {
        "type": "object",
        "description": "One anchor (airport, venue, campus, neighborhood): its other names, its hub, its facts file and the published questions about it, each tagged with a need id.",
        "required": [
          "slug",
          "name",
          "kind",
          "aliases",
          "lat",
          "lon",
          "hubRadiusMi",
          "radiusMi",
          "hotelsInRadius",
          "url",
          "jsonUrl",
          "markdownUrl",
          "factsUrl",
          "questions"
        ],
        "additionalProperties": false,
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "aliases": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          },
          "hubRadiusMi": {
            "type": "number"
          },
          "radiusMi": {
            "type": "number",
            "description": "Radius of factsUrl: the hub radius or the widest radius of a published question about this anchor, whichever is larger."
          },
          "hotelsInRadius": {
            "type": "integer"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri"
          },
          "factsUrl": {
            "type": "string",
            "format": "uri"
          },
          "questions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AnchorQuestion"
            }
          }
        }
      },
      "AnchorIndex": {
        "type": "object",
        "description": "Routing index of one market (/agents/<category>/<market>/anchors.json): map a request to an anchor (name or alias) and a need, then to a question or to the anchor facts file.",
        "required": [
          "schemaVersion",
          "type",
          "jsonUrl",
          "asOf",
          "publisher",
          "market",
          "description",
          "marketHubUrl",
          "placesUrl",
          "factIndexUrl",
          "answersUrl",
          "steps",
          "needs",
          "anchors",
          "marketQuestions"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "type": {
            "const": "anchor-index"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "market": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "marketHubUrl": {
            "type": "string",
            "format": "uri"
          },
          "placesUrl": {
            "type": "string",
            "format": "uri"
          },
          "factIndexUrl": {
            "type": "string",
            "format": "uri"
          },
          "answersUrl": {
            "type": "string",
            "format": "uri"
          },
          "steps": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "needs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Need"
            }
          },
          "anchors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AnchorIndexEntry"
            }
          },
          "marketQuestions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AnchorQuestion"
            }
          }
        }
      },
      "CompactFact": {
        "type": "object",
        "description": "A verified fact. source is the page URL it was read from, or the dataset id. License basis and source label are in the place JSON twin.",
        "required": [
          "key",
          "text",
          "value",
          "unit",
          "source",
          "checkedOn"
        ],
        "additionalProperties": false,
        "properties": {
          "key": {
            "type": "string"
          },
          "text": {
            "type": "string"
          },
          "value": {
            "type": [
              "string",
              "null"
            ]
          },
          "unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "source": {
            "type": "string"
          },
          "checkedOn": {
            "type": "string",
            "format": "date"
          }
        }
      },
      "AnchorFactsHotel": {
        "type": "object",
        "required": [
          "placeId",
          "name",
          "url",
          "jsonUrl",
          "distanceMi",
          "score",
          "lat",
          "lon",
          "address",
          "phone",
          "website",
          "facts"
        ],
        "additionalProperties": false,
        "properties": {
          "placeId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "distanceMi": {
            "type": "number"
          },
          "score": {
            "type": [
              "number",
              "null"
            ]
          },
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          },
          "address": {
            "type": [
              "string",
              "null"
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ]
          },
          "website": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "facts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompactFact"
            }
          }
        }
      },
      "AnchorFacts": {
        "type": "object",
        "description": "Every scored hotel within an anchor radius, nearest first, with contact and every verified fact (/agents/<category>/<market>/facts/<anchor>.json). No ranking: filter it, reading each fact text or value (a fact can be a verified no, such as \"No pets\"). A missing fact is unverified, not false. One hotel per line.",
        "required": [
          "schemaVersion",
          "type",
          "jsonUrl",
          "asOf",
          "publisher",
          "market",
          "description",
          "anchor",
          "contactSource",
          "count",
          "factCounts",
          "hotels"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "type": {
            "const": "anchor-facts"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "market": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "anchor": {
            "type": "object",
            "required": [
              "slug",
              "name",
              "url",
              "jsonUrl",
              "lat",
              "lon",
              "radiusMi"
            ],
            "additionalProperties": false,
            "properties": {
              "slug": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "url": {
                "type": "string",
                "format": "uri"
              },
              "jsonUrl": {
                "type": "string",
                "format": "uri"
              },
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "radiusMi": {
                "type": "number"
              }
            }
          },
          "contactSource": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Source"
              },
              {
                "type": "null"
              }
            ]
          },
          "count": {
            "type": "integer"
          },
          "factCounts": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            },
            "description": "Fact key -> how many hotels in this file have it verified, as a yes or a no."
          },
          "hotels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AnchorFactsHotel"
            }
          }
        }
      },
      "DirectoryPlace": {
        "type": "object",
        "description": "One hotel of the place directory. formerNames (present only for a renamed hotel) lists the names it carried before: also known as.",
        "required": [
          "placeId",
          "name",
          "url",
          "jsonUrl",
          "lat",
          "lon",
          "address",
          "phone",
          "website",
          "score",
          "factKeys",
          "nearAnchors",
          "qaCount"
        ],
        "additionalProperties": false,
        "properties": {
          "placeId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          },
          "address": {
            "type": [
              "string",
              "null"
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ]
          },
          "website": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "score": {
            "type": [
              "number",
              "null"
            ]
          },
          "factKeys": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "nearAnchors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "slug",
                "distanceMi"
              ],
              "additionalProperties": false,
              "properties": {
                "slug": {
                  "type": "string"
                },
                "distanceMi": {
                  "type": "number"
                }
              }
            }
          },
          "qaCount": {
            "type": "integer"
          },
          "formerNames": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "FactIndexKey": {
        "type": "object",
        "description": "One fact key of the dictionary: meaning, group, value kind, unit, allowed values (closed vocabularies) and how many hotels of the market have it verified.",
        "required": [
          "key",
          "label",
          "group",
          "kind",
          "unit",
          "values",
          "hotels"
        ],
        "additionalProperties": false,
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "group": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "values": {
            "oneOf": [
              {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "value",
                    "label"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "value": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    }
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "hotels": {
            "type": "integer"
          }
        }
      },
      "FactIndexHotel": {
        "type": "object",
        "description": "One hotel of the fact index: every verified fact beyond contact details as its stored value, tied to the source and date it came from.",
        "required": [
          "placeId",
          "name",
          "url",
          "jsonUrl",
          "sources",
          "facts"
        ],
        "additionalProperties": false,
        "properties": {
          "placeId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "string"
                },
                {
                  "type": "string",
                  "format": "date"
                }
              ],
              "items": {
                "type": "string"
              },
              "minItems": 2,
              "maxItems": 2,
              "description": "[page URL or dataset id, checked date]"
            }
          },
          "facts": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "string"
                },
                {
                  "type": "integer"
                }
              ],
              "items": {
                "type": [
                  "string",
                  "integer"
                ]
              },
              "minItems": 2,
              "maxItems": 2
            },
            "description": "fact key -> [stored value, index into sources]"
          }
        }
      },
      "FactIndex": {
        "type": "object",
        "description": "The fact dictionary and compact fact index of one market (/agents/<category>/<market>/facts.json): every fact key that can exist, and every hotel with at least one verified fact, one per line. A key missing from a hotel is unknown, not absent.",
        "required": [
          "schemaVersion",
          "type",
          "jsonUrl",
          "asOf",
          "publisher",
          "market",
          "description",
          "placesUrl",
          "anchorsUrl",
          "valueKinds",
          "groups",
          "keys",
          "hotelsInMarket",
          "count",
          "hotels"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "type": {
            "const": "fact-index"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "market": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "placesUrl": {
            "type": "string",
            "format": "uri"
          },
          "anchorsUrl": {
            "type": "string",
            "format": "uri"
          },
          "valueKinds": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "groups": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "label"
              ],
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                }
              }
            }
          },
          "keys": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FactIndexKey"
            }
          },
          "hotelsInMarket": {
            "type": "integer"
          },
          "count": {
            "type": "integer"
          },
          "hotels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FactIndexHotel"
            }
          }
        }
      },
      "PlaceDirectory": {
        "type": "object",
        "description": "Every active place in one market (/agents/<category>/<market>/places.json), one per line, with the fact keys verified for it and the anchors within 3 miles. Large: for lookups by name or for code.",
        "required": [
          "schemaVersion",
          "type",
          "jsonUrl",
          "asOf",
          "publisher",
          "market",
          "description",
          "contactSource",
          "count",
          "places"
        ],
        "additionalProperties": false,
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "const": 1
          },
          "type": {
            "const": "place-directory"
          },
          "jsonUrl": {
            "type": "string",
            "format": "uri"
          },
          "asOf": {
            "type": "string",
            "format": "date"
          },
          "publisher": {
            "$ref": "#/components/schemas/Publisher"
          },
          "market": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "contactSource": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Source"
              },
              {
                "type": "null"
              }
            ]
          },
          "count": {
            "type": "integer"
          },
          "places": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DirectoryPlace"
            }
          }
        }
      }
    }
  }
}
