EKIA Data Service

Servicio: Calendario

El tercer dominio del servicio: el calendario formal de feriados nacionales con el que el propio servicio decide qué día es hábil, con la norma legal de cada feriado y, desde el 2026-09-17, con el contrato de sincronización que un sistema cliente usa para tomar el calendario como propio: cobertura declarada por año, declaraciones con su revisión y retiros explícitos. Es público — se consulta sin token — y es la única parte del servicio que un cliente puede llamar hoy, aunque el servicio siga en desarrollo y no ofrezca acceso a terceros. Esta página da la forma exacta de cada principio de la plataforma en este dominio.

Parte del servicio en desarrollo: el endpoint está desplegado y esta página es espejo de lo que responde, pero el calendario se documenta como pieza del servicio, no como un servicio abierto. Su primer consumidor previsto es el módulo base de Eurekia para Odoo, cuyo calendario es la proyección local versionada de este endpoint: sincroniza por año, aplica declaraciones y retiros explícitos, y jamás deduce un retiro de la ausencia de una fecha.

Qué es y qué no

curl -s 'https://api.eurekia.pe/v1/calendario/feriados?year=2026'

Respuesta real (2026-09-28, revisión 4414): extracto, los primeros tres de los 16 feriados de 2026, en las dos listas.

{
  "feriados": [
    {
      "fecha": "2026-01-01",
      "nombre": "Año Nuevo",
      "fuente": "Decreto Legislativo 713, art. 6"
    },
    {
      "fecha": "2026-04-02",
      "nombre": "Jueves Santo",
      "fuente": "Decreto Legislativo 713, art. 6"
    },
    {
      "fecha": "2026-04-03",
      "nombre": "Viernes Santo",
      "fuente": "Decreto Legislativo 713, art. 6"
    },
    {
      "…": "13 feriados más"
    }
  ],
  "criterio": "feriados nacionales del calendario formal del servicio, con su norma legal; los días no laborables decretados ad hoc no entran",
  "zona": "America/Lima",
  "contract_version": 1,
  "year": 2026,
  "coverage": "complete",
  "declarations": [
    {
      "fecha": "2026-01-01",
      "nombre": "Año Nuevo",
      "fuente": "Decreto Legislativo 713, art. 6",
      "dataset_revision": 3953
    },
    {
      "fecha": "2026-04-02",
      "nombre": "Jueves Santo",
      "fuente": "Decreto Legislativo 713, art. 6",
      "dataset_revision": 3953
    },
    {
      "fecha": "2026-04-03",
      "nombre": "Viernes Santo",
      "fuente": "Decreto Legislativo 713, art. 6",
      "dataset_revision": 3953
    },
    {
      "…": "13 declaraciones más"
    }
  ],
  "tombstones": [],
  "dataset_revision": 4414,
  "request_id": "5e6a2778-ebb6-4f94-937f-9c29422a873f",
  "schema_version": "1.0"
}

Campos de la respuesta con year:

campo significado
contract_version Versión del contrato de sincronización (hoy 1). Cambia solo cuando cambia lo que un cliente debe implementar para sincronizar bien (una regla nueva de retiros, un valor con otro significado), aunque los campos solo se agreguen. Un cliente acepta únicamente las versiones que declare soportadas. No es schema_version (el sobre común de /v1, aditivo) ni dataset_revision (los datos).
year El año al que se refieren coverage, declarations y tombstones.
coverage complete: el servicio declara que el conjunto de feriados del año está completo; una lista vacía con complete es un año cubierto sin feriados. unsupported: el servicio no declara cobertura; nunca se lee como "sin feriados".
declarations Los feriados vigentes del año: fecha, nombre, fuente y dataset_revision (la revisión en que se declaró).
tombstones Los retiros explícitos del año: fecha, nombre (de la declaración retirada), fuente (la norma que retira), motivo, dataset_revision (la revisión del retiro) y retira_revision (la revisión de la declaración que retira).
feriados El campo original, conservado: la misma lista que declarations sin dataset_revision. Alias permanente; no se retira dentro de /v1.

criterio y zona viajan en cada respuesta y no cambian; dataset_revision del sobre es la revisión del registro con la que se respondió, como en todo dominio. Sin year la respuesta es la de siempre — todas las declaraciones vigentes de todos los años en feriados — sin year, coverage, declarations ni tombstones, porque no hay un año al que referirlos; un cliente que sincroniza manda year siempre.

Cobertura

La cobertura es por año y declarada, nunca deducida de si hay filas. El servicio declara cada año como un acto, con la fuente que respalda el conjunto, y la respuesta lo dice en coverage. Años declarados hoy:

año coverage respaldo declarado
2026 complete DL 713 art. 6, Ley 31381, Ley 31788; cotejado en gob.pe/feriados el 2026-08-21. 16 feriados.
2027 complete Las 14 fechas fijas por las mismas normas (no dependen del año); Semana Santa del calendario litúrgico 2027 (Pascua 28-03-2027), cotejada con el patrón del histórico 2022-2026 de gob.pe. 16 feriados. La Plataforma del Estado no publicaba 2027 al 2026-09-17: cuando lo publique se coteja y, si difiere, se retira y se vuelve a declarar.
cualquier otro unsupported Sin fila de cobertura. 2025 no se declara: no hay cliente que lo necesite; entra por un acto de cobertura más su carga el día que un consumidor tenga una ventana que toque 2025.

