download the app
§ Conventions

Caching

Cache aggressively. We do, and we expect you to. Most endpoints stay fresh enough at ten-minute TTLs that a single client-side or CDN cache layer eliminates ~90% of duplicate requests against your quota.

Per-endpoint defaults

Endpoints-maxagestale-while-revalidate
GET /saints (list)300s60s
GET /saints/{slug}300s60s
GET /saints/{slug}/hymnography600s120s
GET /countries600s120s
GET /countries/{slug}600s120s
GET /calendar/today60s30s
GET /calendar/{date}600s120s
GET /search120s30s
GET /openapi.json3600s86400s

Cache-Control header

Every successful response sets a public Cache-Control header. Errors and authenticated-only failures set private, no-store.

httphttp
HTTP/1.1 200 OK
Cache-Control: public, s-maxage=300, stale-while-revalidate=60
X-RateLimit-Tier: starter
X-RateLimit-Remaining-Minute: 287
X-RateLimit-Remaining-Month: 49823

Client-side caching tips

A 30-second in-memory map keyed by URL + endpoint is the cheapest possible win. Next.js users get this for free with fetch() and { next: { revalidate: 300 } }. For long-running services running behind Cloudflare or Vercel, set up an asset-rule to honor our Cache-Controlheaders and you're done.

Bypassing the cache

We don't expose a no-cache toggle. If you need fresher data than the TTL, that's a signal you should be using webhooks (planned for v2) or filing a feature request.