DEV Community

Cover image for Food festival dates as open data: a free API, an MCP server and SQL
Elliot Marsh
Elliot Marsh

Posted on Edited on

Food festival dates as open data: a free API, an MCP server and SQL

Every year I hit the same problem planning food trips: festival listings tell you a festival exists, but not when the next one is. Pages still show last year's dates, or say "every autumn".

So at TableJourney we keep the next dates of more than 1,500 food festivals in 55 countries, and we have opened the data up four ways: a REST API, an MCP server for AI assistants, a SQL copy on DoltHub and a plain CSV. All free, no sign-up.

How the dates stay current

A date like "the second weekend of October" goes stale every year. So we store each festival's recurrence rule rather than a date: nth weekday of a month, a fixed day, or an anchor such as Easter or the lunar calendar for Lunar New Year and Mid-Autumn markets. The next edition is computed from the rule, and each festival page carries the source we checked and the date we checked it.

REST: festivals between two dates

curl "https://tablejourney.com/api/v1/festivals?country=italy&from=2026-10-10&to=2026-11-30&limit=3"
Enter fullscreen mode Exit fullscreen mode

Each result has a name, city, starts_on, ends_on, month, whether it is annual, a short summary and a link to the page with the sources. The same API answers other trip questions, for example the signature dishes of a city and where to eat them:

curl "https://tablejourney.com/api/v1/dishes?country=japan&city=osaka&limit=2"
Enter fullscreen mode Exit fullscreen mode
[{"name": "Omurice", "city": "osaka", "country": "japan",
  "summary": "Ketchup-seasoned chicken rice wrapped in a soft folded omelette...",
  "where_to_eat": [{"name": "Hokkyokusei Shinsaibashi", "page": "https://tablejourney.com/japan/osaka/casual-dining/hokkyokusei-shinsaibashi/"}]}]
Enter fullscreen mode Exit fullscreen mode

The full list of endpoints (places, a composed food day, experiences, things to do) is in the OpenAPI docs at https://tablejourney.com/api/v1/docs.

MCP: ask an assistant

The same data is a remote MCP server (streamable HTTP) at https://tablejourney.com/mcp. In Claude Code:

claude mcp add --transport http tablejourney https://tablejourney.com/mcp
Enter fullscreen mode Exit fullscreen mode

Or in any MCP client config:

{ "mcpServers": { "tablejourney": { "type": "streamable-http", "url": "https://tablejourney.com/mcp" } } }
Enter fullscreen mode Exit fullscreen mode

Then ask things like "which food festivals are on in Spain the week I am there" or "plan a vegetarian food day in Lisbon on Sunday". Tools include festivals, search_places, plan_day, things_to_do and experiences. Setup notes for other clients are at https://tablejourney.com/agents/.

SQL: query it on DoltHub

The dataset is mirrored weekly to DoltHub, so you can query it without downloading anything:

SELECT month, COUNT(*) AS festivals
FROM festivals
GROUP BY month
ORDER BY festivals DESC
LIMIT 3;
Enter fullscreen mode Exit fullscreen mode

Today that returns October (197), September (190) and November (161). Run it at https://www.dolthub.com/repositories/tablejourney/food-festivals or through DoltHub's SQL API.

Or embed it: free widgets

If you would rather show the dates than query them, the widget builder at https://tablejourney.com/widgets/ makes an embed in three steps: choose a widget, search a city or country, pick the colours, then copy one line of code. There are six widgets:

  • Festival calendar: the next food festivals in a city, a country or the whole world
  • Christmas markets: this season's markets and the dates each opens
  • Where to eat: our top places in a city, for any topic we cover
  • Signature dishes: what to eat in a city, with photos
  • City rank: the city's place in our food festival index
  • Statistics: charts of the world's festivals (busiest month, weekday, length, share free to enter)

The preview shows each widget on a light and a dark site, and the colours can be light, dark or automatic, which follows each reader's own setting. Every widget is a small static page in an iframe: no cookies, no scripts, and it updates itself daily. Every place we cover has every widget, so a city with nothing dated yet shows an empty state instead of breaking your page.

This is what the builder gives you for Chicago:

<iframe src="https://tablejourney.com/embed/festivals/united-states/chicago/" title="Food festivals in Chicago" width="100%" height="570" style="border:0;border-radius:14px;max-width:420px" loading="lazy"></iframe>
<p style="font-size:13px;margin:6px 0 0"><a href="https://tablejourney.com/united-states/chicago/festivals/">Food festivals in Chicago</a> by TableJourney</p>
Enter fullscreen mode Exit fullscreen mode

Prefer a calendar app? Every city, country and kind of festival is also an .ics feed you can subscribe to in Google, Apple or Outlook, or import into an events calendar by URL, for example https://tablejourney.com/calendar/united-states/chicago.ics. The full list is at https://tablejourney.com/calendar/.

Download it

The licence is CC BY 4.0: use it for anything, with a credit link.

If a date is wrong or a festival is missing, tell me in the comments or through the contact page; corrections from organisers are locked in so later updates cannot overwrite them.

Top comments (0)