Holiday calendar
Chilean industrial-property deadlines are counted in business days, so the corpus keeps the statutory holiday calendar for its own arithmetic (opposition windows, appeal deadlines). This guide covers the endpoint that exposes it, so you can compute those same deadlines yourself — and audit ours.
The complete, always-current per-field schema lives in the interactive OpenAPI reference at
/docs(Scalar). This guide explains the contract and links to that reference — it does not restate the schema. When a field is not documented here,/docsis authoritative.
Throughout, the base URL is written as $TARNO_BASE_URL and the key as $TARNO_API_KEY, and every
call carries the X-API-Key header.
GET /v1/feriados · scope insights:read · MCP equivalent: get_feriados
curl -sS "$TARNO_BASE_URL/v1/feriados?anio=2026" -H "X-API-Key: $TARNO_API_KEY"
[
{ "fecha": "2026-01-01", "nombre": "Año Nuevo", "tipo": "regular", "origen": "seed:reglas-permanentes" },
{ "fecha": "2026-04-03", "nombre": "Viernes Santo", "tipo": "regular", "origen": "seed:reglas-permanentes" }
]
| Parameter | What it does |
|---|---|
anio |
Shortcut for a whole year. |
desde / hasta |
Explicit inclusive range (ISO YYYY-MM-DD). When given, they win over anio. |
tipo |
regular or excepcional (see below). |
envelope |
true adds { data, coverage, dataAsOf }. |
Regular vs exceptional
Every row declares whether an algorithm can reproduce it:
regular— derived from the permanent rules: fixed dates, the Easter computus, the Monday/Friday shifts of laws 19.668 and 20.299, and the extra Independence-Day and New-Year holidays of laws 20.215 and 20.983 (if the 18th and 19th fall Tue-Wed, Monday the 17th is a holiday; Wed-Thu, Friday the 20th; Sat-Sun, Friday the 17th; and if 1 January falls on a Sunday, Monday the 2nd).excepcional— created by an ad-hoc law for a single day of a single year, or by an election decree. No rule produces it: it can only be read from a list.
origen completes the picture by naming where that particular row came from (Ley 20.215,
Ley 21.462, decreto:dia-de-eleccion, seed:reglas-permanentes). An origen starting with
loader: marks a row written by the automatic refresh rather than by a reviewed migration.
This distinction is not academic. The holiday on Friday 2024-09-20 was missing from the calendar, and its absence broke the statutory 15-business-day appeal ceiling in 65 measured cases. A missing holiday goes unnoticed until it shifts a deadline.
# which holidays can no automatic calculation reproduce?
curl -sS "$TARNO_BASE_URL/v1/feriados?tipo=excepcional" -H "X-API-Key: $TARNO_API_KEY"
Coverage is finite — and it is a fact, not an inference
The calendar covers an explicitly declared range of years. Outside it there is no data, and that does not mean there are no holidays: it means we do not know. The difference is not academic — the two are opposites:
- no holidays in that stretch → your business-day count is correct;
- that stretch is not loaded → your count degrades to weekends-only and hands you a deadline longer than the real one, with nothing failing. That is the dangerous error: you would tell a lawyer they have more time than they do.
curl -sS "$TARNO_BASE_URL/v1/feriados/cobertura" -H "X-API-Key: $TARNO_API_KEY"
{ "from": "2013-01-01", "through": "2030-12-31" }
GET /v1/feriados/cobertura · scope insights:read · MCP twin: get_feriados_cobertura
It is cheap and cacheable (Cache-Control: public, max-age=3600), so if you freeze the calendar in
your own repo you can write this range next to the data and have your artifact state which years
it answers for.
It is not the min/max of the rows, and that is the whole point. Min/max describes what
exists, not what the calendar asserts: if a year were half-seeded — only Christmas, say — min/max
would claim "covered through that 25 December" and you would freeze a year that is 5 % complete. The
range only advances when a year is whole, which is why it ends on 31 December of the last
declared year rather than on the last holiday's date.
Asking outside the range is an error, never an empty list
curl -sS "$TARNO_BASE_URL/v1/feriados?desde=2031-01-01&hasta=2031-12-31" -H "X-API-Key: $TARNO_API_KEY"
{
"error": {
"code": "fuera_de_cobertura",
"message": "El calendario cubre 2013-01-01 → 2030-12-31; el rango pedido lo excede.",
"requestId": "…",
"coverage": { "from": "2013-01-01", "through": "2030-12-31" }
}
}
HTTP 422. Never a 200 with an empty or partial list. The range travels inside the error, so
you need no second call to learn what you hit. Over MCP the same case returns an error result with
the same code and the same coverage.
Two edge details:
- An open end is not an error.
?desde=2030-12-01is bounded by whatever exists; only the bounds you state explicitly are checked. - Inside the range, empty means empty.
?desde=2026-02-01&hasta=2026-02-28returns[]with a 200 because February 2026 has no holidays, and that is a reliable fact.
If you prefer a single call, ?envelope=true carries the same declared coverage alongside the data:
{ "data": [ … ], "coverage": { "desde": "2013-01-01", "hasta": "2030-12-31" }, "dataAsOf": "…" }
How often it is updated
A weekly job refreshes the window from today to two years out: it adds newly declared
holidays (an ad-hoc law is typically published only weeks in advance) and removes dates that
stop being holidays — most often an election that moves from its planned date to the one actually
held. Outside that window the calendar only changes through a reviewed migration. dataAsOf in the
envelope tells you when the corpus was last touched.
One nuance worth knowing if you compute deadlines far out: regular holidays are derived from the permanent rules and therefore cover the whole window, but exceptional ones are only detected as far as the public feeds that publish them reach — today a little over a year. That is ample for any live deadline: the longest one in the system is 30 business days.