{"components":{"headers":{"ETag":{"description":"Weak validator over (cal, date, region, language-set, translations, data-version).","schema":{"type":"string"}},"RetryAfter":{"description":"Seconds until the rate-limit window resets (on 429).","schema":{"type":"integer"}}},"parameters":{"calendar":{"in":"path","name":"cal","required":true,"schema":{"enum":["ordinary","traditional","dominican"],"type":"string"}},"date":{"description":"ISO civil YYYY-MM-DD.","in":"path","name":"date","required":true,"schema":{"format":"date","type":"string"}},"editions":{"description":"Canonical alias for `translations` — named to match the echoed `editions` response field. Comma list of scripture edition ids (≤1 per language; current ids: vulgate, douay, cpdv — see /translations for the live set). Unknown → per-language default (lenient, with a collection warning). Wins over `translations` when both are sent.","in":"query","name":"editions","required":false,"schema":{"type":"string"}},"include":{"description":"Comma list of heavy layers to fold inline: masses, office, resolution, martyrology. The heavy layers (masses, office, martyrology) are rejected (400) on spans over 31 days; resolution has no span cap.","in":"query","name":"include","required":false,"schema":{"type":"string"}},"region":{"description":"Optional refinement; unknown → general (lenient, never an error).","in":"query","name":"region","required":false,"schema":{"default":"general","type":"string"}},"translations":{"description":"Comma list of scripture edition ids (≤1 per language; see /translations) applied to reading text. Unknown → per-language default (lenient, with a collection warning). The resolved choice is echoed as `editions` (response level) and `edition` (per reading). Alias: `editions` (identical semantics; wins if both are sent).","in":"query","name":"translations","required":false,"schema":{"type":"string"}}},"schemas":{"Celebration":{"properties":{"colour":{"$ref":"#/components/schemas/Colour"},"id":{"type":"string"},"name":{"$ref":"#/components/schemas/LitText"},"person":{"type":"string"},"rank":{"$ref":"#/components/schemas/Rank"},"titles":{"items":{"type":"string"},"type":"array"}},"required":["name","rank","colour"],"type":"object"},"Collection":{"properties":{"page":{"properties":{"next":{"type":["string","null"]},"total":{"type":"integer"}},"type":"object"},"query":{"type":"object"},"results":{"items":{},"type":"array"},"warnings":{"description":"Present when something was leniently clamped or fell back (span cap, unknown region/edition).","items":{"type":"string"},"type":"array"}},"required":["results","query","page"],"type":"object"},"Colour":{"properties":{"alternatives":{"items":{"type":"string"},"type":"array"},"default":{"type":"string"}},"required":["default","alternatives"],"type":"object"},"DayLinks":{"properties":{"masses_url":{"type":"string"},"office_url":{"type":"string"},"resolution_url":{"type":"string"}},"required":["office_url","masses_url","resolution_url"],"type":"object"},"DaySummary":{"properties":{"calendar":{"enum":["ordinary","traditional","dominican"],"type":"string"},"celebration":{"$ref":"#/components/schemas/Celebration"},"date":{"format":"date","type":"string"},"editions":{"additionalProperties":{"type":"string"},"description":"Scripture edition used per language (lang → id), always present (§10).","type":"object"},"links":{"$ref":"#/components/schemas/DayLinks"},"liturgical_year":{"$ref":"#/components/schemas/LiturgicalYear"},"masses":{"items":{"$ref":"#/components/schemas/MassDescriptor"},"type":"array"},"obligation":{"$ref":"#/components/schemas/Obligation"},"region":{"type":"string"},"region_default_applied":{"type":"boolean"},"saints":{"$ref":"#/components/schemas/SaintsBlock"},"season":{"$ref":"#/components/schemas/Season"},"weekday":{"type":"string"}},"required":["calendar","region","editions","date","weekday","liturgical_year","season","obligation","celebration","saints","masses","links"],"type":"object"},"LitText":{"additionalProperties":{"type":"string"},"description":"Language map { la, en, … }; Latin is always present.","type":"object"},"LiturgicalYear":{"properties":{"psalter_week":{"type":["integer","null"]},"starts":{"format":"date","type":"string"},"sunday_cycle":{"enum":["A","B","C",null],"type":["string","null"]},"weekday_cycle":{"enum":["I","II",null],"type":["string","null"]}},"required":["starts"],"type":"object"},"MassDescriptor":{"properties":{"colour":{"$ref":"#/components/schemas/Colour"},"id":{"type":"string"},"name":{"$ref":"#/components/schemas/LitText"},"option_type":{"enum":["prescribed","optional"],"type":"string"},"readings":{"items":{"$ref":"#/components/schemas/Reading"},"type":"array"}},"required":["id","name","colour","option_type"],"type":"object"},"Obligation":{"properties":{"reason":{"type":["string","null"]},"reason_code":{"enum":["lapses-saturday","lapses-monday","transferred","not-precept-in-region",null],"type":["string","null"]},"status":{"enum":["yes","no","lapsed"],"type":"string"}},"required":["status","reason_code"],"type":"object"},"OfficeHour":{"properties":{"antiphons":{"items":{"$ref":"#/components/schemas/LitText"},"type":"array"},"collect":{"$ref":"#/components/schemas/LitText"},"hour":{"description":"The canonical hour name. The 'second-vespers' request alias is normalised to 'vespers' here; 'first-vespers' is never returned (it 404s).","enum":["matins","lauds","prime","terce","sext","none","vespers","compline",null],"type":["string","null"]},"hymn":{"$ref":"#/components/schemas/LitText"},"psalmody":{"items":{"$ref":"#/components/schemas/Reading"},"type":"array"},"reading":{"$ref":"#/components/schemas/Reading"}},"type":"object"},"Person":{"properties":{"calendars":{"additionalProperties":{"properties":{"date":{"description":"MM-DD (fixed) or a moveable anchor key.","type":"string"},"id":{"description":"Rite-scoped slug.","type":"string"},"rank":{"type":"string"},"ref":{"description":"Down-link to the rite-scoped entry.","type":"string"},"titles":{"items":{"type":"string"},"type":"array"}},"required":["id","date","rank","ref"],"type":"object"},"description":"One block per rite that keeps the saint.","type":"object"},"name":{"$ref":"#/components/schemas/LitText"},"person":{"description":"Canonical cross-rite slug (§11).","type":"string"}},"required":["person","name","calendars"],"type":"object"},"Problem":{"properties":{"detail":{"type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"format":"uri","type":"string"}},"required":["type","title","status"],"type":"object"},"Rank":{"properties":{"cycle":{"description":"Which cycle proposed this office (§4).","enum":["sanctorale","temporale",null],"type":["string","null"]},"label":{"type":"string"},"precedence":{"type":"integer"}},"required":["label","precedence"],"type":"object"},"Reading":{"properties":{"edition":{"additionalProperties":{"type":"string"},"description":"Which scripture edition produced each language's text (lang → id).","type":"object"},"ref":{"type":"string"},"role":{"type":"string"},"text":{"$ref":"#/components/schemas/LitText"}},"type":"object"},"Resolution":{"properties":{"displaced":{"items":{"properties":{"chain":{"items":{"format":"date","type":"string"},"type":"array"},"name":{"$ref":"#/components/schemas/LitText"},"outcome":{"enum":["commemorated","omitted","not-observed","transferred"],"type":"string"}},"required":["name","outcome"],"type":"object"},"type":"array"},"winner":{"description":"The proposing cycle that won (sanctorale | temporale), or 'celebration' where the engine doesn't track it.","type":"string"}},"required":["winner"],"type":"object"},"SaintEntry":{"properties":{"id":{"type":"string"},"name":{"$ref":"#/components/schemas/LitText"},"person":{"type":"string"},"rank":{"$ref":"#/components/schemas/Rank"}},"required":["name","rank"],"type":"object"},"SaintsBlock":{"description":"The day's saints, keyed by what happened: celebrated/commemorated are THIS calendar's answer to 'whose feast is it?'; remembered is the Roman Martyrology (every saint of the date, 1916 public-domain edition). Future outcomes (transferred, omitted) arrive as new keys.","properties":{"celebrated":{"items":{"$ref":"#/components/schemas/SaintEntry"},"type":"array"},"commemorated":{"items":{"$ref":"#/components/schemas/SaintEntry"},"type":"array"},"remembered":{"items":{"properties":{"name":{"type":"string"},"note":{"description":"The eulogy — present only with ?include=martyrology.","type":"string"}},"required":["name"],"type":"object"},"type":"array"}},"required":["celebrated","commemorated","remembered"],"type":"object"},"Season":{"properties":{"arc":{"type":["string","null"]},"id":{"type":"string"},"week":{"type":["integer","null"]}},"required":["id"],"type":"object"}},"securitySchemes":{"bearerAuth":{"description":"A Gianna API key (`gianna_...`) from Settings, Developer access. Every plan includes one.","scheme":"bearer","type":"http"},"oauth2":{"description":"OAuth 2.1 authorization code with PKCE (S256). The token is a scoped API key.","flows":{"authorizationCode":{"authorizationUrl":"/oauth/authorize","scopes":{"directory:read":"Look up churches and their Mass and Confession times","household:read":"Read your tasks, reminders, routines, intentions, novena, and memory","household:write":"Add and change your tasks, reminders, intentions, and novena","liturgy:read":"Read the liturgical calendar, Mass readings, Office, saints, and novenas","reference:read":"Read Catholic reference data: the liturgy, Scripture, prayers, teaching, churches and their times, saints, relics, lineage, groups and jobs"},"tokenUrl":"/oauth/token"}},"type":"oauth2"}}},"info":{"description":"Catholic liturgical data — calendar, Mass propers, Office, and saints — across the Roman Ordinary, Roman 1962 (TLM), and Dominican rites. Read-only. Latin is the always-present floor; vernacular text layers on via Accept-Language.","license":{"name":"Proprietary"},"title":"Gianna Liturgy API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/":{"get":{"operationId":"getIndex","responses":{"200":{"description":"OK"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[],"summary":"Service index"}},"/calendars":{"get":{"operationId":"getCalendars","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}},"description":"OK","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"List rites"}},"/calendars/{cal}":{"get":{"operationId":"getCalendarsCal","parameters":[{"$ref":"#/components/parameters/calendar"}],"responses":{"200":{"description":"OK"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"One rite's metadata"}},"/calendars/{cal}/days":{"get":{"operationId":"getCalendarsCalDays","parameters":[{"$ref":"#/components/parameters/calendar"},{"$ref":"#/components/parameters/region"},{"$ref":"#/components/parameters/include"},{"$ref":"#/components/parameters/translations"},{"$ref":"#/components/parameters/editions"},{"in":"query","name":"from","required":true,"schema":{"format":"date","type":"string"}},{"in":"query","name":"to","required":true,"schema":{"format":"date","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}},"description":"OK","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"Range of day summaries"}},"/calendars/{cal}/days/{date}":{"get":{"operationId":"getCalendarsCalDaysDate","parameters":[{"$ref":"#/components/parameters/calendar"},{"$ref":"#/components/parameters/date"},{"$ref":"#/components/parameters/region"},{"$ref":"#/components/parameters/include"},{"$ref":"#/components/parameters/translations"},{"$ref":"#/components/parameters/editions"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DaySummary"}}},"description":"OK","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"Day summary"}},"/calendars/{cal}/days/{date}/masses":{"get":{"operationId":"getCalendarsCalDaysDateMasses","parameters":[{"$ref":"#/components/parameters/calendar"},{"$ref":"#/components/parameters/date"},{"$ref":"#/components/parameters/region"},{"$ref":"#/components/parameters/translations"},{"$ref":"#/components/parameters/editions"}],"responses":{"200":{"description":"OK"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"Full Mass propers"}},"/calendars/{cal}/days/{date}/masses/{mass}":{"get":{"operationId":"getCalendarsCalDaysDateMassesMass","parameters":[{"$ref":"#/components/parameters/calendar"},{"$ref":"#/components/parameters/date"},{"$ref":"#/components/parameters/region"},{"$ref":"#/components/parameters/translations"},{"$ref":"#/components/parameters/editions"},{"in":"path","name":"mass","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"One Mass"}},"/calendars/{cal}/days/{date}/office":{"get":{"operationId":"getCalendarsCalDaysDateOffice","parameters":[{"$ref":"#/components/parameters/calendar"},{"$ref":"#/components/parameters/date"},{"$ref":"#/components/parameters/region"}],"responses":{"200":{"description":"OK"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"All exposed hours"}},"/calendars/{cal}/days/{date}/office/{hour}":{"get":{"operationId":"getCalendarsCalDaysDateOfficeHour","parameters":[{"$ref":"#/components/parameters/calendar"},{"$ref":"#/components/parameters/date"},{"$ref":"#/components/parameters/region"},{"description":"Bare 'vespers' ⇒ second Vespers (the day's own); 'second-vespers' is an accepted alias for it and returns hour:'vespers'. NOTE: 'first-vespers' (the eve-of office, owned by concurrence) is NOT an accepted value — concurrence resolution isn't computed yet, so requesting it always 404s. It is deliberately absent from the enum until that lands.","in":"path","name":"hour","required":true,"schema":{"enum":["matins","lauds","prime","terce","sext","none","vespers","compline","second-vespers"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficeHour"}}},"description":"OK","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"One hour"}},"/calendars/{cal}/days/{date}/resolution":{"get":{"operationId":"getCalendarsCalDaysDateResolution","parameters":[{"$ref":"#/components/parameters/calendar"},{"$ref":"#/components/parameters/date"},{"$ref":"#/components/parameters/region"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resolution"}}},"description":"OK","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"Why this office won"}},"/calendars/{cal}/feasts.ics":{"get":{"description":"Public (no API key): calendar clients subscribe by URL. All-day events from 31 days ago to 400 days ahead, with stable UIDs. Cached for six hours.","operationId":"getCalendarsCalFeastsIcs","parameters":[{"$ref":"#/components/parameters/calendar"},{"$ref":"#/components/parameters/region"},{"description":"Lowest rank included. `all` adds optional memorials and commemorations.","in":"query","name":"rank","required":false,"schema":{"default":"feast","enum":["solemnity","feast","memorial","all"],"type":"string"}},{"description":"Language of event titles; falls back to Latin where no English title exists.","in":"query","name":"lang","required":false,"schema":{"default":"en","enum":["en","la"],"type":"string"}}],"responses":{"200":{"content":{"text/calendar":{"schema":{"type":"string"}}},"description":"RFC 5545 calendar","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"304":{"description":"Not modified (If-None-Match)"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"}},"security":[],"summary":"Subscribable iCalendar feed of feast days"}},"/calendars/{cal}/saints":{"get":{"operationId":"getCalendarsCalSaints","parameters":[{"$ref":"#/components/parameters/calendar"},{"in":"query","name":"q","schema":{"type":"string"}},{"description":"Filter by category title (martyr, confessor, virgin, …).","in":"query","name":"title","schema":{"type":"string"}},{"in":"query","name":"month","schema":{"type":"string"}},{"in":"query","name":"page","schema":{"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}},"description":"OK","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"Search within one rite"}},"/calendars/{cal}/saints/{id}":{"get":{"operationId":"getCalendarsCalSaintsId","parameters":[{"$ref":"#/components/parameters/calendar"},{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"A saint's rite-scoped entry"}},"/calendars/{cal}/years/{label}":{"get":{"operationId":"getCalendarsCalYearsLabel","parameters":[{"$ref":"#/components/parameters/calendar"},{"$ref":"#/components/parameters/region"},{"$ref":"#/components/parameters/include"},{"$ref":"#/components/parameters/translations"},{"$ref":"#/components/parameters/editions"},{"description":"Canonical YYYY-YYYY (Advent-to-Advent); bare YYYY or a contained date 301-redirects.","in":"path","name":"label","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}},"description":"OK","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"301":{"description":"Non-canonical label (bare YYYY or a contained date) — Location names the canonical YYYY-YYYY span."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"A liturgical year of summaries"}},"/novenas":{"get":{"operationId":"getNovenas","parameters":[{"description":"Year for the computed feast/suggested_start dates (default: current).","in":"query","name":"year","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}},"description":"OK","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"The novena catalogue (no prayer text)"}},"/novenas/upcoming":{"get":{"operationId":"getNovenasUpcoming","parameters":[{"description":"Look-ahead start date (default: today).","in":"query","name":"from","schema":{"format":"date","type":"string"}},{"description":"Window in days (default 30).","in":"query","name":"days","schema":{"maximum":366,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}},"description":"OK","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"Novenas whose traditional start falls soon"}},"/novenas/{slug}":{"get":{"operationId":"getNovenasSlug","parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"in":"query","name":"year","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"One novena, with prayer text when available"}},"/openapi.json":{"get":{"operationId":"getOpenapiJson","responses":{"200":{"description":"OK"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"security":[],"summary":"This document"}},"/prayers":{"get":{"operationId":"getPrayers","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}},"description":"OK","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"The reviewed common-prayer corpus, English and Latin, with sources"}},"/prayers/{id}":{"get":{"operationId":"getPrayersId","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"One prayer by id, title, or alias"}},"/regions":{"get":{"operationId":"getRegions","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}},"description":"OK","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"Known regions"}},"/saints":{"get":{"operationId":"getSaints","parameters":[{"in":"query","name":"q","schema":{"type":"string"}},{"description":"Filter by category title (martyr, confessor, virgin, …).","in":"query","name":"title","schema":{"type":"string"}},{"in":"query","name":"month","schema":{"type":"string"}},{"description":"1-based page; page.next echoes the cursor.","in":"query","name":"page","schema":{"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}},"description":"OK","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"Search saints across all rites"}},"/saints/{person}":{"get":{"operationId":"getSaintsPerson","parameters":[{"in":"path","name":"person","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Person"}}},"description":"OK","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"One saint, all calendars at once"}},"/scripture":{"get":{"operationId":"getScripture","parameters":[{"description":"A citation, e.g. Jn 3:16 or Eph 6:10-17.","in":"query","name":"ref","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/editions"}],"responses":{"200":{"description":"OK: reference, text by language, and the editions used"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"Exact text of a Scripture passage"}},"/translations":{"get":{"operationId":"getTranslations","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Collection"}}},"description":"OK","headers":{"ETag":{"$ref":"#/components/headers/ETag"}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Malformed input"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Missing/invalid API key"},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The plan is not active or trialing, or the account is an anonymous visitor"},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Unknown calendar/saint/hour/mass"},"405":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Read-only API; non-GET verb (Allow: GET)"},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Well-formed but out of the edition's supported range"},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Rate-limited","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"summary":"Available scripture editions per language + defaults"}}},"security":[{"bearerAuth":[]},{"oauth2":["liturgy:read"]}],"servers":[{"description":"Version 1 (additive within the major version)","url":"/liturgy/v1"}]}