/api
Public read access for /api/menu. No authentication required.
Returns menu data. Defaults to the latest week if no query is provided.
curl -s https://your-domain.vercel.app/api/menu | jq
Response:
{
"foodCourt": "Food Court 2",
"week": "August 25 - 31, 2025",
"menu": {
"2025-08-25": {
"day": "Monday",
"meals": {
"breakfast": { "name": "Happy Morning Breakfast", "startTime": "07:00", "endTime": "09:30", "items": ["..."] },
"lunch": { "name": "Wholesome Lunch", "startTime": "11:45", "endTime": "14:15", "items": ["..."] },
"snacks": { "name": "Refreshing Snacks", "startTime": "16:30", "endTime": "18:00", "items": ["..."] },
"dinner": { "name": "Delicious Dinner", "startTime": "19:00", "endTime": "21:30", "items": ["..."] }
}
}
}
}?week=August 25 - 31, 2025 — exact match on the week label.?weekStart=2025-08-25 — ISO date of the first day of the week.?date=2025-08-27 — returns only that specific day, in the same JSON shape.curl -s 'https://your-domain.vercel.app/api/menu?date=2025-08-27' | jq
Access historical menu data for previous weeks. All historical weeks are stored in Cloudflare R2 storage. Requires authentication.
Returns a summary of all available weeks with metadata:
curl -s https://your-domain.vercel.app/api/history | jq
Response:
{
"weeks": [
{
"week": "August 18 - 24, 2025",
"foodCourt": "Food Court 2",
"startDate": "2025-08-18",
"endDate": "2025-08-24",
"numDays": 7
},
{
"week": "August 25 - 31, 2025",
"foodCourt": "Food Court 2",
"startDate": "2025-08-25",
"endDate": "2025-08-31",
"numDays": 7
}
]
}Retrieve full menu data for a specific week using the weekStart parameter:
curl -s 'https://your-domain.vercel.app/api/history?weekStart=2025-08-18' | jq
Returns the same MenuData structure as /api/menu.
?weekStart=2025-08-18 — ISO date of the first day of the week to retrieve.{
"error": "Failed to retrieve menu data",
"details": "..."
}menu-history.json in Cloudflare R2 storage./api/menu (public) or /api/history (authenticated).latest-menu.json for quick access.