{"openapi":"3.1.0","jsonSchemaDialect":"https://spec.openapis.org/oas/3.1/dialect/base","info":{"title":"fatcalendar API","version":"1.0.0","summary":"Multi-tradition calendar and panchang API","description":"fatcalendar.com is a free calendar for Gregorian, Telugu, Tamil, Kannada, Malayalam, Marathi, Gujarati, Punjabi, Bengali, North-Indian (Hindi), Indian-Muslim (Hijri) and Christian traditions (12), shown in eleven languages, with tithi, nakshatra, festivals, auspicious windows and prayer times computed for your location. Free REST API, MCP server, A2A agent and SDK.\n\nAll operations are read-only GET requests returning JSON, require no authentication and send `Access-Control-Allow-Origin: *`. Errors are RFC 9457 `application/problem+json`. Location is given as `lat`+`lon`+`tz`, as free-text `place`, or inferred from the request IP (such responses are not publicly cacheable). Rate limit: 120 requests per 60 seconds per client, advertised in RateLimit / RateLimit-Policy headers. Prefer the MCP server at https://fatcalendar.com/mcp for agent use.","termsOfService":"https://fatcalendar.com/about#terms","contact":{"name":"fatcalendar","url":"https://fatcalendar.com/contact","email":"hello@fatcalendar.com"},"license":{"name":"CC BY 4.0 (data responses; attribute fatcalendar.com)","identifier":"CC-BY-4.0"},"x-rate-limit":{"policy":"120;w=60","scope":"per client IP","headers":["RateLimit","RateLimit-Policy","Retry-After"]},"x-mcp":{"url":"https://fatcalendar.com/mcp","serverCard":"https://fatcalendar.com/.well-known/mcp/server-card.json"}},"servers":[{"url":"https://fatcalendar.com","description":"Production"}],"tags":[{"name":"calendar","description":"Day, week, month and year calendars per tradition and language."},{"name":"festivals","description":"Festival lists with date rules."},{"name":"astronomy","description":"Raw normalised panchang data."},{"name":"places","description":"Place geocoder."},{"name":"catalog","description":"Supported traditions and languages."},{"name":"meta","description":"Service health."}],"externalDocs":{"description":"Developer documentation","url":"https://fatcalendar.com/docs/api"},"security":[],"paths":{"/api/v1/calendar/month":{"get":{"operationId":"getCalendarMonth","summary":"Get a month calendar","description":"Returns every day cell of a month (with leading/trailing days of adjacent months) in the requested tradition and language: traditional date, tithi, nakshatra, moon phase, markers (purnima, amavasya, ekadashi, sankranti...), festivals and holidays, plus a localized header with era names (Shaka, Vikram, Kollavarsham, Hijri...).\n\nEquivalent MCP tool: `get_month`.","tags":["calendar"],"parameters":[{"name":"tradition","in":"query","required":false,"description":"Calendar tradition. One of: gregorian, telugu, tamil, kannada, malayalam, marathi, gujarati, punjabi, bengali, hindi, muslim, christian.","schema":{"default":"gregorian","type":"string","enum":["gregorian","telugu","tamil","kannada","malayalam","marathi","gujarati","punjabi","bengali","hindi","muslim","christian"]},"example":"punjabi"},{"name":"lang","in":"query","required":false,"description":"Display language (independent of tradition): en, te, ta, kn, ml, mr, gu, pa, bn, hi, ur.","schema":{"default":"en","type":"string","enum":["en","te","ta","kn","ml","mr","gu","pa","bn","hi","ur"]},"example":"pa"},{"name":"digits","in":"query","required":false,"description":"Digit script for numbers in the response: latin (default) or native (e.g. Telugu or Tamil numerals).","schema":{"type":"string","enum":["latin","native"]}},{"name":"variant","in":"query","required":false,"description":"Optional tradition sub-variant (default per tradition; see GET /api/v1/traditions). Valid: tamil: thirukanitha|vakya; kannada: smarta|madhva; malayalam: default|nazhika; punjabi: nanakshahi|desi|hindu; bengali: west-bengal-bisuddha|west-bengal-gupta|bangladesh; hindi: purnimanta|amanta|varanasi|braj|awadh; muslim: india|astronomical|tabular|hanafi|shia; christian: western|orthodox|catholic|protestant.","schema":{"type":"string","minLength":1,"maxLength":32},"example":"nanakshahi"},{"name":"lat","in":"query","required":false,"description":"Latitude in decimal degrees (-90..90). Use with lon and tz.","schema":{"type":"number","minimum":-90,"maximum":90},"example":17.385},{"name":"lon","in":"query","required":false,"description":"Longitude in decimal degrees (-180..180). Use with lat and tz.","schema":{"type":"number","minimum":-180,"maximum":180},"example":78.4867},{"name":"tz","in":"query","required":false,"description":"IANA time zone, e.g. Asia/Kolkata.","schema":{"type":"string","minLength":1,"maxLength":64},"example":"Asia/Kolkata"},{"name":"place","in":"query","required":false,"description":"Free-text place name (e.g. \"Hyderabad\"); resolved via the geocoder, first hit wins. Alternative to lat/lon/tz.","schema":{"type":"string","minLength":2,"maxLength":120},"example":"Hyderabad"},{"name":"year","in":"query","required":false,"description":"Gregorian year, 1900-2200. Defaults to the current year.","schema":{"type":"integer","minimum":1900,"maximum":2200},"example":2026},{"name":"month","in":"query","required":false,"description":"Gregorian month 1-12. Defaults to the current month.","schema":{"type":"integer","minimum":1,"maximum":12},"example":11}],"security":[],"x-mcp-tool":"get_month","x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://fatcalendar.com/api/v1/calendar/month?tradition=telugu&lang=en&place=Hyderabad&year=2026'"}],"responses":{"200":{"description":"Success. Astronomical results are immutable and cacheable.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonthResponse"}}}},"400":{"description":"Invalid or missing parameters.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Invalid parameters","status":400,"detail":"date: date must be YYYY-MM-DD","instance":"/api/v1/calendar/month"}}}},"404":{"description":"Place not found or unknown resource.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Place not found","status":404,"detail":"No place matched \"Xyzzy\".","instance":"/api/v1/calendar/month"}}}},"429":{"description":"Rate limit exceeded (120 requests per 60s per client).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Too many requests","status":429,"detail":"Retry after the Retry-After interval."}}}},"500":{"description":"Unexpected server error.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal error","status":500}}}},"502":{"description":"The upstream ephemeris (jotish.ai) failed.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Upstream calculation failed","status":502}}}}}}},"/api/v1/calendar/week":{"get":{"operationId":"getCalendarWeek","summary":"Get a week calendar","description":"Returns the seven day cells of the Sunday-to-Saturday week containing `date`, in the requested tradition and language.\n\nEquivalent MCP tool: `get_week`.","tags":["calendar"],"parameters":[{"name":"tradition","in":"query","required":false,"description":"Calendar tradition. One of: gregorian, telugu, tamil, kannada, malayalam, marathi, gujarati, punjabi, bengali, hindi, muslim, christian.","schema":{"default":"gregorian","type":"string","enum":["gregorian","telugu","tamil","kannada","malayalam","marathi","gujarati","punjabi","bengali","hindi","muslim","christian"]},"example":"punjabi"},{"name":"lang","in":"query","required":false,"description":"Display language (independent of tradition): en, te, ta, kn, ml, mr, gu, pa, bn, hi, ur.","schema":{"default":"en","type":"string","enum":["en","te","ta","kn","ml","mr","gu","pa","bn","hi","ur"]},"example":"pa"},{"name":"digits","in":"query","required":false,"description":"Digit script for numbers in the response: latin (default) or native (e.g. Telugu or Tamil numerals).","schema":{"type":"string","enum":["latin","native"]}},{"name":"variant","in":"query","required":false,"description":"Optional tradition sub-variant (default per tradition; see GET /api/v1/traditions). Valid: tamil: thirukanitha|vakya; kannada: smarta|madhva; malayalam: default|nazhika; punjabi: nanakshahi|desi|hindu; bengali: west-bengal-bisuddha|west-bengal-gupta|bangladesh; hindi: purnimanta|amanta|varanasi|braj|awadh; muslim: india|astronomical|tabular|hanafi|shia; christian: western|orthodox|catholic|protestant.","schema":{"type":"string","minLength":1,"maxLength":32},"example":"nanakshahi"},{"name":"lat","in":"query","required":false,"description":"Latitude in decimal degrees (-90..90). Use with lon and tz.","schema":{"type":"number","minimum":-90,"maximum":90},"example":17.385},{"name":"lon","in":"query","required":false,"description":"Longitude in decimal degrees (-180..180). Use with lat and tz.","schema":{"type":"number","minimum":-180,"maximum":180},"example":78.4867},{"name":"tz","in":"query","required":false,"description":"IANA time zone, e.g. Asia/Kolkata.","schema":{"type":"string","minLength":1,"maxLength":64},"example":"Asia/Kolkata"},{"name":"place","in":"query","required":false,"description":"Free-text place name (e.g. \"Hyderabad\"); resolved via the geocoder, first hit wins. Alternative to lat/lon/tz.","schema":{"type":"string","minLength":2,"maxLength":120},"example":"Hyderabad"},{"name":"date","in":"query","required":false,"description":"Civil date YYYY-MM-DD. Defaults to today in the location time zone.","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"example":"2026-11-08"}],"security":[],"x-mcp-tool":"get_week","x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://fatcalendar.com/api/v1/calendar/week?tradition=telugu&lang=en&place=Hyderabad&date=2026-11-08'"}],"responses":{"200":{"description":"Success. Astronomical results are immutable and cacheable.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WeekResponse"}}}},"400":{"description":"Invalid or missing parameters.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Invalid parameters","status":400,"detail":"date: date must be YYYY-MM-DD","instance":"/api/v1/calendar/week"}}}},"404":{"description":"Place not found or unknown resource.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Place not found","status":404,"detail":"No place matched \"Xyzzy\".","instance":"/api/v1/calendar/week"}}}},"429":{"description":"Rate limit exceeded (120 requests per 60s per client).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Too many requests","status":429,"detail":"Retry after the Retry-After interval."}}}},"500":{"description":"Unexpected server error.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal error","status":500}}}},"502":{"description":"The upstream ephemeris (jotish.ai) failed.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Upstream calculation failed","status":502}}}}}}},"/api/v1/calendar/year":{"get":{"operationId":"getCalendarYear","summary":"Get a year calendar","description":"Returns all twelve months of a Gregorian year (compact day cells with moon phase and markers, plus the list of festivals per month) in the requested tradition and language.\n\nEquivalent MCP tool: `get_year`.","tags":["calendar"],"parameters":[{"name":"tradition","in":"query","required":false,"description":"Calendar tradition. One of: gregorian, telugu, tamil, kannada, malayalam, marathi, gujarati, punjabi, bengali, hindi, muslim, christian.","schema":{"default":"gregorian","type":"string","enum":["gregorian","telugu","tamil","kannada","malayalam","marathi","gujarati","punjabi","bengali","hindi","muslim","christian"]},"example":"punjabi"},{"name":"lang","in":"query","required":false,"description":"Display language (independent of tradition): en, te, ta, kn, ml, mr, gu, pa, bn, hi, ur.","schema":{"default":"en","type":"string","enum":["en","te","ta","kn","ml","mr","gu","pa","bn","hi","ur"]},"example":"pa"},{"name":"digits","in":"query","required":false,"description":"Digit script for numbers in the response: latin (default) or native (e.g. Telugu or Tamil numerals).","schema":{"type":"string","enum":["latin","native"]}},{"name":"variant","in":"query","required":false,"description":"Optional tradition sub-variant (default per tradition; see GET /api/v1/traditions). Valid: tamil: thirukanitha|vakya; kannada: smarta|madhva; malayalam: default|nazhika; punjabi: nanakshahi|desi|hindu; bengali: west-bengal-bisuddha|west-bengal-gupta|bangladesh; hindi: purnimanta|amanta|varanasi|braj|awadh; muslim: india|astronomical|tabular|hanafi|shia; christian: western|orthodox|catholic|protestant.","schema":{"type":"string","minLength":1,"maxLength":32},"example":"nanakshahi"},{"name":"lat","in":"query","required":false,"description":"Latitude in decimal degrees (-90..90). Use with lon and tz.","schema":{"type":"number","minimum":-90,"maximum":90},"example":17.385},{"name":"lon","in":"query","required":false,"description":"Longitude in decimal degrees (-180..180). Use with lat and tz.","schema":{"type":"number","minimum":-180,"maximum":180},"example":78.4867},{"name":"tz","in":"query","required":false,"description":"IANA time zone, e.g. Asia/Kolkata.","schema":{"type":"string","minLength":1,"maxLength":64},"example":"Asia/Kolkata"},{"name":"place","in":"query","required":false,"description":"Free-text place name (e.g. \"Hyderabad\"); resolved via the geocoder, first hit wins. Alternative to lat/lon/tz.","schema":{"type":"string","minLength":2,"maxLength":120},"example":"Hyderabad"},{"name":"year","in":"query","required":false,"description":"Gregorian year, 1900-2200. Defaults to the current year.","schema":{"type":"integer","minimum":1900,"maximum":2200},"example":2026}],"security":[],"x-mcp-tool":"get_year","x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://fatcalendar.com/api/v1/calendar/year?tradition=telugu&lang=en&place=Hyderabad&year=2026'"}],"responses":{"200":{"description":"Success. Astronomical results are immutable and cacheable.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/YearResponse"}}}},"400":{"description":"Invalid or missing parameters.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Invalid parameters","status":400,"detail":"date: date must be YYYY-MM-DD","instance":"/api/v1/calendar/year"}}}},"404":{"description":"Place not found or unknown resource.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Place not found","status":404,"detail":"No place matched \"Xyzzy\".","instance":"/api/v1/calendar/year"}}}},"429":{"description":"Rate limit exceeded (120 requests per 60s per client).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Too many requests","status":429,"detail":"Retry after the Retry-After interval."}}}},"500":{"description":"Unexpected server error.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal error","status":500}}}},"502":{"description":"The upstream ephemeris (jotish.ai) failed.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Upstream calculation failed","status":502}}}}}}},"/api/v1/calendar/day":{"get":{"operationId":"getCalendarDay","summary":"Get a full day (panchang) view","description":"Returns the full daily almanac for one civil date: vara, tithi, nakshatra, yoga, karana (each with end times), paksha, lunar month, samvatsara, sunrise/sunset/moonrise/moonset, auspicious and inauspicious windows (Rahu Kalam, Yamagandam, Gulika, Abhijit, Brahma Muhurta, Varjyam, Durmuhurtham, Amrita...), Choghadiya, Hijri date and prayer times (muslim tradition), and festivals.\n\nEquivalent MCP tool: `get_day`.","tags":["calendar"],"parameters":[{"name":"tradition","in":"query","required":false,"description":"Calendar tradition. One of: gregorian, telugu, tamil, kannada, malayalam, marathi, gujarati, punjabi, bengali, hindi, muslim, christian.","schema":{"default":"gregorian","type":"string","enum":["gregorian","telugu","tamil","kannada","malayalam","marathi","gujarati","punjabi","bengali","hindi","muslim","christian"]},"example":"punjabi"},{"name":"lang","in":"query","required":false,"description":"Display language (independent of tradition): en, te, ta, kn, ml, mr, gu, pa, bn, hi, ur.","schema":{"default":"en","type":"string","enum":["en","te","ta","kn","ml","mr","gu","pa","bn","hi","ur"]},"example":"pa"},{"name":"digits","in":"query","required":false,"description":"Digit script for numbers in the response: latin (default) or native (e.g. Telugu or Tamil numerals).","schema":{"type":"string","enum":["latin","native"]}},{"name":"variant","in":"query","required":false,"description":"Optional tradition sub-variant (default per tradition; see GET /api/v1/traditions). Valid: tamil: thirukanitha|vakya; kannada: smarta|madhva; malayalam: default|nazhika; punjabi: nanakshahi|desi|hindu; bengali: west-bengal-bisuddha|west-bengal-gupta|bangladesh; hindi: purnimanta|amanta|varanasi|braj|awadh; muslim: india|astronomical|tabular|hanafi|shia; christian: western|orthodox|catholic|protestant.","schema":{"type":"string","minLength":1,"maxLength":32},"example":"nanakshahi"},{"name":"lat","in":"query","required":false,"description":"Latitude in decimal degrees (-90..90). Use with lon and tz.","schema":{"type":"number","minimum":-90,"maximum":90},"example":17.385},{"name":"lon","in":"query","required":false,"description":"Longitude in decimal degrees (-180..180). Use with lat and tz.","schema":{"type":"number","minimum":-180,"maximum":180},"example":78.4867},{"name":"tz","in":"query","required":false,"description":"IANA time zone, e.g. Asia/Kolkata.","schema":{"type":"string","minLength":1,"maxLength":64},"example":"Asia/Kolkata"},{"name":"place","in":"query","required":false,"description":"Free-text place name (e.g. \"Hyderabad\"); resolved via the geocoder, first hit wins. Alternative to lat/lon/tz.","schema":{"type":"string","minLength":2,"maxLength":120},"example":"Hyderabad"},{"name":"date","in":"query","required":false,"description":"Civil date YYYY-MM-DD. Defaults to today in the location time zone.","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"example":"2026-11-08"}],"security":[],"x-mcp-tool":"get_day","x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://fatcalendar.com/api/v1/calendar/day?tradition=telugu&lang=en&place=Hyderabad&date=2026-11-08'"}],"responses":{"200":{"description":"Success. Astronomical results are immutable and cacheable.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DayResponse"},"example":{"view":"day","tradition":"telugu","lang":"en","date":"2026-11-08","location":{"lat":17.385,"lon":78.4867,"tz":"Asia/Kolkata","label":"Hyderabad"},"panchang":{"vara":"Sunday","paksha":"Krishna","lunarMonth":"Ashwayuja"},"windows":[{"id":"rahu","label":"Rahu Kalam","kind":"inauspicious","start":{"iso":"2026-11-08T11:00:00Z","local":"16:30"},"end":{"iso":"2026-11-08T12:30:00Z","local":"18:00"}}],"notes":[]}}}},"400":{"description":"Invalid or missing parameters.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Invalid parameters","status":400,"detail":"date: date must be YYYY-MM-DD","instance":"/api/v1/calendar/day"}}}},"404":{"description":"Place not found or unknown resource.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Place not found","status":404,"detail":"No place matched \"Xyzzy\".","instance":"/api/v1/calendar/day"}}}},"429":{"description":"Rate limit exceeded (120 requests per 60s per client).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Too many requests","status":429,"detail":"Retry after the Retry-After interval."}}}},"500":{"description":"Unexpected server error.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal error","status":500}}}},"502":{"description":"The upstream ephemeris (jotish.ai) failed.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Upstream calculation failed","status":502}}}}}}},"/api/v1/panchang":{"get":{"operationId":"getPanchang","summary":"Get the raw normalised panchang","description":"Returns the language- and tradition-independent astronomical record for one civil date at a location: sunrise/sunset, tithi(s), nakshatra(s), yoga(s), karana(s) with ISO-8601 UTC start/end instants, Amanta lunar month, Shaka year, sidereal longitudes and the Rahu/Yamagandam/Gulika periods. Derived from the jotish.ai ephemeris.\n\nEquivalent MCP tool: `get_panchang`.","tags":["astronomy"],"parameters":[{"name":"lat","in":"query","required":false,"description":"Latitude in decimal degrees (-90..90). Use with lon and tz.","schema":{"type":"number","minimum":-90,"maximum":90},"example":17.385},{"name":"lon","in":"query","required":false,"description":"Longitude in decimal degrees (-180..180). Use with lat and tz.","schema":{"type":"number","minimum":-180,"maximum":180},"example":78.4867},{"name":"tz","in":"query","required":false,"description":"IANA time zone, e.g. Asia/Kolkata.","schema":{"type":"string","minLength":1,"maxLength":64},"example":"Asia/Kolkata"},{"name":"place","in":"query","required":false,"description":"Free-text place name (e.g. \"Hyderabad\"); resolved via the geocoder, first hit wins. Alternative to lat/lon/tz.","schema":{"type":"string","minLength":2,"maxLength":120},"example":"Hyderabad"},{"name":"date","in":"query","required":false,"description":"Civil date YYYY-MM-DD. Defaults to today in the location time zone.","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"example":"2026-11-08"}],"security":[],"x-mcp-tool":"get_panchang","x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://fatcalendar.com/api/v1/panchang?tradition=telugu&lang=en&place=Hyderabad&date=2026-11-08'"}],"responses":{"200":{"description":"Success. Astronomical results are immutable and cacheable.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PanchangDay"}}}},"400":{"description":"Invalid or missing parameters.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Invalid parameters","status":400,"detail":"date: date must be YYYY-MM-DD","instance":"/api/v1/panchang"}}}},"404":{"description":"Place not found or unknown resource.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Place not found","status":404,"detail":"No place matched \"Xyzzy\".","instance":"/api/v1/panchang"}}}},"429":{"description":"Rate limit exceeded (120 requests per 60s per client).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Too many requests","status":429,"detail":"Retry after the Retry-After interval."}}}},"500":{"description":"Unexpected server error.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal error","status":500}}}},"502":{"description":"The upstream ephemeris (jotish.ai) failed.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Upstream calculation failed","status":502}}}}}}},"/api/v1/festivals":{"get":{"operationId":"listFestivals","summary":"List festivals of a year","description":"Lists every festival, vrata, fast, holiday, gurpurab and feast of a Gregorian year for a tradition, each with its civil date, name in the requested language, English name, kind, whether it is major, and the rule that determines the date (e.g. \"Kartika Amavasya at sunrise\").\n\nEquivalent MCP tool: `list_festivals`.","tags":["festivals"],"parameters":[{"name":"tradition","in":"query","required":false,"description":"Calendar tradition. One of: gregorian, telugu, tamil, kannada, malayalam, marathi, gujarati, punjabi, bengali, hindi, muslim, christian.","schema":{"default":"gregorian","type":"string","enum":["gregorian","telugu","tamil","kannada","malayalam","marathi","gujarati","punjabi","bengali","hindi","muslim","christian"]},"example":"punjabi"},{"name":"lang","in":"query","required":false,"description":"Display language (independent of tradition): en, te, ta, kn, ml, mr, gu, pa, bn, hi, ur.","schema":{"default":"en","type":"string","enum":["en","te","ta","kn","ml","mr","gu","pa","bn","hi","ur"]},"example":"pa"},{"name":"digits","in":"query","required":false,"description":"Digit script for numbers in the response: latin (default) or native (e.g. Telugu or Tamil numerals).","schema":{"type":"string","enum":["latin","native"]}},{"name":"variant","in":"query","required":false,"description":"Optional tradition sub-variant (default per tradition; see GET /api/v1/traditions). Valid: tamil: thirukanitha|vakya; kannada: smarta|madhva; malayalam: default|nazhika; punjabi: nanakshahi|desi|hindu; bengali: west-bengal-bisuddha|west-bengal-gupta|bangladesh; hindi: purnimanta|amanta|varanasi|braj|awadh; muslim: india|astronomical|tabular|hanafi|shia; christian: western|orthodox|catholic|protestant.","schema":{"type":"string","minLength":1,"maxLength":32},"example":"nanakshahi"},{"name":"lat","in":"query","required":false,"description":"Latitude in decimal degrees (-90..90). Use with lon and tz.","schema":{"type":"number","minimum":-90,"maximum":90},"example":17.385},{"name":"lon","in":"query","required":false,"description":"Longitude in decimal degrees (-180..180). Use with lat and tz.","schema":{"type":"number","minimum":-180,"maximum":180},"example":78.4867},{"name":"tz","in":"query","required":false,"description":"IANA time zone, e.g. Asia/Kolkata.","schema":{"type":"string","minLength":1,"maxLength":64},"example":"Asia/Kolkata"},{"name":"place","in":"query","required":false,"description":"Free-text place name (e.g. \"Hyderabad\"); resolved via the geocoder, first hit wins. Alternative to lat/lon/tz.","schema":{"type":"string","minLength":2,"maxLength":120},"example":"Hyderabad"},{"name":"year","in":"query","required":false,"description":"Gregorian year, 1900-2200. Defaults to the current year.","schema":{"type":"integer","minimum":1900,"maximum":2200},"example":2026}],"security":[],"x-mcp-tool":"list_festivals","x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://fatcalendar.com/api/v1/festivals?tradition=telugu&lang=en&place=Hyderabad&year=2026'"}],"responses":{"200":{"description":"Success. Astronomical results are immutable and cacheable.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"}},"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DatedFestival"}}},"required":["items"]},"example":{"items":[{"id":"diwali","name":"Diwali","nameEn":"Diwali","kind":"festival","motif":"diya","major":true,"rule":"Ashwayuja Amavasya (pradosha)","date":"2026-11-08"}]}}}},"400":{"description":"Invalid or missing parameters.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Invalid parameters","status":400,"detail":"date: date must be YYYY-MM-DD","instance":"/api/v1/festivals"}}}},"404":{"description":"Place not found or unknown resource.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Place not found","status":404,"detail":"No place matched \"Xyzzy\".","instance":"/api/v1/festivals"}}}},"429":{"description":"Rate limit exceeded (120 requests per 60s per client).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Too many requests","status":429,"detail":"Retry after the Retry-After interval."}}}},"500":{"description":"Unexpected server error.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal error","status":500}}}},"502":{"description":"The upstream ephemeris (jotish.ai) failed.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Upstream calculation failed","status":502}}}}}}},"/api/v1/places":{"get":{"operationId":"searchPlaces","summary":"Search places (geocoder)","description":"Free-text place search (city, town, region). Returns candidates with label, latitude, longitude and IANA time zone, ready to pass as lat/lon/tz to the calendar operations.\n\nEquivalent MCP tool: `search_places`.","tags":["places"],"parameters":[{"name":"q","in":"query","required":true,"description":"Place name to search, e.g. \"Vijayawada\".","schema":{"type":"string","minLength":2,"maxLength":120},"example":"Vijayawada"}],"security":[],"x-mcp-tool":"search_places","x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://fatcalendar.com/api/v1/places?q=Hyderabad'"}],"responses":{"200":{"description":"Success. Astronomical results are immutable and cacheable.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Place"}},"example":[{"label":"Hyderabad, Telangana, India","lat":17.385,"lon":78.4867,"tz":"Asia/Kolkata"}]}}},"400":{"description":"Invalid or missing parameters.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Invalid parameters","status":400,"detail":"date: date must be YYYY-MM-DD","instance":"/api/v1/places"}}}},"404":{"description":"Place not found or unknown resource.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Place not found","status":404,"detail":"No place matched \"Xyzzy\".","instance":"/api/v1/places"}}}},"429":{"description":"Rate limit exceeded (120 requests per 60s per client).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Too many requests","status":429,"detail":"Retry after the Retry-After interval."}}}},"500":{"description":"Unexpected server error.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal error","status":500}}}},"502":{"description":"The upstream ephemeris (jotish.ai) failed.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Upstream calculation failed","status":502}}}}}}},"/api/v1/traditions":{"get":{"operationId":"listTraditions","summary":"List calendar traditions","description":"Lists the 12 supported traditions with id, name, region, default language, calendar system, a summary, the available `variants` ({id,name,description}) and `defaultVariant`. Pass a variant id as the `variant` parameter of calendar operations.\n\nEquivalent MCP tool: `list_traditions`.","tags":["catalog"],"parameters":[],"security":[],"x-mcp-tool":"list_traditions","x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://fatcalendar.com/api/v1/traditions'"}],"responses":{"200":{"description":"Success. Astronomical results are immutable and cacheable.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Tradition"}},"example":[{"id":"punjabi","name":"Punjabi","region":"Punjab","defaultLang":"pa","system":"Nanakshahi / Desi-Bikrami / Hindu","summary":"Nanakshahi, Desi...","defaultVariant":"nanakshahi","variants":[{"id":"nanakshahi","name":"Nanakshahi","description":"Fixed solar Nanakshahi calendar."}]}]}}},"400":{"description":"Invalid or missing parameters.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Invalid parameters","status":400,"detail":"date: date must be YYYY-MM-DD","instance":"/api/v1/traditions"}}}},"404":{"description":"Place not found or unknown resource.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Place not found","status":404,"detail":"No place matched \"Xyzzy\".","instance":"/api/v1/traditions"}}}},"429":{"description":"Rate limit exceeded (120 requests per 60s per client).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Too many requests","status":429,"detail":"Retry after the Retry-After interval."}}}},"500":{"description":"Unexpected server error.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal error","status":500}}}},"502":{"description":"The upstream ephemeris (jotish.ai) failed.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Upstream calculation failed","status":502}}}}}}},"/api/v1/languages":{"get":{"operationId":"listLanguages","summary":"List display languages","description":"Lists the 11 display languages (en, te, ta, kn, ml, mr, gu, pa, bn, hi, ur) with native and English names, BCP-47 tag and text direction. Any tradition can be shown in any language.\n\nEquivalent MCP tool: `list_languages`.","tags":["catalog"],"parameters":[],"security":[],"x-mcp-tool":"list_languages","x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -s 'https://fatcalendar.com/api/v1/languages'"}],"responses":{"200":{"description":"Success. Astronomical results are immutable and cacheable.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Language"}},"example":[{"id":"en","native":"English","english":"English","bcp47":"en-IN","dir":"ltr"}]}}},"400":{"description":"Invalid or missing parameters.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Invalid parameters","status":400,"detail":"date: date must be YYYY-MM-DD","instance":"/api/v1/languages"}}}},"404":{"description":"Place not found or unknown resource.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Place not found","status":404,"detail":"No place matched \"Xyzzy\".","instance":"/api/v1/languages"}}}},"429":{"description":"Rate limit exceeded (120 requests per 60s per client).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Too many requests","status":429,"detail":"Retry after the Retry-After interval."}}}},"500":{"description":"Unexpected server error.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal error","status":500}}}},"502":{"description":"The upstream ephemeris (jotish.ai) failed.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Upstream calculation failed","status":502}}}}}}},"/api/v1/health":{"get":{"operationId":"getHealth","summary":"Health check","description":"Liveness probe. Always returns {\"ok\":true} when the service is up. Safe to call without parameters.","tags":["meta"],"security":[],"responses":{"200":{"description":"Service is up.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"},"example":{"ok":true,"service":"fatcalendar","time":"2026-11-08T00:00:00.000Z"}}}},"500":{"description":"Unexpected server error.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"about:blank","title":"Internal error","status":500}}}}}}}},"components":{"schemas":{"TimeLabel":{"type":"object","properties":{"iso":{"type":"string","description":"Instant, ISO-8601 UTC.","format":"date-time"},"local":{"type":"string","description":"Local wall time HH:MM; a trailing \"+\" means the instant falls after local midnight (next civil day).","example":"14:12"}},"required":["iso","local"],"description":"A time as both UTC instant and location-local label."},"NamedTime":{"type":"object","properties":{"name":{"type":"string","description":"Name in the response language."},"id":{"type":"string","description":"Stable id."},"endsAt":{"$ref":"#/components/schemas/TimeLabel"},"startsAt":{"$ref":"#/components/schemas/TimeLabel"},"detail":{"type":"string","description":"Extra detail."}},"required":["name"]},"Location":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"tz":{"type":"string","description":"IANA time zone."},"label":{"type":"string","description":"Human-readable place name."},"country":{"type":"string","description":"ISO country code, if known."}},"required":["lat","lon","tz","label"],"description":"Resolved location used for the calculation (quantised to 0.1 degree)."},"Place":{"type":"object","properties":{"label":{"type":"string","description":"Display name."},"lat":{"type":"number"},"lon":{"type":"number"},"tz":{"type":"string","description":"IANA time zone."}},"required":["label","lat","lon","tz"],"description":"A geocoded place."},"FestivalItem":{"type":"object","properties":{"id":{"type":"string","description":"Stable slug, e.g. diwali, maha-shivaratri."},"name":{"type":"string","description":"Name in the requested language."},"nameEn":{"type":"string","description":"English name."},"kind":{"type":"string","enum":["festival","vrata","fast","lunar","solar","holiday","gurpurab","observance","feast"]},"motif":{"type":"string","description":"Illustration motif id."},"scene":{"type":"string","description":"Hero banner scene id (major festivals)."},"major":{"type":"boolean"},"rule":{"type":"string","description":"Why this date, e.g. \"Kartika Amavasya at sunrise\"."}},"required":["id","name","nameEn","kind","motif","major"]},"DatedFestival":{"allOf":[{"$ref":"#/components/schemas/FestivalItem"},{"type":"object","properties":{"date":{"type":"string","description":"Civil date YYYY-MM-DD.","format":"date"}},"required":["date"]}]},"DayCell":{"type":"object","properties":{"date":{"type":"string","description":"Civil date.","format":"date"},"weekday":{"type":"integer","description":"0 = Sunday.","minimum":0,"maximum":6},"gregorianDay":{"type":"integer","description":"Day of month."},"inMonth":{"type":"boolean","description":"False for padding days from adjacent months."},"traditionalDate":{"type":"object","properties":{"primary":{"type":"string","description":"Main traditional date label."},"secondary":{"type":"string","description":"Secondary label."},"monthName":{"type":"string","description":"Traditional month name."},"dayNumber":{"type":"integer","description":"Day number."}},"required":["primary"]},"tithi":{"allOf":[{"$ref":"#/components/schemas/NamedTime"},{"type":"object","properties":{"paksha":{"type":"string","description":"Shukla / Krishna (localized)."},"number":{"type":"integer","description":"Tithi 1..30."}},"required":["paksha","number"]}]},"nakshatra":{"$ref":"#/components/schemas/NamedTime"},"moonPhase":{"type":"number","minimum":0,"maximum":1,"description":"0 = new moon, 0.5 = full moon."},"markers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Marker id (purnima, amavasya, ekadashi, pradosham, sankranti...)."},"label":{"type":"string","description":"Localized label."},"motif":{"type":"string","description":"Motif id."}},"required":["id","label","motif"]},"description":"Recurring lunar/solar markers."},"festivals":{"type":"array","items":{"$ref":"#/components/schemas/FestivalItem"}},"extra":{"type":"array","items":{"type":"string","description":"Tradition-specific line."},"description":"E.g. Hijri date, Kollavarsham date, Sud/Vad, Sangrand."},"holiday":{"type":"string","description":"Public holiday name, if any."}},"required":["date","weekday","gregorianDay","inMonth","traditionalDate","moonPhase","markers","festivals"]},"Header":{"type":"object","properties":{"title":{"type":"string","description":"Localized title, e.g. \"November 2026\"."},"subtitle":{"type":"string","description":"Localized subtitle."},"gregorian":{"type":"string","description":"Gregorian range label."},"yearName":{"type":"string","description":"Samvatsara / era label."},"eras":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","description":"Era name."},"value":{"type":"string","description":"Era year."}},"required":["label","value"]}},"months":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Traditional month."},"from":{"type":"string","description":"Start date."},"to":{"type":"string","description":"End date."}},"required":["name","from","to"]}},"ayana":{"type":"string","description":"Ayana."},"rituvu":{"type":"string","description":"Ritu (season)."},"scene":{"type":"string","description":"Hero banner scene id."},"heroFestival":{"$ref":"#/components/schemas/FestivalItem"}},"required":["title","subtitle","gregorian","eras","months","scene"]},"MonthResponse":{"type":"object","properties":{"view":{"const":"month"},"tradition":{"type":"string","enum":["gregorian","telugu","tamil","kannada","malayalam","marathi","gujarati","punjabi","bengali","hindi","muslim","christian"],"description":"Tradition the response was computed for."},"lang":{"type":"string","enum":["en","te","ta","kn","ml","mr","gu","pa","bn","hi","ur"],"description":"Display language of all text fields."},"location":{"$ref":"#/components/schemas/Location"},"year":{"type":"integer","description":"Gregorian year."},"month":{"type":"integer","description":"1-12."},"header":{"$ref":"#/components/schemas/Header"},"days":{"type":"array","items":{"$ref":"#/components/schemas/DayCell"}},"notes":{"type":"array","items":{"type":"string","description":"Accuracy or method note."}}},"required":["view","tradition","lang","location","year","month","header","days","notes"],"description":"A month grid."},"WeekResponse":{"type":"object","properties":{"view":{"const":"week"},"tradition":{"type":"string","enum":["gregorian","telugu","tamil","kannada","malayalam","marathi","gujarati","punjabi","bengali","hindi","muslim","christian"],"description":"Tradition the response was computed for."},"lang":{"type":"string","enum":["en","te","ta","kn","ml","mr","gu","pa","bn","hi","ur"],"description":"Display language of all text fields."},"location":{"$ref":"#/components/schemas/Location"},"start":{"type":"string","description":"First day (Sunday).","format":"date"},"header":{"$ref":"#/components/schemas/Header"},"days":{"type":"array","items":{"$ref":"#/components/schemas/DayCell"}},"notes":{"type":"array","items":{"type":"string","description":"Note."}}},"required":["view","tradition","lang","location","start","header","days","notes"],"description":"Seven days."},"YearResponse":{"type":"object","properties":{"view":{"const":"year"},"tradition":{"type":"string","enum":["gregorian","telugu","tamil","kannada","malayalam","marathi","gujarati","punjabi","bengali","hindi","muslim","christian"],"description":"Tradition the response was computed for."},"lang":{"type":"string","enum":["en","te","ta","kn","ml","mr","gu","pa","bn","hi","ur"],"description":"Display language of all text fields."},"location":{"$ref":"#/components/schemas/Location"},"year":{"type":"integer","description":"Gregorian year."},"header":{"$ref":"#/components/schemas/Header"},"months":{"type":"array","items":{"type":"object","properties":{"month":{"type":"integer","description":"1-12."},"name":{"type":"string","description":"Localized month name."},"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date."},"gregorianDay":{"type":"integer","description":"Day."},"weekday":{"type":"integer","description":"0=Sun."},"moonPhase":{"type":"number"},"markers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id."},"label":{"type":"string","description":"Label."},"motif":{"type":"string","description":"Motif."}},"required":["id","label","motif"]}}},"required":["date","gregorianDay","weekday","moonPhase","markers"]}},"festivals":{"type":"array","items":{"$ref":"#/components/schemas/DatedFestival"}}},"required":["month","name","days","festivals"]}},"notes":{"type":"array","items":{"type":"string","description":"Note."}}},"required":["view","tradition","lang","location","year","header","months","notes"],"description":"Twelve compact months."},"PanchangLine":{"type":"object","properties":{"label":{"type":"string","description":"Element name."},"value":{"type":"string","description":"Value in the response language."},"endsAt":{"$ref":"#/components/schemas/TimeLabel"},"icon":{"type":"string","description":"Icon/motif id."}},"required":["label","value"]},"TimeWindow":{"type":"object","properties":{"id":{"type":"string","description":"rahu, yamagandam, gulika, abhijit, brahma, varjyam, durmuhurtham, amrita..."},"label":{"type":"string","description":"Localized label."},"kind":{"type":"string","enum":["auspicious","inauspicious","neutral"]},"start":{"$ref":"#/components/schemas/TimeLabel"},"end":{"$ref":"#/components/schemas/TimeLabel"},"note":{"type":"string","description":"Note."}},"required":["id","label","kind","start","end"]},"DayResponse":{"type":"object","properties":{"view":{"const":"day"},"tradition":{"type":"string","enum":["gregorian","telugu","tamil","kannada","malayalam","marathi","gujarati","punjabi","bengali","hindi","muslim","christian"],"description":"Tradition the response was computed for."},"lang":{"type":"string","enum":["en","te","ta","kn","ml","mr","gu","pa","bn","hi","ur"],"description":"Display language of all text fields."},"location":{"$ref":"#/components/schemas/Location"},"date":{"type":"string","description":"Civil date.","format":"date"},"header":{"$ref":"#/components/schemas/Header"},"cell":{"$ref":"#/components/schemas/DayCell"},"panchang":{"type":"object","properties":{"vara":{"type":"string","description":"Weekday name."},"tithi":{"$ref":"#/components/schemas/PanchangLine"},"nakshatra":{"$ref":"#/components/schemas/PanchangLine"},"yoga":{"$ref":"#/components/schemas/PanchangLine"},"karana":{"$ref":"#/components/schemas/PanchangLine"},"paksha":{"type":"string","description":"Paksha."},"lunarMonth":{"type":"string","description":"Lunar month."},"samvatsara":{"type":"string","description":"Samvatsara."}},"required":["vara","tithi","nakshatra","yoga","karana","paksha","lunarMonth"]},"sun":{"type":"object","properties":{"sunrise":{"$ref":"#/components/schemas/TimeLabel"},"sunset":{"$ref":"#/components/schemas/TimeLabel"},"moonrise":{"$ref":"#/components/schemas/TimeLabel"},"moonset":{"$ref":"#/components/schemas/TimeLabel"}},"required":["sunrise","sunset"]},"windows":{"type":"array","items":{"$ref":"#/components/schemas/TimeWindow"}},"choghadiya":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Name."},"kind":{"type":"string","enum":["auspicious","inauspicious","neutral"]},"start":{"$ref":"#/components/schemas/TimeLabel"},"end":{"$ref":"#/components/schemas/TimeLabel"},"night":{"type":"boolean"}},"required":["name","kind","start","end","night"]}},"prayers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"fajr, dhuhr, asr, maghrib, isha..."},"label":{"type":"string","description":"Label."},"time":{"$ref":"#/components/schemas/TimeLabel"}},"required":["id","label","time"]},"description":"Muslim tradition only."},"hijri":{"type":"object","properties":{"day":{"type":"integer","description":"Day."},"month":{"type":"string","description":"Month."},"year":{"type":"integer","description":"AH year."},"provisional":{"type":"boolean","description":"True when the date depends on local moon sighting and may differ by a day."},"convention":{"type":"string","description":"Calculation convention."}},"required":["day","month","year","provisional","convention"]},"festivals":{"type":"array","items":{"$ref":"#/components/schemas/FestivalItem"}},"nazhika":{"type":"boolean"},"notes":{"type":"array","items":{"type":"string","description":"Note."}}},"required":["view","tradition","lang","location","date","header","cell","panchang","sun","windows","choghadiya","prayers","hijri","festivals","nazhika","notes"],"description":"Full daily almanac."},"Interval":{"type":"object","properties":{"number":{"type":"integer","description":"Index."},"index":{"type":"integer","description":"Index."},"pada":{"type":"integer","description":"Pada."},"start":{"type":"string","description":"Start, ISO-8601 UTC."},"end":{"type":"string","description":"End, ISO-8601 UTC."}},"required":["start","end"]},"PanchangDay":{"type":"object","description":"Normalised, tradition-independent astronomical record (all instants ISO-8601 UTC).","required":["date","tz","vara","sunrise","sunset","tithi","nakshatra"],"properties":{"date":{"type":"string","description":"Civil date."},"tz":{"type":"string","description":"IANA zone."},"vara":{"type":"integer","description":"0 = Sunday."},"sunrise":{"type":"string","description":"ISO UTC."},"sunset":{"type":"string","description":"ISO UTC."},"nextSunrise":{"type":"string","description":"ISO UTC."},"moonrise":{"type":["string","null"]},"moonset":{"type":["string","null"]},"tithi":{"$ref":"#/components/schemas/Interval"},"tithis":{"type":"array","items":{"$ref":"#/components/schemas/Interval"}},"nakshatra":{"$ref":"#/components/schemas/Interval"},"nakshatras":{"type":"array","items":{"$ref":"#/components/schemas/Interval"}},"yoga":{"$ref":"#/components/schemas/Interval"},"yogas":{"type":"array","items":{"$ref":"#/components/schemas/Interval"}},"karana":{"$ref":"#/components/schemas/Interval"},"karanas":{"type":"array","items":{"$ref":"#/components/schemas/Interval"}},"lunar":{"type":"object","properties":{"amantaMonth":{"type":"integer","description":"1 = Chaitra ... 12 = Phalguna."},"adhika":{"type":"boolean"},"kshaya":{"type":"boolean"},"start":{"type":"string","description":"ISO."},"end":{"type":"string","description":"ISO."}},"required":["amantaMonth","adhika","kshaya","start","end"]},"sakaYear":{"type":"integer","description":"Shaka year."},"sunSidereal":{"type":"number"},"moonSidereal":{"type":"number"},"periods":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Id."},"name":{"type":"string","description":"Name."},"start":{"type":"string","description":"ISO."},"end":{"type":"string","description":"ISO."}},"required":["id","name","start","end"]}},"newMoonStart":{"type":"string","description":"Previous new moon, ISO UTC."}}},"Tradition":{"type":"object","properties":{"id":{"type":"string","enum":["gregorian","telugu","tamil","kannada","malayalam","marathi","gujarati","punjabi","bengali","hindi","muslim","christian"]},"name":{"type":"string","description":"Name."},"region":{"type":"string","description":"Region."},"defaultLang":{"type":"string","description":"Default language id."},"system":{"type":"string","description":"Calendar system."},"summary":{"type":"string","description":"What the tradition shows."},"variants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Variant id, pass as the `variant` parameter."},"name":{"type":"string","description":"Name."},"description":{"type":"string","description":"What differs."}},"required":["id","name","description"]}},"defaultVariant":{"type":"string","description":"Variant used when `variant` is omitted."}},"required":["id","name","region","defaultLang","system","summary","variants"]},"Language":{"type":"object","properties":{"id":{"type":"string","enum":["en","te","ta","kn","ml","mr","gu","pa","bn","hi","ur"]},"native":{"type":"string","description":"Native name."},"english":{"type":"string","description":"English name."},"bcp47":{"type":"string","description":"BCP-47 tag."},"dir":{"type":"string","enum":["ltr","rtl"]}},"required":["id","native","english","bcp47","dir"]},"Problem":{"type":"object","description":"RFC 9457 problem details.","required":["type","title","status"],"properties":{"type":{"type":"string","description":"Problem type URI.","default":"about:blank"},"title":{"type":"string","description":"Short summary."},"status":{"type":"integer","description":"HTTP status."},"detail":{"type":"string","description":"Human-readable explanation and how to fix the request."},"instance":{"type":"string","description":"Request path."}}},"Health":{"type":"object","properties":{"ok":{"type":"boolean"},"service":{"type":"string","description":"Service name."},"time":{"type":"string","description":"Server time.","format":"date-time"}},"required":["ok","service","time"]}},"headers":{"RateLimit":{"description":"IETF RateLimit header: remaining quota and reset seconds.","schema":{"type":"string","example":"\"default\";r=119;t=60"}},"RateLimitPolicy":{"description":"IETF RateLimit-Policy header.","schema":{"type":"string","example":"\"default\";q=120;w=60"}},"CacheControl":{"description":"Astronomical data is immutable; explicit-location responses are shared-cacheable for a day.","schema":{"type":"string"}}},"securitySchemes":{}}}