Skip to content
Updated 7h ago

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.txt
https://calendar.fru.dev/llms-full.txt

Call the API

MethodPathParamsReturns
GET/api/eventsfrom, to (YYYY-MM-DD, up to 400 days), cat (e.g. religion.islam,sky), region (world, us, mn), q, limit (max 200), offsetEvents in a date range: date, time, category, place, recurrence, importance, status, method and source
GET/api/events/{id}idOne event in full, with its method note and its other years
GET/api/categoriesnoneThe category tree with counts, colors, icons and feed URLs
GET/api/changessince (YYYY-MM-DD), limit (max 200), offsetThe append-only history: added, moved, renamed and cancelled events
GET/api/companiessince (YYYY-MM-DD)Companies with dated items (earnings), with companies.fru.dev slug and domain
GET/api/searchq, limit (max 20)Ranked events, categories and pages
GET/ics/{category}.icscategory, e.g. religion, sports.nfl, allAn 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.

Calendar by email

Sunday mornings: a look ahead at the week’s major dates, only when there are some.

Double opt-in. Unsubscribe any time.