For AI agents
7,935 dated events as data: holidays, religious days, the sky, sports, politics, the economy, culture and history. Refreshed nightly.
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-09-24",
"to": "2026-11-23",
"total": 2,
"events": [
{
"id": "ganesh-chaturthi-2026",
"title": "Ganesh Chaturthi",
"date": "2026-09-14",
"category": "religion",
"sub": "hinduism",
"url": "https://calendar.fru.dev/events/ganesh-chaturthi-2026"
},
{
"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"
}
]
}/api/events/{id}
curl -s "https://calendar.fru.dev/api/events/easter-2027"{
"event": {
"id": "ganesh-chaturthi-2026",
"title": "Ganesh Chaturthi",
"date": "2026-09-14",
"category": "religion",
"sub": "hinduism",
"method": "computed",
"methodNote": "Computed: the tithi prevailing at midday in New Delhi, amanta month by the Sun’s sidereal sign (Lahiri) at the opening new moon, with Astronomy Engine. Checked against published dates for 2023 to 2026.",
"sourceUrl": "https://en.wikipedia.org/wiki/Ganesh_Chaturthi"
}
}/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": 0,
"changes": []
}/api/companies
curl -s "https://calendar.fru.dev/api/companies"{
"count": 30,
"companies": [
{
"slug": "adobe",
"name": "Adobe",
"domain": "adobe.com",
"url": "https://quarterly.fru.dev/companies/adobe",
"items": [
{
"date": "2027-09-09",
"title": "Adobe earnings (Q3 FY2027)",
"url": "https://calendar.fru.dev/events/earnings-adobe-2027-q3"
}
]
}
]
}/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 fru.dev
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 nightly.
- 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.
Sources: official schedules and published calendars, linked on every event; computed dates name their rule. Refreshed nightly.