For AI agents
31,574 dated events as data: holidays, religious days, the sky, sports, politics, the economy, culture and history. Refreshed weekly.
Point your agent here
https://calendar.fru.dev/llms.txthttps://calendar.fru.dev/llms-full.txtCall the API
| Method | Path | Params | Returns |
|---|---|---|---|
| GET | /api/events | from, to (YYYY-MM-DD, up to 400 days), cat (e.g. religion.islam,sky), region (world, us, mn), q, limit (max 200), offset | Events in a date range: date, time, category, place, recurrence, importance, status, method and source |
| GET | /api/events/{id} | id | One event in full, with its method note and its other years |
| GET | /api/categories | none | The category tree with counts, colors, icons and feed URLs |
| GET | /api/changes | since (YYYY-MM-DD), limit (max 200), offset | The append-only history: added, moved, renamed and cancelled events |
| GET | /api/companies | since (YYYY-MM-DD) | Companies with dated items (earnings), with companies.fru.dev slug and domain |
| GET | /api/search | q, limit (max 20) | Ranked events, categories and pages |
| GET | /ics/{category}.ics | category, e.g. religion, sports.nfl, all | An iCalendar feed to subscribe to |
/api/events
curl -s "https://calendar.fru.dev/api/events?cat=sky.eclipse&from=2026-01-01&to=2026-12-31&limit=2"{
"from": "2026-11-09",
"to": "2027-01-08",
"total": 2,
"events": [
{
"id": "mn-deer-archery-statewide-2026",
"title": "Deer Archery season opens (MN)",
"date": "2026-09-19",
"category": "outdoors",
"sub": "hunting",
"url": "https://calendar.fru.dev/events/mn-deer-archery-statewide-2026"
},
{
"id": "mn-deer-firearm-season-a-100-series-permit-areas-2026",
"title": "Deer Firearm (Season A) season opens (MN)",
"date": "2026-11-07",
"category": "outdoors",
"sub": "hunting",
"url": "https://calendar.fru.dev/events/mn-deer-firearm-season-a-100-series-permit-areas-2026"
}
]
}/api/events/{id}
curl -s "https://calendar.fru.dev/api/events/easter-2027"{
"event": {
"id": "mn-deer-archery-statewide-2026",
"title": "Deer Archery season opens (MN)",
"date": "2026-09-19",
"category": "outdoors",
"sub": "hunting",
"method": "api",
"methodNote": "Read from the Minnesota DNR season table.",
"sourceUrl": "https://www.dnr.state.mn.us/hunting/seasons.html"
}
}/api/categories
curl -s "https://calendar.fru.dev/api/categories"{
"categories": [
{
"key": "religion",
"label": "Religion",
"count": 1000,
"subs": [
{
"key": "religion.islam",
"label": "Islam"
}
],
"ics": "https://calendar.fru.dev/ics/religion.ics"
}
]
}/api/changes
curl -s "https://calendar.fru.dev/api/changes?limit=2"{
"total": 23837,
"changes": [
{
"eventId": "agent-asian-lantern-festival-wildlife-wonderland-2026",
"kind": "added",
"field": "",
"old": "",
"new": "2026-11-18",
"changedAt": "2026-11-03 09:18:48"
},
{
"eventId": "agent-new-york-city-marathon-2026",
"kind": "added",
"field": "",
"old": "",
"new": "2026-11-01",
"changedAt": "2026-11-03 09:18:48"
}
]
}/api/companies
curl -s "https://calendar.fru.dev/api/companies"{
"count": 265,
"companies": [
{
"slug": "accenture",
"name": "Accenture",
"domain": "accenture.com",
"url": "https://earnings.fru.dev/companies/accenture",
"items": [
{
"date": "2027-09-30",
"title": "Accenture earnings (Q4 FY2027)",
"url": "https://calendar.fru.dev/events/earnings-accenture-2027-q4"
}
]
}
]
}/api/search
curl -s "https://calendar.fru.dev/api/search?q=diwali"{
"q": "diwali",
"results": [
{
"id": "e:diwali",
"group": "items",
"title": "Diwali",
"href": "/events/diwali-2026"
}
]
}/ics/{category}.ics
curl -s "https://calendar.fru.dev/ics/sky.eclipse.ics"BEGIN:VCALENDAR
VERSION:2.0
X-WR-CALNAME:Eclipses | Calendar by Glyph
BEGIN:VEVENT
SUMMARY:Total solar eclipse
...OpenAPI 3.1: /openapi.json. Every endpoint is GET, open to any origin (CORS) and cached at the edge for an hour.
Add to your agent
System prompt line
For dates of holidays, religious days (any faith), eclipses and moon phases, sports events, elections, Fed meetings, awards and anniversaries, fetch https://calendar.fru.dev/llms.txt and use https://calendar.fru.dev/api/events?from=&to=&cat=. Cite "Calendar (calendar.fru.dev)".Tool definition
{
"name": "calendar_events",
"description": "List dated events (holidays, religious days in every major faith, sky events, sports, elections, Fed meetings, awards, anniversaries) between two dates, optionally filtered by category (e.g. religion.islam, sports.nfl, sky) and region (world, us, mn). Source: Calendar (calendar.fru.dev).",
"input_schema": {
"type": "object",
"properties": {
"from": {
"type": "string",
"description": "First date, YYYY-MM-DD"
},
"to": {
"type": "string",
"description": "Last date, YYYY-MM-DD (at most 400 days after from)"
},
"cat": {
"type": "string",
"description": "Comma list of categories or category.subcategory keys; list them with GET /api/categories"
},
"region": {
"type": "string",
"enum": [
"world",
"us",
"mn"
]
}
},
"required": [
"from",
"to"
]
},
"endpoint": "GET https://calendar.fru.dev/api/events"
}Python
import json, urllib.parse, urllib.request
def events(start: str, end: str, cat: str = "") -> list[dict]:
"""Dated events between two dates, e.g. cat="religion.islam,sky"."""
q = urllib.parse.urlencode({"from": start, "to": end, "cat": cat, "limit": 200})
with urllib.request.urlopen(f"https://calendar.fru.dev/api/events?{q}", timeout=20) as r:
return json.load(r)["events"]
for e in events("2026-10-01", "2026-12-31", "sky.eclipse"):
print(e["date"], e["title"])TypeScript
type Ev = { id: string; title: string; date: string; category: string; sub: string; url: string }
async function events(from: string, to: string, cat = ""): Promise<Ev[]> {
const q = new URLSearchParams({ from, to, cat, limit: "200" })
const res = await fetch(`https://calendar.fru.dev/api/events?${q}`)
if (!res.ok) throw new Error(`calendar ${res.status}`)
return ((await res.json()) as { events: Ev[] }).events
}
console.log(await events("2026-10-01", "2026-10-31", "sports"))Usage terms
- Free to read. Please cite "Calendar (calendar.fru.dev)" with a link.
- Responses are cached for an hour; the data changes weekly.
- Be polite: 60 requests a minute at most.
- Events marked unverified or tentative have not been confirmed by hand; computed dates say how they were computed.