API v2: ask only for what you use
v2 is the Estevão surface built for outside integrations: read-only, authenticated by key, with responses that start small and grow as you ask.
01 / Why
Cheap by default
v1 was designed for the Ordo app and returns everything one app screen needs. Someone who only wanted tomorrow's reading references got the whole day, with collect, psalm and morning and evening readings. v2 turns that around.
include and fields
include chooses what is computed (readings, text, collect, explanation). fields trims the attributes that come back. They are independent levers.
Explicit context
book, bible, psalter, lectionary, reading_type and lang are flat parameters. book is required: no silent default book.
Ranges in one call
/days accepts from and to, or year. A whole month or year comes back from a single request.
One shape
Every response is data, meta and, for collections, links. Every error is problem+json with a stable code.
v1 remains published with no end date. Use v2 for new integrations and migrate one route at a time, if and when it makes sense.
02 / Base URL
One key, one header
v2 accepts API keys only, sent in the X-API-Key header. It is the same key as v1: your plan, limits and usage dashboard cover both versions.
https://api.caminhoanglicano.com.br/api/v2curl -G "https://api.caminhoanglicano.com.br/api/v2/days/today" \
-H "X-API-Key: $ESTEVAO_API_KEY" \
--data-urlencode "book=loc_2015" \
--data-urlencode "include=readings,collect"Without the key the answer is 401 MISSING_API_KEY. Keep the key on your server: never put it in code that runs in a browser or an app.
03 / Context
book is required
On v1, forgetting the book gets you a 200 with data from a book you never chose. On v2, every resource that depends on the book requires book. The prayer book and Bible catalogues and /passages do not.
| Parameter | Description |
|---|---|
bookrequired | Prayer book code, such as loc_2015 or loc_1662_en. Required on every resource whose content depends on the book; v2 has no default book. See GET /api/v2/prayer-books. |
bible | Bible translation for texts, such as nvi or kjv. Defaults to the book's preferred version. See GET /api/v2/bible-versions. |
psalter | Psalter, when it differs from the Bible translation. |
lectionary | The book's lectionary variant, such as revised_1922 for the BCP 1662. Accepted variants are in the book's capabilities.lectionary.variants. |
reading_type | Lectionary reading type, such as semicontinuous, when the book offers more than one. |
lang | Response language, such as pt-BR or en. Defaults to the book's language. On catalogues, filters by language. |
{
"type": "https://estevao.caminhoanglicano.com.br/docs/v2/errors#missing-prayer-book",
"title": "Missing prayer book",
"status": 400,
"code": "MISSING_PRAYER_BOOK",
"detail": "O parâmetro 'book' é obrigatório na v2. Consulte GET /api/v2/prayer-books.",
"documentation_url": "https://estevao.caminhoanglicano.com.br/docs/v2",
"request_id": "6f0c2c1e-…"
}04 / include
include: what is computed
Without include, /days returns just the liturgical day: season, colour, week and the celebration that prevailed. Each include adds a sub-resource and has a relative cost, reported in X-Request-Cost.
| include | What it adds | Cost |
|---|---|---|
readings | References of the day's readings, as a list of slots. | +1 |
readings.text | Full text of each reading, in the bible translation. | +3 |
readings.morning | Morning Prayer readings, in morning_readings. | +1 |
readings.evening | Evening Prayer readings, in evening_readings. | +1 |
readings.alternatives | Alternative references, when the lectionary offers them. | +0 |
collect | The day's collect(s): title, kind and reference. | +1 |
collect.text | Collect body and preface. | +0 |
celebrations | Every competing celebration of the day, not only the one that prevailed. | +0 |
explanation | Why this colour, this season and these readings, with the provenance of each reading. | +4 |
- — A child implies its parent: include=readings.text already computes readings.
- — An include the endpoint does not offer answers 400 INVALID_INCLUDE, with the accepted list in allowed.
- — On /days/:date/readings and /collects/:date the resource is the one in the path; include only adds text or alternatives.
05 / fields
fields: what is serialized
fields[type] takes the list of attributes to return for that resource type. It does not change what is computed, only what comes back in the JSON.
/api/v2/days?book=loc_2015&from=2026-03-01&to=2026-03-31
&fields[day]=date,season,color,celebrationAccepted types: dayreadingcollectcelebrationcelebration_typeannual_overviewseasonkey_datelectionary_cycleprayer_bookbible_version
06 / Shape
data, meta and links
A single envelope, so you write one parser. Keys are English snake_case on every resource; values such as season and colour names come in the book's language or in lang.
{
"data": {
"date": "2026-03-25",
"liturgical_year": 2026,
"week_of_season": 5,
"is_sunday": false,
"is_holy_day": true,
"day_of_week": "Quarta-feira",
"season": { "slug": "lent", "name": "Quaresma" },
"color": "branco",
"description": ["Anunciação de Nosso Senhor Jesus Cristo à Bem-Aventurada Virgem Maria"],
"fast": null,
"celebration": {
"id": 412,
"name": "Anunciação de Nosso Senhor Jesus Cristo à Bem-Aventurada Virgem Maria",
"type": "principal_feast",
"color": "branco",
"movable": false,
"transferred": false
}
},
"meta": {
"prayer_book": "loc_2015",
"language": "pt-BR",
"bible": "nvi",
"generated_at": "2026-03-25T09:00:00Z"
}
}- — meta repeats the context that resolved the response: book, language, Bible translation and lectionary variant, when there is one.
- — Readings are a list with a slot (first_reading, psalm, second_reading, gospel…), not four fixed keys: books differ in how many readings they appoint.
- — A day without readings answers 200 with an empty readings list. 404 is for resources that do not exist.
- — Paginated collections carry links.self and links.next; meta carries count and total.
07 / Limits
Cache, cost and limits
X-API-Key
Quota per call
Each authenticated request counts as one call on the key's quota, as on v1. Your plan multiplies the daily and per-minute burst limits.
X-Request-Cost
Relative cost
Every response reports the relative work on the server: 1 per day, plus the weight of each include. It is an estimate and is never debited from the quota.
ETag · If-None-Match
Conditional requests
Send the ETag back in If-None-Match and get a bodiless 304 when nothing changed. Cache-Control: one hour for dates and catalogues, five minutes for today.
from · to · year
Ranges
Up to 366 days per call on /days. With readings.text or explanation, up to 31 days. Beyond that, 400 RANGE_TOO_LARGE with max_days.
08 / From v1 to v2
Where each route went
The data comes from the same liturgical services as v1; only the shape changes. v2 does not publish the Daily Office yet: for that, stay on v1.
| v1 | v2 |
|---|---|
GET /api/v1/calendar/today | GET /api/v2/days/today |
GET /api/v1/calendar/:y/:m/:d | GET /api/v2/days/2026-03-25 |
GET /api/v1/calendar/:y/:m | GET /api/v2/days?from=2026-03-01&to=2026-03-31 |
GET /api/v1/calendar/:y | GET /api/v2/days?year=2026 |
GET /api/v1/calendar/:y/overview | GET /api/v2/years/2026 |
GET /api/v1/calendar/:y/seasons | GET /api/v2/years/2026/seasons |
GET /api/v1/calendar/:y/key_dates | GET /api/v2/years/2026/key-dates |
GET /api/v1/calendar/:y/celebrations | GET /api/v2/celebrations?year=2026 |
GET /api/v1/lectionary/:y/:m/:d | GET /api/v2/days/2026-03-25/readings |
GET /api/v1/lectionary/:y/:m/:d/all_services | GET /api/v2/days/2026-03-25/readings?service=all |
GET /api/v1/lectionary/cycle/:y | GET /api/v2/years/2026/lectionary-cycle |
GET /api/v1/liturgical_explanation/:y/:m/:d | GET /api/v2/liturgical-explanations/2026-03-25 |
GET /api/v1/celebrations · /search · /date/:m/:d | GET /api/v2/celebrations?q=&month=&day= |
GET /api/v1/celebrations/types | GET /api/v2/celebrations/types |
GET /api/v1/prayer_books/:code/preferences | GET /api/v2/prayer-books/loc_2015/preferences |
GET /api/v1/bible_versions | GET /api/v2/bible-versions |
— | GET /api/v2/collects/2026-03-25 |
— | GET /api/v2/passages?ref=João+3:16&bible=nvi |
- — The preferences blob becomes flat parameters: book, bible, lectionary, psalter, reading_type and lang. The blob is still accepted to ease migration.
- — Dates are ISO (2026-03-25), both in paths and in responses.
- — Routes use hyphens (key-dates, prayer-books) instead of underscores.