Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
description: 'Dishes, prices and lunch menus of restaurants, cafés and bars in Austria, read from each place''s own website. Free to use, but not to pass on, all or in large part, as your own collection of places'' menus and prices (a site, app or dataset); systematic or large-scale fetching, commercial market analysis, historical data and training AI models need a licence; text and data mining is reserved (§ 42h of the Austrian Copyright Act); photos and reviews are not included. Name bissl as the source and link to the place''s bissl page (`url`) wherever you show its data. Terms: https://bissl.at/en/api'
title: bissl Lunch API
version: '1'
servers:
- url: https://api.bissl.at
tags:
- name: Lunch
paths:
/v1/lunch:
get:
operationId: findLunch
parameters:
- description: 'Keep to a map area: "west,south,east,north" in degrees - a town, a district, the streets around a place. Everywhere when left out.'
in: query
name: bbox
schema:
type: string
- description: 'Only at places of this cuisine, as OpenStreetMap names it: "italian", "vietnamese".'
in: query
name: cuisine
schema:
type: string
- description: '"2026-10-20": another day of this lunch week, Monday to Sunday (at the weekend, the coming week''s too). Today when left out; open_now only counts today.'
in: query
name: day
schema:
format: date
type: string
- description: 'Only dishes of this diet: vegan, or vegetarian (vegan dishes included).'
in: query
name: diet
schema:
anyOf:
- 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
- enum:
- null
- description: 'Only dishes whose menu lists their allergens and none of these letters: "A" gluten, "G" milk, "AG" both.'
in: query
name: free_of
schema:
type: string
- description: 'The language of dish names, descriptions and section titles: de, the menus'' own, or en, as bissl translated them.'
in: query
name: lang
schema:
enum:
- de
- en
type: string
- description: The latitude of a point - the user's, or one they name - to measure distances from and sort nearest first; with `lon`.
in: query
name: lat
schema:
format: double
type: number
- description: 'Places to answer with: 1 to 30, 10 when left out.'
in: query
name: limit
schema:
format: int64
type: integer
- description: The longitude of that point; with `lat`.
in: query
name: lon
schema:
format: double
type: number
- description: Only dishes costing at most this much, in whole euros.
in: query
name: max_price
schema:
format: int64
type: integer
- description: Only dishes costing at least this much, in whole euros.
in: query
name: min_price
schema:
format: int64
type: integer
- description: 'Places to skip, for the next ones: 0 when left out.'
in: query
name: offset
schema:
format: int64
type: integer
- description: Only places open right now.
in: query
name: open_now
schema:
type: boolean
- description: 'Words a dish must match, as people say them, German or English: "schnitzel", "vegan curry", "glutenfreie pizza". A diet, allergens or a cuisine among them are taken as filters; misspelt German words are put right when that finds something.'
in: query
name: q
schema:
type: string
- description: The order of the places.
in: query
name: sort
schema:
anyOf:
- oneOf:
- enum:
- name
type: string
- description: 'The most useful lunches first: with prices, at places open for lunch.'
enum:
- recommended
type: string
- description: Nearest to `lat`, `lon` first - the order whenever they are given, unless another.
enum:
- distance
type: string
- description: The cheapest dish first.
enum:
- price
type: string
- enum:
- null
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/LunchAnswer'
description: The answer
'400':
content:
application/json:
schema:
properties:
error:
type: string
required:
- error
type: object
description: A parameter the API can't read, and why
'404':
content:
application/json:
schema:
properties:
error:
type: string
required:
- error
type: object
description: No such place
'429':
description: 'Too many requests from this address: wait for Retry-After'
summary: Lunch menus (Mittagsmenüs) served today or another day this week
tags:
- Lunch
components:
schemas:
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
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
town 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,
biergarten, 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
club 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
mains, 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
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
crustaceans, C egg, D fish, E peanuts, F soy, G milk, H nuts, L celery, M mustard,
N sesame, O sulphites, P lupin, R molluscs); null when the menu lists none for it,
which 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: '#/components/schemas/ApiDiet'
- enum:
- null
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: '#/components/schemas/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
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: '#/components/schemas/Dish'
type: array
more_dishes:
description: More of them there, on its page.
format: int64
type: integer
place:
$ref: '#/components/schemas/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
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: '#/components/schemas/ApiDiet'
- enum:
- null
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: '#/components/schemas/PlaceDishes'
type: array
searched:
description: 'The words the dishes match, once a diet, allergens or a cuisine among them were taken
as 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