{
  "openapi": "3.0.1",
  "info": {
    "title": "Catastro",
    "description": "Este actor automatiza la búsqueda de notificaciones catastrales publicadas en el Tablón Edictal Único (TEU) del Boletín Oficial del Estado (BOE) y permite consultar los servicios web públicos de la Sede Electrónica del Catastro.",
    "version": "1.0",
    "x-build-id": "izjvyn9wLOPk72K1B"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/legaltech~catastro/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-legaltech-catastro",
        "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/legaltech~catastro/runs": {
      "post": {
        "operationId": "runs-sync-legaltech-catastro",
        "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/legaltech~catastro/run-sync": {
      "post": {
        "operationId": "run-sync-legaltech-catastro",
        "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": {
          "searchTerms": {
            "title": "Términos de Búsqueda",
            "maxItems": 50,
            "type": "array",
            "description": "Introduce la lista de NIFs, referencias catastrales, nombres, etc. que quieres buscar. Por defecto se busca sólo en el día actual; con \"diasAtras\" o \"fechaDesde\"/\"fechaHasta\" se amplía la ventana. Los términos que son un identificador (NIF/NIE/CIF o referencia catastral de 14, 18 o 20 posiciones) admiten la ventana completa; los de texto libre (nombres de organismos, apellidos) se limitan a 7 días para no convertir el actor en un volcado del TEU — la fila resultante lo indica con \"ventanaAjustada\". El BOE sólo conserva los anuncios del TEU de los últimos ~92 días.",
            "items": {
              "type": "string"
            }
          },
          "timezone": {
            "title": "Zona Horaria (Opcional)",
            "type": "string",
            "description": "Tu zona horaria (ej. 'Europe/Madrid') para asegurar que la búsqueda por fecha se realiza en el día correcto. Si se deja en blanco, se usará UTC.",
            "default": "Europe/Madrid"
          },
          "diasAtras": {
            "title": "Días hacia atrás (Opcional)",
            "minimum": 0,
            "maximum": 91,
            "type": "integer",
            "description": "Amplía la búsqueda a los últimos N días además de hoy. 0 (o dejarlo en blanco) busca sólo el día actual, que es el comportamiento por defecto. El TEU sólo conserva los anuncios de los últimos ~92 días, así que ése es el máximo real. No se puede combinar con \"fechaDesde\"/\"fechaHasta\"."
          },
          "fechaDesde": {
            "title": "Fecha desde (Opcional)",
            "type": "string",
            "description": "Inicio de la ventana de búsqueda, en formato AAAA-MM-DD. Alternativa a \"diasAtras\" para consultar un tramo concreto. Si se indica sin \"fechaHasta\", la ventana llega hasta hoy. Las fechas anteriores a los ~92 días de retención del TEU se recortan automáticamente."
          },
          "fechaHasta": {
            "title": "Fecha hasta (Opcional)",
            "type": "string",
            "description": "Fin de la ventana de búsqueda, en formato AAAA-MM-DD. Requiere \"fechaDesde\". Si es futura se recorta a hoy."
          },
          "maxResultadosPorTermino": {
            "title": "Límite de anuncios por término (Opcional)",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Presupuesto de resultados por término de búsqueda. Por defecto 200 (máximo 2000). El BOE publica el número total de coincidencias junto al listado, así que el actor lo comprueba ANTES de volcar nada: si un término supera el límite, en vez de volcar los anuncios escribe una única fila con \"busquedaDemasiadoAmplia\": true y el total encontrado, para que afines el término o reduzcas la ventana. Una búsqueda por NIF o por referencia catastral no se acerca a este límite ni consultando el trimestre entero.",
            "default": 200
          },
          "extraerTexto": {
            "title": "Leer el texto de las notificaciones",
            "type": "boolean",
            "description": "Activado por defecto. Descarga el PDF de cada anuncio encontrado y extrae su texto completo al campo \"texto\". Además, del texto se sacan las entidades que el listado no da: \"referenciasCatastrales\", \"nifs\", \"csv\" e \"idNotificacion\" — las referencias catastrales se pueden encadenar directamente con las operaciones de Catastro de este mismo actor. Todos esos campos son NUEVOS: no cambian ni el nombre ni el valor de ninguno de los que ya devolvía el actor, así que una integración existente sigue funcionando igual. Ponlo a false si sólo quieres el listado y prefieres runs más rápidos. Los anuncios ya leídos en ejecuciones anteriores se reutilizan de una caché permanente y no se vuelven a descargar.",
            "default": true
          },
          "maxTextosPorRun": {
            "title": "Límite de textos por ejecución (Opcional)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Número máximo de PDFs que se descargan en un run, repartido entre todos los términos. Por defecto 50 (máximo 500). Los anuncios servidos desde la caché no consumen este límite. Es el tope que acota lo que un run puede tardar con \"extraerTexto\" activado.",
            "default": 50
          },
          "guardarPdf": {
            "title": "Guardar el PDF firmado",
            "type": "boolean",
            "description": "Archiva además el PDF original de cada notificación en el key-value store \"teu-notificaciones\". El PDF del TEU va firmado electrónicamente y es el documento con valor probatorio, pero el BOE lo retira a los ~92 días: esto deja una copia permanente con URL propia. Desactivado por defecto porque son ~200 KB por anuncio. Sólo tiene efecto con \"extraerTexto\" activado.",
            "default": false
          },
          "descargarNotificaciones": {
            "title": "Descargar el PDF de notificaciones concretas",
            "maxItems": 50,
            "type": "array",
            "description": "Operación independiente: descarga el PDF firmado de los anuncios del TEU que se indiquen y lo archiva en el key-value store \"teu-notificaciones\", devolviendo su enlace permanente y también su texto. No necesita búsqueda: el actor se puede invocar sólo para esto.\n\nCada elemento puede ser:\n• La \"pdfUrl\" que devuelve el listado, como texto suelto o como {\"pdfUrl\": \"...\"} — es la forma más cómoda de encadenarlo con una búsqueda previa.\n• El par {\"identificador\": \"BOE-N-2026-615482\", \"fecha\": \"2026-08-12\"}.\n\nLa fecha es obligatoria junto al identificador porque forma parte de la ruta del PDF en el BOE y no se puede deducir del código (el buscador del TEU no indexa el identificador). Los dos campos vienen en cada fila del listado, igual que \"pdfUrl\"."
          },
          "catastroQueries": {
            "title": "Consultas de la API de Catastro",
            "maxItems": 50,
            "type": "array",
            "description": "Consultas opcionales a los servicios públicos de Catastro. Puede usarse junto con searchTerms o de forma independiente. Cada elemento usa una operación y sus parámetros oficiales.",
            "items": {
              "type": "object",
              "properties": {
                "operation": {
                  "title": "Operación de Catastro",
                  "description": "Servicio público de Catastro que se desea consultar. \"colindantes\" y \"parcelGeometry\" son operaciones compuestas/adicionales que NO son servicios oficiales del Callejero/Coordenadas de Catastro. \"colindantes\" aproxima las parcelas vecinas de \"RefCat\" muestreando varios puntos (\"nearby\") en un anillo alrededor de su centroide y deduplicando resultados en una sola llamada al actor: es una aproximación por PROXIMIDAD, no adyacencia geométrica real; puede incluir parcelas cercanas no colindantes (p.ej. al otro lado de una calle) y omitir alguna con frente estrecho. \"radios\" (array de metros, opcional) y \"sectores\" (opcional, por defecto 8-12) permiten fijar el muestreo a mano; si se omiten, se calculan según la superficie de la parcela. \"parcelGeometry\" consulta el servicio INSPIRE (WFS) de Catastro con \"RefCat\" (14, 18 o 20 posiciones; se trunca a 14) y devuelve \"areaGraficaM2\": la superficie gráfica real del recinto medida sobre el plano catastral, que NO coincide con la suma de las superficies \"de uso\" (construida + cultivo) que sí devuelven el resto de operaciones.",
                  "type": "string",
                  "enum": [
                    "province",
                    "municipality",
                    "municipalityCodes",
                    "via",
                    "viaCodes",
                    "number",
                    "numberCodes",
                    "location",
                    "locationCodes",
                    "refCat",
                    "refCatCodes",
                    "parcel",
                    "parcelCodes",
                    "coordinatesToRef",
                    "nearby",
                    "refToCoordinates",
                    "colindantes",
                    "parcelGeometry"
                  ]
                },
                "parameters": {
                  "title": "Parámetros de la consulta",
                  "description": "Parámetros oficiales del servicio REST/JSON de Catastro seleccionado. Ojo: algunos nombres no coinciden con el PDF oficial de Catastro (que documenta la variante SOAP), verificados contra las páginas .../json/help en vivo de cada servicio:\n• via / number / location: el filtro de nombre es \"NomVia\" (no \"NombreVia\") junto con \"TipoVia\", \"Provincia\" y \"Municipio\". Ojo al detalle interno: Consulta_DNPLOC (location) es el único método que por dentro los llama \"Sigla\"/\"Calle\"; el actor hace la traducción, así que se escriben \"TipoVia\"/\"NomVia\" en todas las operaciones por igual.\n• viaCodes / numberCodes: solo admiten \"CodigoProvincia\", \"CodigoMunicipio\", \"CodigoMunicipioINE\" y \"CodigoVia\" — NO filtran por nombre de vía; sin \"CodigoVia\" devuelven el callejero completo del municipio.\n• coordinatesToRef / nearby: los parámetros son \"CoorX\"/\"CoorY\" (no \"Coordenada_X\"/\"Coordenada_Y\"). El servicio no admite un parámetro de radio de búsqueda: cualquier \"Distancia\" que se envíe se ignora en silencio; el radio real es fijo (~25 m) y solo se aplica cuando el punto no cae dentro de una parcela.\n• refCat / refCatCodes / location(Codigos) / parcel(Codigos): usan \"RefCat\" (no \"RC\"), y admiten 14, 18 o 20 caracteres. Cuando la respuesta incluye algún bien inmueble completo, el actor añade automáticamente un campo \"enlaceSede\" con la URL directa a su ficha en la Sede Electrónica.\n• refToCoordinates: a diferencia de las anteriores, solo admite \"RefCat\" de 14 posiciones (Catastro devuelve el error 18 con 18/20). Si se le pasa una RC más larga, se trunca automáticamente a los primeros 14 caracteres.\n• colindantes (operación compuesta, no oficial de Catastro — ver más abajo): usa \"RefCat\" y, opcionalmente, \"radios\" y \"sectores\".\n• parcelGeometry (servicio INSPIRE/WFS, no del Callejero — ver más abajo): usa \"RefCat\" (se trunca a 14 posiciones) y, opcionalmente, \"SRSNAME\" (por defecto \"EPSG::4326\").\n• refToCoordinates: si no se indica \"SRS\", el actor fija \"EPSG:4326\". Sin él Catastro NO responde en geográficas, sino en UTM del huso correspondiente (p.ej. EPSG:25830), sin avisar del cambio de sistema de referencia.\n• location (por nombre): el error 43 \"EL NUMERO NO EXISTE\" que devolvía siempre esta operación era un bug del actor —mandaba la vía con el nombre de parámetro de otro método— y está corregido. Si aun así una dirección concreta no sale, sigue siendo más fiable la variante por códigos: obtén el código de vía con \"via\"/\"viaCodes\" y consulta después con \"locationCodes\".\n• colindantes: \"sectores\" y \"radios\" son independientes; puedes indicar sólo \"sectores\" para densificar el muestreo manteniendo los radios calculados a partir de la superficie de la parcela.",
                  "type": "object",
                  "additionalProperties": true
                },
                "maxResultados": {
                  "title": "Límite de resultados (opcional)",
                  "description": "Si la respuesta de Catastro contiene una lista (provincias, municipios, callejero, etc.), corta la lista más grande de la respuesta a este número de elementos y añade \"resultadosTruncados\"/\"totalResultadosDisponibles\" al resultado. Útil para evitar respuestas de varios MB al pedir el callejero completo de un municipio. No afecta a consultas que ya devuelven un único inmueble o coordenada. Recomendado en las operaciones de callejero sin filtro (\"viaCodes\"/\"numberCodes\" sin \"CodigoVia\"): el callejero completo de un municipio grande ronda los 1,5 MB y puede tardar más de 20 segundos.",
                  "type": "integer",
                  "minimum": 1
                }
              },
              "required": [
                "operation"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}