{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/bissl-at/json-schema/bissl-at-lunch-answer-schema.json",
  "title": "LunchAnswer",
  "x-generated": "2026-11-02",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/bissl-at-openapi.json#/components/schemas/LunchAnswer",
  "properties": {
    "attribution": {
      "type": "string"
    },
    "corrected": {
      "description": "The words put right when they found nothing as typed: \"schnitzel\" for \"schnitzl\".",
      "type": [
        "string",
        "null"
      ]
    },
    "cuisine": {
      "type": [
        "string",
        "null"
      ]
    },
    "day": {
      "description": "The day the lunch menus are for.",
      "format": "date",
      "type": "string"
    },
    "diet": {
      "anyOf": [
        {
          "$ref": "#/$defs/ApiDiet"
        },
        {
          "enum": [
            null
          ],
          "nullable": true
        }
      ],
      "description": "The filters in effect, asked for or taken from the words."
    },
    "free_of": {
      "type": [
        "string",
        "null"
      ]
    },
    "note": {
      "description": "Why there is nothing, when there is a reason to say.",
      "type": [
        "string",
        "null"
      ]
    },
    "places": {
      "description": "Each with its whole lunch that day - the dishes matching `q`, when it was given.",
      "items": {
        "$ref": "#/$defs/PlaceDishes"
      },
      "type": "array"
    },
    "searched": {
      "description": "The words the dishes match, once a diet, allergens or a cuisine among them were taken\nas filters; null for none.",
      "type": [
        "string",
        "null"
      ]
    },
    "total_dishes": {
      "format": "int64",
      "type": "integer"
    },
    "total_places": {
      "description": "Places serving lunch and their dishes, of which `places` holds `limit` from `offset` on.",
      "format": "int64",
      "type": "integer"
    }
  },
  "required": [
    "searched",
    "corrected",
    "diet",
    "free_of",
    "cuisine",
    "day",
    "total_places",
    "total_dishes",
    "places",
    "note",
    "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"
    },
    "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"
    },
    "PlaceDishes": {
      "description": "A place and its dishes in an answer: the dishes a search found there, or its lunch.",
      "properties": {
        "dishes": {
          "description": "In the answer's order.",
          "items": {
            "$ref": "#/$defs/Dish"
          },
          "type": "array"
        },
        "more_dishes": {
          "description": "More of them there, on its page.",
          "format": "int64",
          "type": "integer"
        },
        "place": {
          "$ref": "#/$defs/Place"
        },
        "served": {
          "description": "When its lunch is served, as its menu says: \"11:00–14:30\". Lunch only; null otherwise.",
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "place",
        "served",
        "dishes",
        "more_dishes"
      ],
      "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"
    }
  }
}