{
 "openapi": "3.1.0",
 "info": {
  "title": "Visit Lomma public API",
  "version": "1.0.0",
  "description": "Read-only, unauthenticated API for the independent Visit Lomma guide to Lomma and Bjärred, Skåne, Sweden. Not an official municipal tourism source. Opening hours, prices, menus, ratings and reviews are deliberately not included. Facts (location, links, sources) are separated from editorial opinion (`editorial`, `is_opinion: true`). Please attribute 'Visit Lomma' and link to each item's `url`. No MCP endpoint exists yet."
 },
 "servers": [
  {
   "url": "https://visitlomma.com"
  }
 ],
 "paths": {
  "/api/v1/places": {
   "get": {
    "summary": "List places (food & drink, sights, activities, day trips)",
    "operationId": "listPlaces",
    "parameters": [
     {
      "name": "lang",
      "in": "query",
      "description": "Response language. Untranslated strings fall back to English.",
      "schema": {
       "type": "string",
       "enum": [
        "sv",
        "en",
        "de",
        "da",
        "nl",
        "pl",
        "fr"
       ],
       "default": "en"
      }
     },
     {
      "name": "area",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "lomma",
        "bjarred",
        "borgeby",
        "fladie",
        "alnarp",
        "fjelie",
        "region"
       ]
      }
     },
     {
      "name": "category",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "thai",
        "asian",
        "pizza",
        "italian",
        "sushi",
        "seafood",
        "steak",
        "bistro",
        "burgers",
        "cafe",
        "bakery",
        "icecream",
        "wine",
        "pub",
        "tapas",
        "beach",
        "nature",
        "birding",
        "heritage",
        "park",
        "tennis",
        "padel",
        "cycling",
        "watersports",
        "sailing",
        "music",
        "culture",
        "city",
        "osterlen",
        "kullabygden",
        "bjarehalvon"
       ]
      }
     },
     {
      "name": "tag",
      "in": "query",
      "description": "Editorial suitability tag.",
      "schema": {
       "type": "string",
       "enum": [
        "family",
        "couples",
        "rainy",
        "waterfront",
        "takeaway",
        "accessible"
       ]
      }
     },
     {
      "name": "kind",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "eat",
        "see",
        "do",
        "trip"
       ]
      }
     },
     {
      "name": "status",
      "in": "query",
      "description": "verified = confirmed on an official/primary source; check = needs validation.",
      "schema": {
       "type": "string",
       "enum": [
        "verified",
        "check"
       ]
      }
     },
     {
      "name": "q",
      "in": "query",
      "description": "Free-text search (name, area, description, categories).",
      "schema": {
       "type": "string",
       "maxLength": 80
      }
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 100,
       "default": 20
      }
     },
     {
      "name": "offset",
      "in": "query",
      "schema": {
       "type": "integer",
       "minimum": 0,
       "default": 0
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "ETag": {
        "schema": {
         "type": "string"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "data",
          "pagination",
          "meta"
         ],
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Place"
           }
          },
          "pagination": {
           "$ref": "#/components/schemas/Pagination"
          },
          "meta": {
           "$ref": "#/components/schemas/Meta"
          }
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid query parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (120 requests / 60s per client, best effort)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/places/{id}": {
   "get": {
    "summary": "Get one place",
    "operationId": "getPlace",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Stable id (URL slug)."
     },
     {
      "name": "lang",
      "in": "query",
      "description": "Response language. Untranslated strings fall back to English.",
      "schema": {
       "type": "string",
       "enum": [
        "sv",
        "en",
        "de",
        "da",
        "nl",
        "pl",
        "fr"
       ],
       "default": "en"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "ETag": {
        "schema": {
         "type": "string"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "data",
          "meta"
         ],
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Place"
          },
          "meta": {
           "$ref": "#/components/schemas/Meta"
          }
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid query parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Unknown id",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (120 requests / 60s per client, best effort)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/experiences": {
   "get": {
    "summary": "List experiences (sights, activities, day trips — everything except food & drink)",
    "operationId": "listExperiences",
    "parameters": [
     {
      "name": "lang",
      "in": "query",
      "description": "Response language. Untranslated strings fall back to English.",
      "schema": {
       "type": "string",
       "enum": [
        "sv",
        "en",
        "de",
        "da",
        "nl",
        "pl",
        "fr"
       ],
       "default": "en"
      }
     },
     {
      "name": "area",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "lomma",
        "bjarred",
        "borgeby",
        "fladie",
        "alnarp",
        "fjelie",
        "region"
       ]
      }
     },
     {
      "name": "category",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "thai",
        "asian",
        "pizza",
        "italian",
        "sushi",
        "seafood",
        "steak",
        "bistro",
        "burgers",
        "cafe",
        "bakery",
        "icecream",
        "wine",
        "pub",
        "tapas",
        "beach",
        "nature",
        "birding",
        "heritage",
        "park",
        "tennis",
        "padel",
        "cycling",
        "watersports",
        "sailing",
        "music",
        "culture",
        "city",
        "osterlen",
        "kullabygden",
        "bjarehalvon"
       ]
      }
     },
     {
      "name": "tag",
      "in": "query",
      "description": "Editorial suitability tag.",
      "schema": {
       "type": "string",
       "enum": [
        "family",
        "couples",
        "rainy",
        "waterfront",
        "takeaway",
        "accessible"
       ]
      }
     },
     {
      "name": "kind",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "see",
        "do",
        "trip"
       ]
      }
     },
     {
      "name": "status",
      "in": "query",
      "description": "verified = confirmed on an official/primary source; check = needs validation.",
      "schema": {
       "type": "string",
       "enum": [
        "verified",
        "check"
       ]
      }
     },
     {
      "name": "q",
      "in": "query",
      "description": "Free-text search (name, area, description, categories).",
      "schema": {
       "type": "string",
       "maxLength": 80
      }
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 100,
       "default": 20
      }
     },
     {
      "name": "offset",
      "in": "query",
      "schema": {
       "type": "integer",
       "minimum": 0,
       "default": 0
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "ETag": {
        "schema": {
         "type": "string"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "data",
          "pagination",
          "meta"
         ],
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Place"
           }
          },
          "pagination": {
           "$ref": "#/components/schemas/Pagination"
          },
          "meta": {
           "$ref": "#/components/schemas/Meta"
          }
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid query parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (120 requests / 60s per client, best effort)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/experiences/{id}": {
   "get": {
    "summary": "Get one experience",
    "operationId": "getExperience",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Stable id (URL slug)."
     },
     {
      "name": "lang",
      "in": "query",
      "description": "Response language. Untranslated strings fall back to English.",
      "schema": {
       "type": "string",
       "enum": [
        "sv",
        "en",
        "de",
        "da",
        "nl",
        "pl",
        "fr"
       ],
       "default": "en"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "ETag": {
        "schema": {
         "type": "string"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "data",
          "meta"
         ],
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Place"
          },
          "meta": {
           "$ref": "#/components/schemas/Meta"
          }
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid query parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Unknown id",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (120 requests / 60s per client, best effort)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/areas": {
   "get": {
    "summary": "List towns and villages",
    "operationId": "listAreas",
    "parameters": [
     {
      "name": "lang",
      "in": "query",
      "description": "Response language. Untranslated strings fall back to English.",
      "schema": {
       "type": "string",
       "enum": [
        "sv",
        "en",
        "de",
        "da",
        "nl",
        "pl",
        "fr"
       ],
       "default": "en"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "ETag": {
        "schema": {
         "type": "string"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "data",
          "pagination",
          "meta"
         ],
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Area"
           }
          },
          "pagination": {
           "$ref": "#/components/schemas/Pagination"
          },
          "meta": {
           "$ref": "#/components/schemas/Meta"
          }
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid query parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (120 requests / 60s per client, best effort)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/areas/{id}": {
   "get": {
    "summary": "Get one town or village",
    "operationId": "getArea",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Stable id (URL slug)."
     },
     {
      "name": "lang",
      "in": "query",
      "description": "Response language. Untranslated strings fall back to English.",
      "schema": {
       "type": "string",
       "enum": [
        "sv",
        "en",
        "de",
        "da",
        "nl",
        "pl",
        "fr"
       ],
       "default": "en"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "ETag": {
        "schema": {
         "type": "string"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "data",
          "meta"
         ],
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Area"
          },
          "meta": {
           "$ref": "#/components/schemas/Meta"
          }
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid query parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Unknown id",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (120 requests / 60s per client, best effort)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/guides": {
   "get": {
    "summary": "List answer guides (editorial answers to common visitor questions)",
    "operationId": "listGuides",
    "parameters": [
     {
      "name": "lang",
      "in": "query",
      "description": "Response language. Untranslated strings fall back to English.",
      "schema": {
       "type": "string",
       "enum": [
        "sv",
        "en",
        "de",
        "da",
        "nl",
        "pl",
        "fr"
       ],
       "default": "en"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "ETag": {
        "schema": {
         "type": "string"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "data",
          "pagination",
          "meta"
         ],
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Guide"
           }
          },
          "pagination": {
           "$ref": "#/components/schemas/Pagination"
          },
          "meta": {
           "$ref": "#/components/schemas/Meta"
          }
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid query parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (120 requests / 60s per client, best effort)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/guides/{id}": {
   "get": {
    "summary": "Get one answer guide",
    "operationId": "getGuide",
    "parameters": [
     {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Stable id (URL slug)."
     },
     {
      "name": "lang",
      "in": "query",
      "description": "Response language. Untranslated strings fall back to English.",
      "schema": {
       "type": "string",
       "enum": [
        "sv",
        "en",
        "de",
        "da",
        "nl",
        "pl",
        "fr"
       ],
       "default": "en"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "ETag": {
        "schema": {
         "type": "string"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "data",
          "meta"
         ],
         "properties": {
          "data": {
           "$ref": "#/components/schemas/Guide"
          },
          "meta": {
           "$ref": "#/components/schemas/Meta"
          }
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid query parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Unknown id",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (120 requests / 60s per client, best effort)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/events": {
   "get": {
    "summary": "List events. Only organiser-confirmed events carry dates; recurring items without confirmed dates have dates=null.",
    "operationId": "listEvents",
    "parameters": [
     {
      "name": "lang",
      "in": "query",
      "description": "Response language. Untranslated strings fall back to English.",
      "schema": {
       "type": "string",
       "enum": [
        "sv",
        "en",
        "de",
        "da",
        "nl",
        "pl",
        "fr"
       ],
       "default": "en"
      }
     },
     {
      "name": "area",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "lomma",
        "bjarred",
        "borgeby",
        "fladie",
        "alnarp",
        "fjelie",
        "region"
       ]
      }
     },
     {
      "name": "phase",
      "in": "query",
      "schema": {
       "type": "string",
       "enum": [
        "upcoming",
        "ongoing",
        "past",
        "recurring"
       ]
      }
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 100,
       "default": 20
      }
     },
     {
      "name": "offset",
      "in": "query",
      "schema": {
       "type": "integer",
       "minimum": 0,
       "default": 0
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "headers": {
       "ETag": {
        "schema": {
         "type": "string"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "data",
          "pagination",
          "meta"
         ],
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Event"
           }
          },
          "pagination": {
           "$ref": "#/components/schemas/Pagination"
          },
          "meta": {
           "$ref": "#/components/schemas/Meta"
          }
         }
        }
       }
      }
     },
     "400": {
      "description": "Invalid query parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Rate limited (120 requests / 60s per client, best effort)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  }
 },
 "components": {
  "schemas": {
   "Error": {
    "type": "object",
    "required": [
     "error"
    ],
    "properties": {
     "error": {
      "type": "object",
      "required": [
       "status",
       "code",
       "message"
      ],
      "properties": {
       "status": {
        "type": "integer"
       },
       "code": {
        "type": "string"
       },
       "message": {
        "type": "string"
       },
       "details": {
        "type": "array",
        "items": {
         "type": "object"
        }
       }
      }
     }
    }
   },
   "Pagination": {
    "type": "object",
    "required": [
     "total",
     "limit",
     "offset",
     "next",
     "prev"
    ],
    "properties": {
     "total": {
      "type": "integer"
     },
     "limit": {
      "type": "integer"
     },
     "offset": {
      "type": "integer"
     },
     "next": {
      "type": [
       "string",
       "null"
      ]
     },
     "prev": {
      "type": [
       "string",
       "null"
      ]
     }
    }
   },
   "Meta": {
    "type": "object",
    "properties": {
     "api_version": {
      "type": "string"
     },
     "language": {
      "type": "string"
     },
     "available_languages": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "generated_on": {
      "type": "string",
      "format": "date"
     },
     "dataset_last_checked": {
      "type": "string",
      "format": "date"
     },
     "source": {
      "type": "object"
     },
     "attribution": {
      "type": "string"
     },
     "not_included": {
      "type": "string"
     },
     "docs": {
      "type": "string"
     }
    }
   },
   "Place": {
    "type": "object",
    "required": [
     "id",
     "kind",
     "name",
     "url",
     "area",
     "categories",
     "description",
     "editorial",
     "location",
     "links",
     "media",
     "operating_info",
     "suitability",
     "provenance",
     "last_updated"
    ],
    "properties": {
     "id": {
      "type": "string",
      "description": "Stable id; also the page slug."
     },
     "kind": {
      "type": "string",
      "enum": [
       "eat",
       "see",
       "do",
       "trip"
      ]
     },
     "schema_types": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "schema.org types used on the page."
     },
     "name": {
      "type": "string"
     },
     "url": {
      "type": "string",
      "format": "uri",
      "description": "Canonical page in the requested language."
     },
     "language": {
      "type": "string"
     },
     "area": {
      "type": "object",
      "properties": {
       "id": {
        "type": "string"
       },
       "name": {
        "type": "string"
       },
       "url": {
        "type": [
         "string",
         "null"
        ]
       }
      }
     },
     "categories": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string"
        },
        "label": {
         "type": "string"
        }
       }
      }
     },
     "tags": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string"
        },
        "label": {
         "type": "string"
        }
       }
      }
     },
     "featured": {
      "type": "boolean"
     },
     "description": {
      "type": "string",
      "description": "Factual summary."
     },
     "editorial": {
      "type": "object",
      "properties": {
       "why_go": {
        "type": "string"
       },
       "tip": {
        "type": [
         "string",
         "null"
        ]
       },
       "is_opinion": {
        "const": true
       },
       "author": {
        "type": "string"
       }
      }
     },
     "notice": {
      "oneOf": [
       {
        "type": "object",
        "properties": {
         "text": {
          "type": "string"
         },
         "kind": {
          "const": "access_rule"
         }
        }
       },
       {
        "type": "null"
       }
      ]
     },
     "location": {
      "type": "object",
      "properties": {
       "address": {
        "type": [
         "string",
         "null"
        ]
       },
       "postal_address": {
        "type": [
         "object",
         "null"
        ]
       },
       "geo": {
        "oneOf": [
         {
          "type": "object",
          "properties": {
           "latitude": {
            "type": "number"
           },
           "longitude": {
            "type": "number"
           },
           "precision": {
            "const": "approximate"
           },
           "source": {
            "type": "string"
           },
           "verified_listing": {
            "type": "boolean"
           }
          }
         },
         {
          "type": "null"
         }
        ]
       },
       "map_url": {
        "type": "string"
       }
      }
     },
     "links": {
      "type": "object",
      "properties": {
       "website": {
        "type": [
         "string",
         "null"
        ]
       },
       "booking": {
        "type": [
         "string",
         "null"
        ]
       },
       "booking_provider": {
        "type": [
         "string",
         "null"
        ]
       }
      }
     },
     "media": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string"
        },
        "type": {
         "type": "string",
         "enum": [
          "photo",
          "illustration"
         ]
        },
        "url": {
         "type": "string"
        },
        "alt": {
         "type": "string"
        },
        "credit": {
         "type": "string"
        },
        "license": {
         "type": "string"
        },
        "license_url": {
         "type": [
          "string",
          "null"
         ]
        },
        "source_url": {
         "type": [
          "string",
          "null"
         ]
        },
        "provider": {
         "type": "string"
        },
        "depicts_this_place": {
         "type": "boolean"
        }
       }
      }
     },
     "operating_info": {
      "type": "object",
      "properties": {
       "opening_hours": {
        "type": "null"
       },
       "opening_hours_status": {
        "const": "not_published"
       },
       "advice": {
        "type": "string"
       },
       "seasonal_note": {
        "type": [
         "string",
         "null"
        ]
       }
      }
     },
     "suitability": {
      "type": "object",
      "additionalProperties": {
       "type": "object",
       "description": "value=true with confidence=editorial means our editors judged it suitable; value=null means unknown (not 'no').",
       "properties": {
        "value": {
         "type": [
          "boolean",
          "null"
         ]
        },
        "confidence": {
         "type": "string",
         "enum": [
          "editorial",
          "unknown"
         ]
        }
       }
      }
     },
     "provenance": {
      "type": "object",
      "properties": {
       "status": {
        "type": "string",
        "enum": [
         "verified",
         "check"
        ]
       },
       "status_note": {
        "type": [
         "string",
         "null"
        ]
       },
       "sources": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "label": {
           "type": "string"
          },
          "url": {
           "type": "string",
           "format": "uri"
          }
         }
        }
       },
       "freshness": {
        "type": "object",
        "description": "Derived from last_checked and the published freshness policy. Never moved forward automatically.",
        "properties": {
         "state": {
          "type": "string",
          "enum": [
           "fresh",
           "due",
           "stale"
          ]
         },
         "last_checked": {
          "type": "string",
          "format": "date"
         },
         "age_days": {
          "type": "integer"
         },
         "due_after_days": {
          "type": "integer"
         },
         "stale_after_days": {
          "type": "integer"
         }
        }
       }
      }
     },
     "related": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Nearby place ids."
     },
     "guides": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Guide ids that feature this place."
     },
     "last_updated": {
      "type": "string",
      "format": "date"
     }
    }
   },
   "Area": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "url": {
      "type": "string"
     },
     "summary": {
      "type": "string"
     },
     "description": {
      "type": "string"
     },
     "place_ids": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "counts": {
      "type": "object"
     },
     "provenance": {
      "type": "object",
      "properties": {
       "sources": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "label": {
           "type": "string"
          },
          "url": {
           "type": "string",
           "format": "uri"
          }
         }
        }
       }
      }
     },
     "last_updated": {
      "type": "string",
      "format": "date"
     }
    }
   },
   "Guide": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "theme": {
      "type": "string"
     },
     "question": {
      "type": "string"
     },
     "title": {
      "type": "string"
     },
     "answer": {
      "type": "string",
      "description": "Direct answer shown first on the page."
     },
     "url": {
      "type": "string"
     },
     "language": {
      "type": "string"
     },
     "sections": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "heading": {
         "type": "string"
        },
        "body": {
         "type": "string"
        },
        "place_ids": {
         "type": "array",
         "items": {
          "type": "string"
         }
        }
       }
      }
     },
     "related_place_ids": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "is_editorial": {
      "const": true
     },
     "provenance": {
      "type": "object",
      "properties": {
       "sources": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "label": {
           "type": "string"
          },
          "url": {
           "type": "string",
           "format": "uri"
          }
         }
        }
       },
       "freshness": {
        "type": "object",
        "description": "Derived from last_checked and the published freshness policy. Never moved forward automatically.",
        "properties": {
         "state": {
          "type": "string",
          "enum": [
           "fresh",
           "due",
           "stale"
          ]
         },
         "last_checked": {
          "type": "string",
          "format": "date"
         },
         "age_days": {
          "type": "integer"
         },
         "due_after_days": {
          "type": "integer"
         },
         "stale_after_days": {
          "type": "integer"
         }
        }
       }
      }
     },
     "last_updated": {
      "type": "string",
      "format": "date"
     }
    }
   },
   "Event": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "title": {
      "type": "string"
     },
     "summary": {
      "type": "string"
     },
     "venue": {
      "type": "string"
     },
     "place_id": {
      "type": [
       "string",
       "null"
      ]
     },
     "area": {
      "type": "object"
     },
     "phase": {
      "type": "string",
      "enum": [
       "upcoming",
       "ongoing",
       "past",
       "recurring"
      ]
     },
     "dates": {
      "oneOf": [
       {
        "type": "object",
        "properties": {
         "start": {
          "type": "string",
          "format": "date"
         },
         "end": {
          "type": "string",
          "format": "date"
         },
         "confirmed": {
          "const": true
         },
         "timezone": {
          "type": "string"
         }
        }
       },
       {
        "type": "null"
       }
      ]
     },
     "usual_timing": {
      "type": [
       "string",
       "null"
      ]
     },
     "url": {
      "type": "string"
     },
     "provenance": {
      "type": "object",
      "properties": {
       "sources": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "label": {
           "type": "string"
          },
          "url": {
           "type": "string",
           "format": "uri"
          }
         }
        }
       },
       "freshness": {
        "type": "object",
        "description": "Derived from last_checked and the published freshness policy. Never moved forward automatically.",
        "properties": {
         "state": {
          "type": "string",
          "enum": [
           "fresh",
           "due",
           "stale"
          ]
         },
         "last_checked": {
          "type": "string",
          "format": "date"
         },
         "age_days": {
          "type": "integer"
         },
         "due_after_days": {
          "type": "integer"
         },
         "stale_after_days": {
          "type": "integer"
         }
        }
       }
      }
     },
     "last_updated": {
      "type": "string",
      "format": "date"
     }
    }
   }
  }
 }
}