Tres estados que conviene distinguir, todos coherentes:

Un año nuevo se carga antes de que empiece por actos de declaración (cobertura primero, luego cada feriado con su norma) y se anuncia en el registro de cambios. Huecos: no aplica — un calendario no tiene fechas esperadas sin dato; lo que puede faltar es un año, y eso lo dice coverage: unsupported, nunca una lista vacía.

Frescura

No aplica, y por qué: el calendario no se captura de una fuente cada día, se declara desde la norma legal, así que no tiene "fecha esperada" ni frescura. La expectativa que sí existe es de vigencia: el año N+1 debe estar cargado y declarado complete antes del 1 de enero (2027 lo está desde el 2026-09-17). Mientras el servicio esté en desarrollo, esa carga es una tarea del calendario de operación y queda fechada en el registro de cambios.

Consulta histórica

No aplica en la forma de los otros dominios: /v1/calendario/feriados no acepta as_of_revision, porque un feriado no se observa — se legisla. Lo que sí existe, y desde el 2026-09-17 viaja en la propia respuesta, es el rastro de actos: el calendario es un registro append-only de declaraciones y retiros, cada uno con la revisión en que se hizo. Nada se edita ni se borra; una norma que mueve o deroga un feriado ya cargado es un retiro (queda como tombstone) más, si corresponde, una declaración nueva. Cada acto queda además fechado en el registro de cambios.

Las cuatro revisiones de una respuesta, y para qué sirve cada una. Una respuesta con un retiro trae cuatro números de revisión distintos; ninguno sobra:

dónde qué es para qué la usa el cliente
dataset_revision del sobre La revisión del registro entero al responder. Avanza con cualquier escritura del servicio (tipo de cambio, padrón, calendario). Anotar con qué estado del servicio sincronizó.
dataset_revision de cada declaración La revisión en que esa declaración se hizo. Ordenarla frente a los retiros; guardarla con el feriado.
dataset_revision de cada tombstone La revisión en que se hizo el retiro. Saber que el retiro es posterior a la declaración que retira.
retira_revision de cada tombstone La revisión de la declaración retirada (igual al dataset_revision que esa declaración tenía). Saber a cuál declaración le pega el retiro, y no a la fecha para siempre.

Ejemplo, con el caso que hace falta el cuarto número — una norma derogada y después repuesta: el 23 de julio de 2027 se declaró en la revisión 6611; una norma lo deroga en la revisión 7000 y otra lo repone en la 7300. La respuesta del año trae en declarations el 23 de julio con dataset_revision: 7300 y en tombstones un retiro con dataset_revision: 7000 y retira_revision: 6611. Un cliente que aplique los actos por orden de revisión llega al estado correcto (vigente); uno que hubiera sincronizado entre la 7000 y la 7300 lo tiene retirado, y al volver a sincronizar recibe la declaración nueva. Sin retira_revision, ese cliente no podría distinguir "retiro de la declaración vieja" de "retiro de la nueva".

Los tombstones se sirven sin plazo: el endpoint es público y el servicio no sabe qué cliente vio qué declaración, y el volumen es de unas filas por año.

Integridad

El control de integridad de este dominio es la fuente legal por acto: cada declaración cita la norma que crea el feriado (fuente) y cada retiro cita la que lo quita, verificables en el diario oficial; para las dos fechas móviles, el documento litúrgico identificado por su hash. Ninguna declaración ni retiro real del servicio lleva una fuente inventada (las fuentes ficticias que aparecen en los tests del servicio viven solo en transacciones que se revierten). No hay cotejo (no existe una segunda fuente oficial que publique el calendario como dato) ni verificación exhaustiva (no hay artefacto que reconstruir).

Del lado del registro, la integridad es estructural: el calendario se escribe solo por tres actos (declarar cobertura, declarar feriado, retirar feriado), ejecutados por funciones de la base que rechazan un feriado en un año sin cobertura declarada, una fecha que ya está vigente y un retiro de una fecha que no lo está; ningún rol de la aplicación puede modificar ni borrar una fila. Alcance declarado: el servicio garantiza que cada fecha servida tiene su norma citada y que todo retiro es explícito; no garantiza que un feriado decretado después de la carga del año ya esté — eso lo dice el registro de cambios.

Evidencia

No aplica bajo el contrato de /v1/evidence, y por qué: la evidencia de un feriado no son bytes capturados de una fuente sino la norma legal citada en fuente, pública y verificable por su número. Por eso el calendario no crea observaciones ni evidencias (no viaja observacion_id) y ninguna respuesta suya cuenta en la cuota de descarga.

Restricciones y límites

Qué guardar

Por año sincronizado: contract_version y coverage con los que se sincronizó y el dataset_revision del sobre. Por feriado que su sistema tome: fecha, nombre, fuente y su dataset_revision. Por retiro aplicado: fecha, fuente, dataset_revision y retira_revision. Con eso y el registro de cambios se reconstruye qué calendario regía cuando su sistema lo sincronizó y por qué una fecha dejó de ser feriado.