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
| Endpoint | Returns |
|---|---|
GET /v1/menus/regions | All regions |
GET /v1/menus/regions/{slug} | One region with all its dishes |
GET /v1/menus/dishes | Dishes, filtered and paginated |
GET /v1/menus/dishes/{slug} | One dish |
GET /v1/menus/random | Random 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" }
}| Field | Type | Description |
|---|---|---|
slug | string | Stable, unique id. Use it in URLs. |
name | string | Common English name |
local_name | string | null | Name in the local script, when it adds something |
description | string | One sentence |
course | enum | breakfast starter main side bread rice snack dessert beverage |
diet | enum | vegan vegetarian eggetarian pescatarian non_vegetarian (see below) |
spice_level | 0–5 | 0 is not spicy, 5 is very hot. Typical preparation; homes and restaurants vary |
price_level | 1–3 | Relative to the region: 1 everyday/street, 2 restaurant, 3 premium or festive |
ingredients | string[] | Main ingredients, not a full recipe |
tags | string[] | Loose descriptors such as street-food, festive, fermented |
region | object | Where the dish comes from |
List regions
| Parameter | Type | Description |
|---|---|---|
country | string | Two-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
Returns the region object above plus a dishes array (dish objects without the region field).
List dishes
| Parameter | Type | Description |
|---|---|---|
region | slug | Only dishes from this region |
country | string | Two-letter country code |
course | enum | One of the course values above |
diet | enum | Dishes suitable for this diet: vegetarian also returns vegan dishes, pescatarian returns vegan, vegetarian and eggetarian ones too |
max_spice | 0–5 | Spice level at most this |
q | string | Search name, local name, region, ingredients and tags (accents ignored) |
limit | 1–100 | Page size, default 20 |
cursor | string | The 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
curl https://chronon.webrizen.com/v1/menus/dishes/laal-maas \
-H "Authorization: Bearer $CHRONON_KEY"Random dishes
Takes the same filters as list dishes (except limit and cursor), plus:
| Parameter | Type | Description |
|---|---|---|
count | 1–10 | How 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
| Slug | Region | Country | Dishes |
|---|---|---|---|
goa | Goa | IN | 9 |
gujarat | Gujarat | IN | 9 |
hyderabad | Hyderabad | IN | 9 |
karnataka | Karnataka | IN | 9 |
kashmir | Kashmir | IN | 9 |
kerala | Kerala | IN | 10 |
maharashtra | Maharashtra | IN | 9 |
punjab | Punjab | IN | 9 |
rajasthan | Rajasthan | IN | 9 |
tamil-nadu | Tamil Nadu | IN | 9 |
west-bengal | West Bengal | IN | 9 |
italy | Italy | IT | 9 |
japan | Japan | JP | 9 |
lebanon | Lebanon | LB | 9 |
mexico | Mexico | MX | 10 |
thailand | Thailand | TH | 9 |
The data is curated by hand and lives in the repository. Spotted a mistake, or want your region in? See Contributing.