Skip to content

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, /docs is 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-01 is 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-28 returns [] 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.