{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/bissl-at/json-schema/bissl-at-venue-answer-schema.json",
  "title": "VenueAnswer",
  "x-generated": "2026-11-02",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/bissl-at-openapi.json#/components/schemas/VenueAnswer",
  "properties": {
    "attribution": {
      "type": "string"
    },
    "checked_on": {
      "description": "The day its menus were last read from its website, or the day a visitor sent the\nphotos they were read from.",
      "format": "date",
      "type": [
        "string",
        "null"
      ]
    },
    "email": {
      "description": "Its email address, as its own website gives it: \"info@figlmueller.at\".",
      "type": [
        "string",
        "null"
      ]
    },
    "menu_source": {
      "anyOf": [
        {
          "$ref": "#/$defs/MenuSource"
        },
        {
          "enum": [
            null
          ],
          "nullable": true
        }
      ],
      "description": "Where its menus were read: \"website\", its own website, or \"visitor_photo\", photos of\nits printed menu a visitor sent and bissl checked. Null when it has no menu."
    },
    "menus": {
      "description": "Its regular food and drinks, and its lunch of this week; none when bissl has no\nmenu of it.",
      "items": {
        "$ref": "#/$defs/Menu"
      },
      "type": "array"
    },
    "opening_hours": {
      "description": "Its opening hours in OpenStreetMap's syntax: \"Mo-Fr 11:00-22:00; Sa 12:00-22:00\".",
      "type": [
        "string",
        "null"
      ]
    },
    "phone": {
      "description": "Its phone number, Austrian, as dialled from abroad without spaces: \"+4315126177\".",
      "type": [
        "string",
        "null"
      ]
    },
    "place": {
      "$ref": "#/$defs/Place"
    },
    "website": {
      "description": "Its own website.",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "place",
    "phone",
    "email",
    "website",
    "opening_hours",
    "checked_on",
    "menu_source",
    "menus",
    "attribution"
  ],
  "type": "object",
  "$defs": {
    "ApiDiet": {
      "description": "A diet as a menu marks a dish, or the dish's name says it.",
      "oneOf": [
        {
          "enum": [
            "vegan"
          ],
          "type": "string"
        },
        {
          "description": "Vegetarian, vegan dishes included.",
          "enum": [
            "vegetarian"
          ],
          "type": "string"
        }
      ]
    },
    "Dish": {
      "description": "A dish or drink on a menu, the same in every answer.",
      "properties": {
        "allergens": {
          "description": "The allergen letters its menu lists, by the Austrian codes (A gluten, B\ncrustaceans, C egg, D fish, E peanuts, F soy, G milk, H nuts, L celery, M mustard,\nN sesame, O sulphites, P lupin, R molluscs); null when the menu lists none for it,\nwhich is no promise it has none.",
          "type": [
            "string",
            "null"
          ]
        },
        "checked_on": {
          "description": "The day its menu was last read from the venue's website.",
          "format": "date",
          "type": [
            "string",
            "null"
          ]
        },
        "description": {
          "type": "string"
        },
        "diet": {
          "anyOf": [
            {
              "$ref": "#/$defs/ApiDiet"
            },
            {
              "enum": [
                null
              ],
              "nullable": true
            }
          ],
          "description": "Vegan or vegetarian as the menu marks it or its name says; null when neither."
        },
        "id": {
          "description": "bissl's id of the dish on its menu.",
          "format": "int64",
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "prices": {
          "description": "One per size or variant; none when the menu gives no price.",
          "items": {
            "$ref": "#/$defs/Price"
          },
          "type": "array"
        },
        "served_on": {
          "description": "The day a lunch dish is served on; null for what the place always serves.",
          "format": "date",
          "type": [
            "string",
            "null"
          ]
        },
        "url": {
          "description": "The venue's bissl page with this dish marked.",
          "type": "string"
        }
      },
      "required": [
        "id",
        "name",
        "description",
        "prices",
        "diet",
        "allergens",
        "served_on",
        "checked_on",
        "url"
      ],
      "type": "object"
    },
    "Menu": {
      "properties": {
        "kind": {
          "$ref": "#/$defs/MenuKind"
        },
        "sections": {
          "items": {
            "$ref": "#/$defs/MenuSection"
          },
          "type": "array"
        },
        "served": {
          "description": "When a lunch is served, as its page says: \"Mo–Fr · 11:30–14:30\". Lunch only.",
          "type": [
            "string",
            "null"
          ]
        },
        "title": {
          "description": "\"Speisen\", \"Getränke\", \"Mittagsmenü\" - or in English.",
          "type": "string"
        },
        "valid_from": {
          "description": "The first and last day a lunch menu is for, when it says.",
          "format": "date",
          "type": [
            "string",
            "null"
          ]
        },
        "valid_to": {
          "format": "date",
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "kind",
        "title",
        "valid_from",
        "valid_to",
        "served",
        "sections"
      ],
      "type": "object"
    },
    "MenuKind": {
      "enum": [
        "food",
        "drinks",
        "lunch"
      ],
      "type": "string"
    },
    "MenuSection": {
      "description": "A part of a menu, as the venue page's tab: \"Vorspeisen\", a lunch day's \"Mo 5.10.\".",
      "properties": {
        "dishes": {
          "items": {
            "$ref": "#/$defs/Dish"
          },
          "type": "array"
        },
        "title": {
          "description": "Null for a menu of one section.",
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "title",
        "dishes"
      ],
      "type": "object"
    },
    "MenuSource": {
      "description": "Where a place's menus were read.",
      "oneOf": [
        {
          "description": "Its own website.",
          "enum": [
            "website"
          ],
          "type": "string"
        },
        {
          "description": "Photos of its printed menu a visitor sent and bissl checked.",
          "enum": [
            "visitor_photo"
          ],
          "type": "string"
        }
      ]
    },
    "Place": {
      "description": "A place to eat or drink, the same in every answer.",
      "properties": {
        "address": {
          "description": "Street, house number, postcode and town; null when bissl has none.",
          "type": [
            "string",
            "null"
          ]
        },
        "area": {
          "description": "Its district or town, to say where it is: \"7. Neubau\", \"Mödling\"; null outside every\ntown bissl knows. No filter takes it.",
          "type": [
            "string",
            "null"
          ]
        },
        "cuisines": {
          "description": "Its cuisines as OpenStreetMap names them: austrian, italian, pizza, vietnamese...",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "distance_m": {
          "description": "Metres from the point asked about (`lat`, `lon`), when one was given.",
          "format": "int64",
          "type": [
            "integer",
            "null"
          ]
        },
        "kind": {
          "description": "Its kind as OpenStreetMap tags it: restaurant, fast_food, cafe, bar, pub,\nbiergarten, ice_cream, food_court, bakery or pastry.",
          "type": "string"
        },
        "lat": {
          "format": "double",
          "type": "number"
        },
        "lon": {
          "format": "double",
          "type": "number"
        },
        "name": {
          "type": "string"
        },
        "open_now": {
          "description": "Open right now by its opening hours (Vienna's time); null when bissl can't read them.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "part_of": {
          "description": "The larger place it is part of, as its own website names it - the hotel, castle or\nclub its restaurant or bar is in: \"Das Schloss an der Eisenstrasse\". Null for none.",
          "type": [
            "string",
            "null"
          ]
        },
        "price_level": {
          "description": "\"€\" to \"€€€€\" from its menu's prices, against places of its kind - a restaurant's\nmains, a café's coffee and cake, a bar's cocktails; null while bissl doesn't know.",
          "type": [
            "string",
            "null"
          ]
        },
        "slug": {
          "description": "bissl's name for the place: what `/v1/venues/{slug}` and `get_venue` take.",
          "type": "string"
        },
        "url": {
          "description": "Its page on bissl, with every menu: link to it.",
          "type": "string"
        }
      },
      "required": [
        "slug",
        "name",
        "part_of",
        "kind",
        "cuisines",
        "address",
        "area",
        "lat",
        "lon",
        "open_now",
        "distance_m",
        "price_level",
        "url"
      ],
      "type": "object"
    },
    "Price": {
      "description": "A price of a dish: one per size or variant.",
      "properties": {
        "note": {
          "description": "What it is for, when the menu says: a size or a variant (\"0,5 l\", \"klein\").",
          "type": "string"
        },
        "price": {
          "description": "As the venue page writes it: \"12,90 €\".",
          "type": [
            "string",
            "null"
          ]
        },
        "price_cents": {
          "description": "In euro cents; null when the menu names a size without a price.",
          "format": "int64",
          "type": [
            "integer",
            "null"
          ]
        }
      },
      "required": [
        "price_cents",
        "price",
        "note"
      ],
      "type": "object"
    }
  }
}