Everything on the calendar

31,574 dates · 13 categories

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.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-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.