chronondocs
Regional menusMenu

Regional menus

A curated dataset of regional dishes: what they're made of, when they're eaten, how spicy they are and who can eat them. Good for menu builders, recipe apps, travel guides and food quizzes.

All endpoints need an API key and return JSON. Lists come back as { "data": [...], "total": n }, single items as { "data": {...} }.

Endpoints

EndpointReturns
GET /v1/menus/regionsAll regions
GET /v1/menus/regions/{slug}One region with all its dishes
GET /v1/menus/dishesDishes, filtered and paginated
GET /v1/menus/dishes/{slug}One dish
GET /v1/menus/randomRandom dishes matching filters

The dish object

{
  "slug": "appam",
  "name": "Appam",
  "local_name": "അപ്പം",
  "description": "Lacy fermented rice pancake with a soft, thick centre.",
  "course": "breakfast",
  "diet": "vegan",
  "spice_level": 0,
  "price_level": 1,
  "ingredients": ["rice", "coconut", "yeast or toddy"],
  "tags": ["fermented"],
  "region": { "slug": "kerala", "name": "Kerala", "country_code": "IN" }
}
FieldTypeDescription
slugstringStable, unique id. Use it in URLs.
namestringCommon English name
local_namestring | nullName in the local script, when it adds something
descriptionstringOne sentence
courseenumbreakfast starter main side bread rice snack dessert beverage
dietenumvegan vegetarian eggetarian pescatarian non_vegetarian (see below)
spice_level0–50 is not spicy, 5 is very hot. Typical preparation; homes and restaurants vary
price_level1–3Relative to the region: 1 everyday/street, 2 restaurant, 3 premium or festive
ingredientsstring[]Main ingredients, not a full recipe
tagsstring[]Loose descriptors such as street-food, festive, fermented
regionobjectWhere the dish comes from

List regions

GET /v1/menus/regions
https://chronon.webrizen.com/v1/menus/regions
ParameterTypeDescription
countrystringTwo-letter country code, e.g. IN, JP
{
  "data": [
    {
      "slug": "kerala",
      "name": "Kerala",
      "kind": "state",
      "country_code": "IN",
      "country": "India",
      "summary": "Coconut, curry leaves and coastal seafood, …",
      "staples": ["coconut", "coconut oil", "rice", "curry leaves", "black pepper"],
      "dish_count": 10
    }
  ],
  "total": 11
}

kind is one of country, state, region or city.

Get a region

GET /v1/menus/regions/{slug}
https://chronon.webrizen.com/v1/menus/regions/{slug}

Returns the region object above plus a dishes array (dish objects without the region field).

List dishes

GET /v1/menus/dishes
https://chronon.webrizen.com/v1/menus/dishes
ParameterTypeDescription
regionslugOnly dishes from this region
countrystringTwo-letter country code
courseenumOne of the course values above
dietenumDishes suitable for this diet: vegetarian also returns vegan dishes, pescatarian returns vegan, vegetarian and eggetarian ones too
max_spice0–5Spice level at most this
qstringSearch name, local name, region, ingredients and tags (accents ignored)
limit1–100Page size, default 20
cursorstringThe next_cursor from the previous page

Results are sorted by name. Paginate by passing next_cursor back until it's null:

let cursor = null;
const all = [];
do {
  const url = new URL("https://chronon.webrizen.com/v1/menus/dishes");
  url.searchParams.set("country", "IN");
  url.searchParams.set("limit", "100");
  if (cursor) url.searchParams.set("cursor", cursor);
  const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.CHRONON_KEY}` } });
  const page = await res.json();
  all.push(...page.data);
  cursor = page.next_cursor;
} while (cursor);

Get a dish

GET /v1/menus/dishes/{slug}
https://chronon.webrizen.com/v1/menus/dishes/{slug}
curl https://chronon.webrizen.com/v1/menus/dishes/laal-maas \
  -H "Authorization: Bearer $CHRONON_KEY"

Random dishes

GET /v1/menus/random
https://chronon.webrizen.com/v1/menus/random

Takes the same filters as list dishes (except limit and cursor), plus:

ParameterTypeDescription
count1–10How many dishes, default 1. Never repeats within one response.
curl "https://chronon.webrizen.com/v1/menus/random?diet=vegan&max_spice=2&count=3" \
  -H "Authorization: Bearer $CHRONON_KEY"

Returns 404 not_found if nothing matches.

Regions in the dataset

SlugRegionCountryDishes
goaGoaIN9
gujaratGujaratIN9
hyderabadHyderabadIN9
karnatakaKarnatakaIN9
kashmirKashmirIN9
keralaKeralaIN10
maharashtraMaharashtraIN9
punjabPunjabIN9
rajasthanRajasthanIN9
tamil-naduTamil NaduIN9
west-bengalWest BengalIN9
italyItalyIT9
japanJapanJP9
lebanonLebanonLB9
mexicoMexicoMX10
thailandThailandTH9

The data is curated by hand and lives in the repository. Spotted a mistake, or want your region in? See Contributing.