{
  "openapi": "3.0.1",
  "info": {
    "title": "NormaWatch",
    "description": "Las nuevas disposiciones generales del BOE y, si quieres, las oposiciones y los boletines de Andalucía, Galicia y Cataluña, cada día en JSON y en tabla, con aviso opcional por correo, Telegram o Slack. Solo metadatos y enlaces oficiales. Gratis.",
    "version": "1.8",
    "x-build-id": "rzYqo8WNTLqHWBGaS"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/saidcveltran~normawatch-boe/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-saidcveltran-normawatch-boe",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/saidcveltran~normawatch-boe/runs": {
      "post": {
        "operationId": "runs-sync-saidcveltran-normawatch-boe",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/saidcveltran~normawatch-boe/run-sync": {
      "post": {
        "operationId": "run-sync-saidcveltran-normawatch-boe",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "dateFrom": {
            "title": "Fecha desde",
            "type": "string",
            "description": "Primera fecha del BOE que se lee, no posterior a hoy (Europe/Madrid). El formulario de la consola muestra fechas de ejemplo (16 a 19 de octubre de 2026) para que una primera ejecución ya dé resultados; si dejas vacías ambas fechas, se lee hoy."
          },
          "dateTo": {
            "title": "Fecha hasta",
            "type": "string",
            "description": "Última fecha del BOE que se lee (el formulario de la consola muestra fechas de ejemplo; si dejas vacías ambas fechas, se lee hoy), como máximo 366 días después de la fecha desde. Vacía significa la fecha desde. Con más de 31 días de diferencia se leen primero los días más recientes y la pausa entre peticiones es de al menos 1000 ms."
          },
          "departments": {
            "title": "Departamentos",
            "maxItems": 50,
            "type": "array",
            "description": "Conserva solo los elementos cuyo departamento contiene alguno de estos textos (sin distinguir mayúsculas, texto literal). Máximo 50 entradas de 200 caracteres cada una.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Palabras clave",
            "maxItems": 50,
            "type": "array",
            "description": "Conserva solo los elementos cuyo título contiene alguno de estos textos (sin distinguir mayúsculas, texto literal). Máximo 50 entradas de 200 caracteres cada una.",
            "items": {
              "type": "string"
            }
          },
          "normTypes": {
            "title": "Tipos de norma",
            "type": "array",
            "description": "Conserva solo las disposiciones de los tipos elegidos. El tipo lo deriva este Actor del inicio del título (no es un metadato del BOE) y puede equivocarse en títulos poco habituales. Vacío significa todos los tipos.",
            "items": {
              "type": "string",
              "enum": [
                "Corrección de errores",
                "Instrumento de ratificación",
                "Real Decreto Legislativo",
                "Real Decreto-ley",
                "Real Decreto",
                "Ley Orgánica",
                "Ley Foral",
                "Ley",
                "Decreto Legislativo",
                "Decreto-ley",
                "Decreto",
                "Orden",
                "Resolución",
                "Circular",
                "Acuerdo internacional",
                "Otro"
              ],
              "enumTitles": [
                "Corrección de errores",
                "Instrumento de ratificación",
                "Real Decreto Legislativo",
                "Real Decreto-ley",
                "Real Decreto",
                "Ley Orgánica",
                "Ley Foral",
                "Ley",
                "Decreto Legislativo",
                "Decreto-ley",
                "Decreto",
                "Orden",
                "Resolución",
                "Circular",
                "Acuerdo internacional",
                "Otro (sin tipo reconocido)"
              ]
            }
          },
          "sections": {
            "title": "Secciones del BOE",
            "maxItems": 3,
            "type": "array",
            "description": "Por defecto solo se lee la sección I (disposiciones generales). Si añades la sección III (otras disposiciones), se incluyen únicamente los elementos de un listado cerrado de epígrafes (convenios, ayudas, subvenciones, becas, planes de estudios, impacto ambiental, homologaciones y similares) y se descartan los títulos de adjudicaciones, los que llevan un tratamiento personal (don, doña…) y los que contienen un documento de identidad. Esos filtros reducen el riesgo de datos personales pero no lo eliminan: el filtro puede no detectar un nombre propio dentro de un título admitido, y el tratamiento posterior de los datos (incluido el cumplimiento del RGPD) es de tu responsabilidad. Con la sección III activada la memoria de onlyNew es distinta de la de antes. La sección II-B (oposiciones y concursos, unas 35 disposiciones al día) entrega por defecto solo las convocatorias; ver includeProcessUpdates. La sección II-A (nombramientos) nunca se lee. Máximo 3 entradas.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2B",
                "3"
              ],
              "enumTitles": [
                "I. Disposiciones generales",
                "II-B. Oposiciones y concursos",
                "III. Otras disposiciones (opcional, con filtros)"
              ]
            },
            "default": [
              "1"
            ]
          },
          "includeProcessUpdates": {
            "title": "Incluir también los trámites de las oposiciones",
            "type": "boolean",
            "description": "Solo tiene efecto con la sección II-B. Por defecto (desactivado) se entregan solo las convocatorias. Si lo activas, se entregan también las actualizaciones (listas de admitidos y excluidos, tribunal, plazas desiertas, correcciones de errores, listas de aprobados, nombramientos) y los elementos sin fase reconocida. La fase (campo stage) la deriva este Actor del título: es una pista, no un dato oficial. Con esta opción la memoria de onlyNew es distinta de la de antes.",
            "default": false
          },
          "bulletins": {
            "title": "Boletines",
            "maxItems": 4,
            "type": "array",
            "description": "Por defecto solo se lee el BOE. Puedes añadir los boletines autonómicos BOJA (Andalucía), DOG (Galicia) y DOGC (Cataluña); de cada uno se leen únicamente las disposiciones generales. El DOGC solo incluye leyes, decretos-ley, decretos, decretos legislativos y órdenes (no resoluciones), sin retraso y con historial; su conjunto de datos no tiene departamento, así que el filtro departments no encuentra elementos del DOGC (keywords y normTypes sí). Cada elemento lleva su boletín en el campo bulletin, y la atribución y la licencia de cada fuente van en los campos source y sourceUrl (el DOG es CC BY-SA 4.0 y el DOGC tiene la licencia abierta de la Generalitat: léase la sección «Boletines autonómicos» del README). La opción sections (sección III) se aplica solo al BOE. El DOG solo publica en su RSS el último número con disposiciones generales, así que no sirve para recuperar días pasados. Con boletines distintos del BOE solo, la memoria de onlyNew es distinta de la de antes. Si un boletín falla, solo fallan sus días; la ejecución termina con error únicamente si fallan todos los elegidos.",
            "items": {
              "type": "string",
              "enum": [
                "BOE",
                "BOJA",
                "DOG",
                "DOGC"
              ],
              "enumTitles": [
                "BOE (Estado)",
                "BOJA (Andalucía)",
                "DOG (Galicia)",
                "DOGC (Cataluña)"
              ]
            },
            "default": [
              "BOE"
            ]
          },
          "relations": {
            "title": "Qué cambia cada disposición (BOE)",
            "type": "boolean",
            "description": "Si está activado, para cada disposición de la sección I del BOE se pide su documento y se lee el análisis jurídico oficial: cada elemento añade changes (qué normas deroga, modifica, sustituye, añade, desarrolla, transpone o corrige, con el identificador y un enlace al texto consolidado de la norma afectada, que es de carácter meramente informativo y no oficial) y changesStatus. Basado en datos de la Agencia Estatal Boletín Oficial del Estado. Cuesta una petición más por disposición (hasta 1000 por ejecución). El BOE a veces publica el análisis un día después: entonces changesStatus vale pending. No se aplica a la sección III ni a los boletines autonómicos. Con esta opción la memoria de onlyNew es distinta de la de antes.",
            "default": false
          },
          "followIds": {
            "title": "Normas que sigues (identificadores del BOE)",
            "maxItems": 100,
            "type": "array",
            "description": "Identificadores de normas del BOE (BOE-A-AAAA-N, por ejemplo BOE-A-2021-3698). Activa la opción de relaciones y marca en followed las disposiciones que cambian alguna de ellas; esas disposiciones se entregan y se avisan primero, aunque los filtros de departamentos, palabras clave o tipos de norma las dejaran fuera. Se consulta el documento de todas las disposiciones de la sección I de cada día, así que con un rango largo hay más peticiones (hasta 1000 por ejecución; a partir de ahí se deja de consultar). Máximo 100 entradas. Con esta opción la memoria de onlyNew es distinta de la de antes.",
            "items": {
              "type": "string"
            }
          },
          "onlyNew": {
            "title": "Solo elementos nuevos",
            "type": "boolean",
            "description": "Si está activado, omite los elementos que ya se entregaron en ejecuciones anteriores de tu cuenta, recordados por su identificador en el almacén clave-valor con nombre SEEN, con una memoria por cada combinación de departamentos y palabras clave (y de tipos de norma y de secciones, si eliges alguno distinto del habitual) (hasta 50 000 identificadores en cada una; al superarlos se olvidan los más antiguos). Solo se recuerdan los elementos realmente entregados: los que quedan fuera por los filtros o por el máximo de elementos se podrán entregar en una ejecución posterior. Si está desactivado, no se lee ni se escribe SEEN. En cualquier caso, un mismo identificador se entrega una sola vez por ejecución.",
            "default": false
          },
          "maxItems": {
            "title": "Máximo de elementos",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Se detiene al alcanzar este número de elementos.",
            "default": 500
          },
          "requestDelayMs": {
            "title": "Pausa entre peticiones (ms)",
            "minimum": 500,
            "maximum": 10000,
            "type": "integer",
            "description": "Pausa entre dos peticiones al BOE. Mínimo 500.",
            "default": 1000
          },
          "emailTo": {
            "title": "Correo para el resumen diario",
            "type": "string",
            "description": "Dirección a la que se envía un resumen con lo entregado en la ejecución, mediante el Actor apify/send-mail de Apify. En el plan gratuito de Apify debe ser el correo de tu propia cuenta de Apify; con un plan de pago, Apify admite otras direcciones. Una sola dirección. Vacío significa que no se envía correo. Se guarda cifrado. El envío es una ejecución adicional que Apify factura a tu cuenta."
          },
          "notifyWhenEmpty": {
            "title": "Avisar también si no hay novedades",
            "type": "boolean",
            "description": "Si está desactivado (por defecto), solo se envía aviso cuando la ejecución entrega al menos un elemento. Si lo activas, se avisa también cuando no hay ninguno. Afecta al correo, a Telegram y a Slack.",
            "default": false
          },
          "telegramBotToken": {
            "title": "Token del bot de Telegram",
            "type": "string",
            "description": "Token del bot que enviará el resumen a Telegram, con la forma número:texto que entrega @BotFather. Se guarda cifrado. Hace falta también el identificador del chat. Vacío significa que no se avisa por Telegram."
          },
          "telegramChatId": {
            "title": "Identificador del chat de Telegram",
            "type": "string",
            "description": "Número del chat (negativo en grupos y canales) o nombre del canal con @ (por ejemplo @mi_canal). El bot debe poder escribir en ese chat. Si publicas en un canal público, el resumen será público."
          },
          "slackWebhookUrl": {
            "title": "Webhook entrante de Slack",
            "type": "string",
            "description": "Dirección del webhook entrante de Slack (empieza por https://hooks.slack.com/services/). Se guarda cifrada. Vacío significa que no se avisa por Slack. Si publicas en un canal público, el resumen será público."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}