Referencia de herramientas

Las 14 están anotadas en el protocolo como readOnlyHint: true y destructiveHint: false.

Nota

Las anotaciones MCP son pistas, no garantías verificables por el cliente. La garantía real de que este servidor no escribe es que el código de escritura no existe, y hay un job de CI que lo comprueba en cada cambio.

Todo lo de esta página se compara contra tests/contrato.json, que guarda el catálogo entero como viaja, con su orden, más la directiva. Un cambio de lo que el servidor promete falla hasta que alguien lo apruebe con APROBAR_CONTRATO=1 uv run pytest tests/test_contrato.py.

Directiva operativa

El servidor expone una directiva por el campo instructions del protocolo. Cualquier cliente que se conecte la recibe antes de poder llamar una herramienta, así que la distinción entre las dos fechas llega antes que cualquier resultado:

Al informar fechas de actuaciones de receptor, distinguir siempre:

  • fecha_diligencia: cuándo el ministro de fe practicó la diligencia. Es la que corre los plazos procesales.

  • fecha_registro: cuándo se registró en el sistema. No corre plazos.

Suelen diferir en varios días. […] Una búsqueda que no encuentra no prueba que algo no exista. Las causas reservadas no aparecen en la consulta pública.

La directiva cabe en 2.048 bytes, que es donde el cliente la corta sin avisar. Las reglas que no caben viven en la herramienta que las necesita:

regla

dónde está

qué buscadores traen ocultas con número, y la medición del índice

buscar_jurisprudencia

con qué acotar cada competencia

las tres búsquedas de nombre, RUT y fecha

qué significa georreferenciado en falso, entero

obtener_actuaciones_receptor

cuándo caduca una referencia de documento y qué hacer con un escaneo

obtener_documento

Por qué se repartieron así se explica en Cómo se usa e interpreta.

Nota

Qué revisión del protocolo habla este servidor Depende del transporte, y conviene decir las dos. El SDK instalado conoce hasta 2026-07-28, la revisión sin estado donde los servidores publican lo suyo por server/discover. Por ahí se habla cuando el cliente vive en el mismo proceso.

Todos los clientes que esta guía documenta lo levantan como proceso aparte por stdio, y ahí el saludo llega hasta 2025-11-25: es lo que negocia Claude Desktop, Claude Code, Cursor, VS Code y Codex. Medido pidiendo 2026-07-28 en el saludo y viendo qué contesta. En esa ruta server/discover no se alcanza, así que quien lo intente recibe método desconocido.

Los dos números salen del SDK y no de la memoria: tests/test_documentacion.py los compara contra LATEST_PROTOCOL_VERSION y LATEST_HANDSHAKE_VERSION, así que actualizar la dependencia y no esta página deja la suite en rojo.

Por el carril de 2026-07-28 los catálogos viajan con una pista de frescura: tools/list, prompts/list, resources/list, resources/templates/list y server/discover salen con ttlMs: 3600000 y cacheScope: public, porque cambian una vez por versión. resources/read también admite pista y no la lleva a propósito: leer un documento vuelve a pedírselo al Poder Judicial, y una copia guardada de un documento de un tercero es lo que prohíbe la regla 5. Por el saludo de 2025-11-25 ese campo no existe y el SDK lo criba: ahí el catálogo llega sin pista.

El servidor se presenta con un icono propio, una balanza dibujada en SVG que viaja como data: URI dentro del saludo. No hay una dirección que el cliente tenga que ir a buscar, ni un host ajeno que se entere de quién lo abrió.

listar_cortes

Las Cortes de Apelaciones con el código que las búsquedas exigen. Sin parámetros.

Llamarla antes de buscar por nombre, RUT o fecha en apelaciones: ahí corte es obligatorio y su valor no aparece en ninguna otra respuesta.

Campo

Tipo

Qué es

codigo

int

Lo que va en el parámetro corte de las búsquedas

nombre

str

Nombre tal como lo publica la plataforma

Medido el 20 de agosto de 2026: 17 cortes.

Cómo bajar a la causa apelada

El detalle de una causa de la Corte Suprema trae causa_de_origen con la corte por su nombre, y la búsqueda pide el código. Son dos llamadas:

  1. listar_cortes para resolver el nombre a código.

  2. buscar_causa_por_rit en apelaciones con ese corte, el rol y el anio de la causa de origen, y el libro en tipo: ahí el número de rol solo no identifica una causa.

Esquema que entrega el protocolo

Generado desde el servidor al construir esta página, así que no puede quedar desactualizado respecto del código.

{
  "name": "listar_cortes",
  "inputSchema": {
    "properties": {},
    "title": "listar_cortesArguments",
    "type": "object"
  },
  "outputSchema": {
    "$defs": {
      "Corte": {
        "description": "Una Corte de Apelaciones, con el código que las búsquedas exigen.",
        "properties": {
          "codigo": {
            "description": "Lo que va en el parámetro `corte` de las búsquedas.",
            "title": "Codigo",
            "type": "integer"
          },
          "nombre": {
            "description": "Nombre tal como lo publica la plataforma.",
            "title": "Nombre",
            "type": "string"
          }
        },
        "required": [
          "codigo",
          "nombre"
        ],
        "title": "Corte",
        "type": "object"
      }
    },
    "properties": {
      "result": {
        "items": {
          "$ref": "#/$defs/Corte"
        },
        "title": "Result",
        "type": "array"
      }
    },
    "required": [
      "result"
    ],
    "title": "listar_cortesOutput",
    "type": "object"
  },
  "annotations": {
    "read_only_hint": true,
    "destructive_hint": false,
    "idempotent_hint": true,
    "open_world_hint": true
  }
}

listar_tribunales

Los tribunales de una corte, con el código que las búsquedas exigen.

Importante

Es el muro de entrada Para buscar en primera instancia hay que pasar tribunal, y ese número no aparece en ninguna otra respuesta ni en esta página. Sin esta herramienta hay que sabérselo de memoria.

Parámetro

Qué es

corte

Obligatorio. Código de la corte, el que entrega listar_cortes

competencia

Sólo las que se acotan por tribunal. Los códigos difieren entre competencias

corte no tiene valor por defecto a propósito: con uno, una consulta destinada a otra jurisdicción devolvería en silencio los tribunales de Concepción, que es una lista plausible y equivocada.

Suprema y apelaciones no se ofrecen, y está medido por qué: suprema devuelve null porque es la corte y no tiene tribunales debajo, y apelaciones devuelve 118 juzgados de primera instancia, que no son con qué se busca ahí.

Campo

Tipo

Qué es

codigo

int

Lo que va en el parámetro tribunal de las búsquedas

nombre

str

Nombre tal como lo publica la plataforma

Cómo seguir un exhorto

El detalle entrega el tribunal de destino por su nombre, y la búsqueda pide el código. Son tres llamadas:

  1. listar_cortes para ubicar la corte del tribunal de destino.

  2. listar_tribunales con esa corte, para sacar el código por nombre.

  3. buscar_causa_por_rit con el rol_destino del exhorto y ese tribunal.

Esquema que entrega el protocolo

Generado desde el servidor al construir esta página, así que no puede quedar desactualizado respecto del código.

{
  "name": "listar_tribunales",
  "inputSchema": {
    "properties": {
      "corte": {
        "description": "Código de la corte, el que entrega `listar_cortes`. Obligatorio: sin él habría que elegir una, y devolver los tribunales de otra jurisdicción es una lista plausible y equivocada.",
        "minimum": 1,
        "title": "Corte",
        "type": "integer"
      },
      "competencia": {
        "default": "civil",
        "description": "Una de: civil, cobranza, laboral, penal. Son las que se acotan por tribunal, o sea aquellas donde este listado sirve para buscar. Suprema no tiene tribunales debajo y apelaciones se acota por corte.",
        "title": "Competencia",
        "type": "string"
      }
    },
    "required": [
      "corte"
    ],
    "title": "listar_tribunalesArguments",
    "type": "object"
  },
  "outputSchema": {
    "$defs": {
      "Tribunal": {
        "description": "Un tribunal de primera instancia, con el código que las búsquedas exigen.",
        "properties": {
          "codigo": {
            "description": "Lo que va en el parámetro `tribunal` de las búsquedas.",
            "title": "Codigo",
            "type": "integer"
          },
          "nombre": {
            "description": "Nombre tal como lo publica la plataforma.",
            "title": "Nombre",
            "type": "string"
          }
        },
        "required": [
          "codigo",
          "nombre"
        ],
        "title": "Tribunal",
        "type": "object"
      }
    },
    "properties": {
      "result": {
        "items": {
          "$ref": "#/$defs/Tribunal"
        },
        "title": "Result",
        "type": "array"
      }
    },
    "required": [
      "result"
    ],
    "title": "listar_tribunalesOutput",
    "type": "object"
  },
  "annotations": {
    "read_only_hint": true,
    "destructive_hint": false,
    "idempotent_hint": true,
    "open_world_hint": true
  }
}

buscar_causa_por_rit

Busca causas por rol en la consulta pública.

Parámetro

Tipo

Descripción

tipo

str

Letra del rol en civil, cobranza y laboral; en civil son C, V, E, A, F o I. En apelaciones el libro por su nombre, en penal el código del libro (1 es Ordinaria), y en suprema VACÍO

rol

int

Número, sin la letra ni el año

anio

int

Año, cuatro dígitos

competencia

str

Verificadas: civil, laboral, cobranza, penal, suprema, apelaciones

tribunal

int, opcional

Código del tribunal. Omitir para buscar en todos

corte

int, opcional

Omitir salvo certeza

paginas

int

Cuántas páginas recorrer como máximo. Al excederlo levanta excepción en vez de recortar

Advertencia

corte no tiene valor por defecto a propósito. Fijarla produce falsos negativos: en una prueba real, una búsqueda con la corte puesta en Concepción omitió una causa del 11º Juzgado Civil de Santiago que sí existía.

Devuelve una lista de causas con rol, fecha_ingreso, caratulado, tribunal y una referencia opaca que declara durar 30 minutos.

Esquema que entrega el protocolo

Generado desde el servidor al construir esta página, así que no puede quedar desactualizado respecto del código.

{
  "name": "buscar_causa_por_rit",
  "inputSchema": {
    "properties": {
      "tipo": {
        "description": "Letra del rol en civil, cobranza y laboral; en civil son C, V, E, A, F o I y en cobranza A C D E J L P R y en laboral O, medidas. En apelaciones va el LIBRO en vez de una letra (por ejemplo 'Protección' o 'Exhorto'): ahí el número de rol se repite entre libros, así que sin él la consulta es ambigua y la herramienta falla en vez de abrir la causa equivocada. En penal el rol también lleva libro pero se busca por su CÓDIGO: medido, '1' es Ordinaria, y con el nombre el listado vuelve vacío. En suprema el rol no lleva nada adelante y este campo va VACÍO.",
        "title": "Tipo",
        "type": "string"
      },
      "rol": {
        "description": "Número del rol, sin la letra ni el año.",
        "minimum": 1,
        "title": "Rol",
        "type": "integer"
      },
      "anio": {
        "description": "Año del rol, cuatro dígitos.",
        "maximum": 2100,
        "minimum": 1900,
        "title": "Anio",
        "type": "integer"
      },
      "competencia": {
        "default": "civil",
        "description": "Una de: apelaciones, civil, cobranza, laboral, penal, suprema.",
        "title": "Competencia",
        "type": "string"
      },
      "tribunal": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Código del tribunal. En civil, cobranza, laboral y penal la plataforma lo acepta opcional, y un rol sin tribunal no identifica una causa: la búsqueda lo devuelve de cada juzgado que lo tenga, y en civil eso midió 43 causas de 43 personas distintas para un solo rol: omitirlo no amplía la búsqueda, la hace barrer y devuelve una causa por juzgado, cada una con sus partes. Indicarlo salvo que se quiera justamente ese barrido. En apelaciones y suprema la plataforma no lo usa.",
        "title": "Tribunal"
      },
      "corte": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Código de la corte. En apelaciones el mismo número de rol existe en varias, así que omitirla devuelve una causa por corte. En el resto, OMITIR salvo certeza: fijarla produce falsos negativos, porque excluye causas radicadas en otra jurisdicción.",
        "title": "Corte"
      },
      "paginas": {
        "default": 10,
        "description": "Cuántas páginas de resultados recorrer como máximo. La plataforma devuelve 100 por página. Si la búsqueda excede este tope, la herramienta falla en vez de devolver una lista recortada, porque un listado truncado en silencio se leería como si no hubiera más resultados.",
        "maximum": 50,
        "minimum": 1,
        "title": "Paginas",
        "type": "integer"
      }
    },
    "required": [
      "tipo",
      "rol",
      "anio"
    ],
    "title": "buscar_causa_por_ritArguments",
    "type": "object"
  },
  "outputSchema": {
    "$defs": {
      "CausaEncontrada": {
        "description": "Una fila del listado de resultados de búsqueda.\n\nLos campos opcionales existen porque las competencias no publican las mismas columnas:\nla civil no trae estado ni RUC, la penal trae los dos, y la de apelaciones trae la\nubicación física del expediente. Se declaran como opcionales en vez de inventar un valor,\nporque vacío y ausente no son lo mismo.",
        "properties": {
          "rol": {
            "title": "Rol",
            "type": "string"
          },
          "fecha_ingreso": {
            "title": "Fecha Ingreso",
            "type": "string"
          },
          "caratulado": {
            "title": "Caratulado",
            "type": "string"
          },
          "tribunal": {
            "description": "Tribunal o corte donde está radicada. En apelaciones y suprema es la corte.",
            "title": "Tribunal",
            "type": "string"
          },
          "referencia": {
            "description": "Identificador opaco para pedir el detalle. Declara durar 30 minutos; no se construye ni se guarda, se usa en el acto.",
            "title": "Referencia",
            "type": "string"
          },
          "competencia": {
            "description": "Competencia en la que se encontró.",
            "title": "Competencia",
            "type": "string"
          },
          "ruc": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Sólo en penal y cobranza.",
            "title": "Ruc"
          },
          "estado": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Lo que la competencia publica en su columna de estado, textual. No es el mismo dato en todas: cobranza publica 'Estado Procesal' y laboral, penal, apelaciones y suprema publican 'Estado Causa'. Civil no publica ninguno. Se entrega sin normalizar para no aplanar dos cosas distintas en una.",
            "title": "Estado"
          },
          "tipo_recurso": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Sólo en suprema.",
            "title": "Tipo Recurso"
          },
          "ubicacion": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Sólo en apelaciones.",
            "title": "Ubicacion"
          }
        },
        "required": [
          "rol",
          "fecha_ingreso",
          "caratulado",
          "tribunal",
          "referencia",
          "competencia"
        ],
        "title": "CausaEncontrada",
        "type": "object"
      }
    },
    "properties": {
      "result": {
        "items": {
          "$ref": "#/$defs/CausaEncontrada"
        },
        "title": "Result",
        "type": "array"
      }
    },
    "required": [
      "result"
    ],
    "title": "buscar_causa_por_ritOutput",
    "type": "object"
  },
  "annotations": {
    "read_only_hint": true,
    "destructive_hint": false,
    "idempotent_hint": true,
    "open_world_hint": true
  }
}

Nota

Con qué hay que acotar la búsqueda Las tres búsquedas de abajo (nombre, RUT y fecha) exigen acotar, y con qué depende de la competencia. Está medido una por una contra el sistema real:

Competencia

Exige

civil, cobranza, laboral, penal

tribunal

apelaciones

corte

suprema

nada

En apelaciones la plataforma responde «Por favor seleccione una Corte para la búsqueda» y no entrega resultados. En suprema las tres andan sin corte ni tribunal.

buscar_causa_por_nombre

Busca causas por nombre de litigante.

Reglas de la plataforma, medidas probando cada combinación contra el sistema real:

  • Exige al menos dos de los tres campos de nombre (nombre, apellido paterno, apellido materno). El año no cuenta para ese mínimo: paterno + año es rechazado, paterno + materno es aceptado.

  • Exige acotar la búsqueda según la competencia (ver el cuadro de arriba). Donde el tribunal es obligatorio eso limita la utilidad de la herramienta: hay que saber dónde está la causa antes de poder buscarla.

  • La tilde calza literal, campo por campo. El mismo apellido está guardado de las dos formas en la misma base, así que ninguna grafía sola devuelve todo. Medido el 25 de agosto de 2026 sobre un apellido en un solo tribunal:

    paterno

    materno

    causas

    sin tilde

    sin tilde

    5

    con tilde

    con tilde

    25

    una con y otra sin

    0

    La herramienta consulta las DOS grafías y las fusiona, así que no hay que repetir la búsqueda. Lo que no puede es adivinar la tilde: si el nombre se pasa sin acentos, sólo trae la forma sin acentos. Pásalo con sus tildes correctas o la lista sigue incompleta sin decirlo.

    La ñ no cambia el resultado (MUÑOZ y MUNOZ dan lo mismo), así que el fold la conserva y no gasta una búsqueda de más; la tilde sí, y por eso se buscan la forma acentuada y la sin acentuar. Un nombre sin ninguna letra acentuable es una sola búsqueda.

Parámetro

Tipo

Descripción

apellido_paterno

str

Apellido paterno del litigante

apellido_materno

str

Apellido materno

nombre

str

Nombres

anio

int, opcional

Año de ingreso. No cuenta para el mínimo de dos campos

competencia

str

Verificadas: civil, laboral, cobranza, penal, suprema, apelaciones

tribunal

int

Obligatorio salvo en suprema y apelaciones

corte

int

Obligatorio en apelaciones. En el resto, omitir salvo certeza

paginas

int

Tope de páginas a recorrer

Esquema que entrega el protocolo

Generado desde el servidor al construir esta página, así que no puede quedar desactualizado respecto del código.

{
  "name": "buscar_causa_por_nombre",
  "inputSchema": {
    "properties": {
      "apellido_paterno": {
        "default": "",
        "description": "Apellido paterno del litigante.",
        "title": "Apellido Paterno",
        "type": "string"
      },
      "apellido_materno": {
        "default": "",
        "description": "Apellido materno del litigante.",
        "title": "Apellido Materno",
        "type": "string"
      },
      "nombre": {
        "default": "",
        "description": "Nombres del litigante.",
        "title": "Nombre",
        "type": "string"
      },
      "anio": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Año de ingreso, opcional.",
        "title": "Anio"
      },
      "competencia": {
        "default": "civil",
        "description": "Una de: apelaciones, civil, cobranza, laboral, penal, suprema.",
        "title": "Competencia",
        "type": "string"
      },
      "tribunal": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Código del tribunal, para acotar la búsqueda. Obligatorio cuando la competencia es una de: civil, cobranza, laboral y penal. En apelaciones y suprema la plataforma no lo usa.",
        "title": "Tribunal"
      },
      "corte": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Código de la corte, para acotar la búsqueda. Obligatorio cuando la competencia es una de: apelaciones, donde la plataforma responde 'Por favor seleccione una Corte para la búsqueda'. En el resto, OMITIR salvo certeza: fijarla produce falsos negativos, porque excluye causas radicadas en otra jurisdicción.",
        "title": "Corte"
      },
      "paginas": {
        "default": 10,
        "description": "Cuántas páginas de resultados recorrer como máximo. La plataforma devuelve 100 por página. Si la búsqueda excede este tope, la herramienta falla en vez de devolver una lista recortada, porque un listado truncado en silencio se leería como si no hubiera más resultados.",
        "maximum": 50,
        "minimum": 1,
        "title": "Paginas",
        "type": "integer"
      }
    },
    "title": "buscar_causa_por_nombreArguments",
    "type": "object"
  },
  "outputSchema": {
    "$defs": {
      "CausaEncontrada": {
        "description": "Una fila del listado de resultados de búsqueda.\n\nLos campos opcionales existen porque las competencias no publican las mismas columnas:\nla civil no trae estado ni RUC, la penal trae los dos, y la de apelaciones trae la\nubicación física del expediente. Se declaran como opcionales en vez de inventar un valor,\nporque vacío y ausente no son lo mismo.",
        "properties": {
          "rol": {
            "title": "Rol",
            "type": "string"
          },
          "fecha_ingreso": {
            "title": "Fecha Ingreso",
            "type": "string"
          },
          "caratulado": {
            "title": "Caratulado",
            "type": "string"
          },
          "tribunal": {
            "description": "Tribunal o corte donde está radicada. En apelaciones y suprema es la corte.",
            "title": "Tribunal",
            "type": "string"
          },
          "referencia": {
            "description": "Identificador opaco para pedir el detalle. Declara durar 30 minutos; no se construye ni se guarda, se usa en el acto.",
            "title": "Referencia",
            "type": "string"
          },
          "competencia": {
            "description": "Competencia en la que se encontró.",
            "title": "Competencia",
            "type": "string"
          },
          "ruc": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Sólo en penal y cobranza.",
            "title": "Ruc"
          },
          "estado": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Lo que la competencia publica en su columna de estado, textual. No es el mismo dato en todas: cobranza publica 'Estado Procesal' y laboral, penal, apelaciones y suprema publican 'Estado Causa'. Civil no publica ninguno. Se entrega sin normalizar para no aplanar dos cosas distintas en una.",
            "title": "Estado"
          },
          "tipo_recurso": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Sólo en suprema.",
            "title": "Tipo Recurso"
          },
          "ubicacion": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Sólo en apelaciones.",
            "title": "Ubicacion"
          }
        },
        "required": [
          "rol",
          "fecha_ingreso",
          "caratulado",
          "tribunal",
          "referencia",
          "competencia"
        ],
        "title": "CausaEncontrada",
        "type": "object"
      }
    },
    "properties": {
      "result": {
        "items": {
          "$ref": "#/$defs/CausaEncontrada"
        },
        "title": "Result",
        "type": "array"
      }
    },
    "required": [
      "result"
    ],
    "title": "buscar_causa_por_nombreOutput",
    "type": "object"
  },
  "annotations": {
    "read_only_hint": true,
    "destructive_hint": false,
    "idempotent_hint": true,
    "open_world_hint": true
  }
}

buscar_causa_por_rut_juridica

Busca causas de una persona jurídica por su RUT. Es la única vía para empresas, que no tienen Clave Única y por lo tanto no aparecen en «Mis Causas».

Exige el dígito verificador, y acotar según la competencia (ver el cuadro de arriba).

Parámetro

Tipo

Descripción

rut

int

RUT sin dígito verificador ni puntos

digito_verificador

str

Dígito verificador: 0-9 o K

anio

int, opcional

Año de ingreso

competencia

str

Verificadas: civil, laboral, cobranza, penal, suprema, apelaciones

tribunal

int

Obligatorio salvo en suprema y apelaciones

corte

int

Obligatorio en apelaciones. En el resto, omitir salvo certeza

paginas

int

Tope de páginas a recorrer

Esquema que entrega el protocolo

Generado desde el servidor al construir esta página, así que no puede quedar desactualizado respecto del código.

{
  "name": "buscar_causa_por_rut_juridica",
  "inputSchema": {
    "properties": {
      "rut": {
        "description": "RUT sin dígito verificador ni puntos.",
        "minimum": 1,
        "title": "Rut",
        "type": "integer"
      },
      "digito_verificador": {
        "description": "Dígito verificador: 0-9 o K.",
        "title": "Digito Verificador",
        "type": "string"
      },
      "anio": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Año de ingreso, opcional.",
        "title": "Anio"
      },
      "competencia": {
        "default": "civil",
        "description": "Una de: apelaciones, civil, cobranza, laboral, penal, suprema.",
        "title": "Competencia",
        "type": "string"
      },
      "tribunal": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Código del tribunal, para acotar la búsqueda. Obligatorio cuando la competencia es una de: civil, cobranza, laboral y penal. En apelaciones y suprema la plataforma no lo usa.",
        "title": "Tribunal"
      },
      "corte": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Código de la corte, para acotar la búsqueda. Obligatorio cuando la competencia es una de: apelaciones, donde la plataforma responde 'Por favor seleccione una Corte para la búsqueda'. En el resto, OMITIR salvo certeza: fijarla produce falsos negativos, porque excluye causas radicadas en otra jurisdicción.",
        "title": "Corte"
      },
      "paginas": {
        "default": 10,
        "description": "Cuántas páginas de resultados recorrer como máximo. La plataforma devuelve 100 por página. Si la búsqueda excede este tope, la herramienta falla en vez de devolver una lista recortada, porque un listado truncado en silencio se leería como si no hubiera más resultados.",
        "maximum": 50,
        "minimum": 1,
        "title": "Paginas",
        "type": "integer"
      }
    },
    "required": [
      "rut",
      "digito_verificador"
    ],
    "title": "buscar_causa_por_rut_juridicaArguments",
    "type": "object"
  },
  "outputSchema": {
    "$defs": {
      "CausaEncontrada": {
        "description": "Una fila del listado de resultados de búsqueda.\n\nLos campos opcionales existen porque las competencias no publican las mismas columnas:\nla civil no trae estado ni RUC, la penal trae los dos, y la de apelaciones trae la\nubicación física del expediente. Se declaran como opcionales en vez de inventar un valor,\nporque vacío y ausente no son lo mismo.",
        "properties": {
          "rol": {
            "title": "Rol",
            "type": "string"
          },
          "fecha_ingreso": {
            "title": "Fecha Ingreso",
            "type": "string"
          },
          "caratulado": {
            "title": "Caratulado",
            "type": "string"
          },
          "tribunal": {
            "description": "Tribunal o corte donde está radicada. En apelaciones y suprema es la corte.",
            "title": "Tribunal",
            "type": "string"
          },
          "referencia": {
            "description": "Identificador opaco para pedir el detalle. Declara durar 30 minutos; no se construye ni se guarda, se usa en el acto.",
            "title": "Referencia",
            "type": "string"
          },
          "competencia": {
            "description": "Competencia en la que se encontró.",
            "title": "Competencia",
            "type": "string"
          },
          "ruc": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Sólo en penal y cobranza.",
            "title": "Ruc"
          },
          "estado": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Lo que la competencia publica en su columna de estado, textual. No es el mismo dato en todas: cobranza publica 'Estado Procesal' y laboral, penal, apelaciones y suprema publican 'Estado Causa'. Civil no publica ninguno. Se entrega sin normalizar para no aplanar dos cosas distintas en una.",
            "title": "Estado"
          },
          "tipo_recurso": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Sólo en suprema.",
            "title": "Tipo Recurso"
          },
          "ubicacion": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Sólo en apelaciones.",
            "title": "Ubicacion"
          }
        },
        "required": [
          "rol",
          "fecha_ingreso",
          "caratulado",
          "tribunal",
          "referencia",
          "competencia"
        ],
        "title": "CausaEncontrada",
        "type": "object"
      }
    },
    "properties": {
      "result": {
        "items": {
          "$ref": "#/$defs/CausaEncontrada"
        },
        "title": "Result",
        "type": "array"
      }
    },
    "required": [
      "result"
    ],
    "title": "buscar_causa_por_rut_juridicaOutput",
    "type": "object"
  },
  "annotations": {
    "read_only_hint": true,
    "destructive_hint": false,
    "idempotent_hint": true,
    "open_world_hint": true
  }
}

buscar_causa_por_fecha

Causas ingresadas en un rango de fechas.

Parámetro

Tipo

Descripción

desde

str

Fecha inicial, DD/MM/AAAA

hasta

str

Fecha final, DD/MM/AAAA

tribunal

int

Obligatorio salvo en suprema y apelaciones

competencia

str

Verificadas: civil, laboral, cobranza, penal, suprema, apelaciones

corte

int

Obligatorio en apelaciones. En el resto, omitir salvo certeza

paginas

int

Tope de páginas a recorrer

Es la cuarta búsqueda que la plataforma ofrece y responde una pregunta que las otras tres no: qué ingresó contra alguien en un período, sabiendo el tribunal pero no el rol.

Un solo día en un solo tribunal puede devolver decenas de causas, así que conviene acotar el rango antes de subir el tope de páginas: cada página son 100 resultados y una petición.

obtener_actuaciones_receptor

Actuaciones del ministro de fe con su fecha real de diligencia. Es la razón de existir del proyecto.

Advertencia

Sólo civil entrega actuaciones por esta vía. En cobranza las diligencias del ministro de fe viven en un panel propio (diligenciaCob), que obtener_detalle_causa lee y entrega en diligencias, así que la llamada por esta vía se rechaza.

Su Historia sí nombra algunas, y por eso el rechazo: tres filas dicen Actuacion - Receptor y ninguna trae fecha de diligencia, o sea leerlas de ahí daría una lista parcial y sin el dato que se busca. Si son todas o sólo una parte no está medido, y entregarlas sería informar una completitud desconocida como si fuera el total.

El panel tampoco publica la fecha en que se practicó la diligencia, así que sus filas no son actuaciones y no se pueden presentar como tales: dicen qué diligencia hay, en qué estado y quién figura a cargo.

En laboral, penal, apelaciones y suprema no existen: en todo el sitio sólo hay receptorCivil y receptorCobranza.

Toma tipo, rol, anio, competencia, tribunal y corte, con el mismo significado que en buscar_causa_por_rit. No toma paginas: de la búsqueda sólo usa la primera causa.

Internamente encadena búsqueda, detalle y un pase por cada cuaderno, porque la plataforma no direcciona el detalle por rol. Son varias peticiones bajo el intervalo mínimo, así que tarda.

Campos de la respuesta

Campo

Tipo

Descripción

folio

str

Número de folio

etapa

str

Etapa procesal

tramite

str

Siempre Actuación Receptor

desc_tramite

str

Texto literal, sin normalizar

fecha_diligencia

date | null

La que corre los plazos, ISO 8601

hora_diligencia

time | null

Cuando la descripción la trae

fecha_registro

date | null

Ingreso al sistema. No corre plazos

discrepancia_fechas

bool | null

Las dos fuentes de fecha_diligencia no coinciden. Nulo cuando falta una: ahí no hay nada que comparar. NO compara contra fecha_registro

cuaderno

str

A qué cuaderno pertenece

foja

str

Foja

georreferenciado

bool

true significa que el sitio la OFRECE, no que exista: medido, una de seis abría un panel vacío. false significa ausente (art. 9 inc. 3 Ley 20.886) sólo donde la competencia publica la columna, y suprema no la publica

estado_firma

str | null

Estado de firma del trámite. Cobranza lo publica en lugar de la foja; civil no lo trae

correlativo

str | null

Correlativo interno del trámite. Sólo en suprema

anio_tramite

str | null

Año que suprema publica en columna aparte, además de la fecha

georreferencia_referencia

str | null

Con qué se pide la georreferencia de esta actuación

tiene_documento

bool

Si la columna Doc. ofrece algo. true NO garantiza que se pueda traer: con documento_ruta en nulo, la celda abre un modal de JavaScript cuyo endpoint no está medido

tiene_anexo

bool

Si la columna Anexo ofrece algo. Segundo canal de documentos, distinto de Doc.. Se puede pedir con obtener_anexos_escrito sólo donde anexo_referencia viene con valor. false significa ausente sólo donde la competencia publica la columna

anexo_ruta

str | null

A qué panel se piden los anexos de este folio. Va junto con anexo_referencia: una misma competencia abre paneles distintos según el trámite, y civil tiene dos

anexo_referencia

str | null

Con qué se piden. Nulo cuando el folio no trae anexo, y también cuando lo trae por un panel que no está medido: ahí tiene_anexo queda en true y esto en nulo

documento_ruta

str | null

Qué ruta de la plataforma lo entrega. Cada competencia usa la suya

documento_referencia

str | null

Con qué se pide ese documento. Sin ella se sabe que existe y no cuál es

Ejemplo

{
  "folio": "3",
  "etapa": "Apremio",
  "tramite": "Actuación Receptor",
  "desc_tramite": "EMBARGO (Exitosa) Diligencia:31/03/2026 10:34",
  "fecha_diligencia": "2026-03-31",
  "hora_diligencia": "10:34:00",
  "fecha_registro": "2026-04-01",
  "discrepancia_fechas": false,
  "cuaderno": "2 - Apremio Ejecutivo Obligación de Dar",
  "foja": "0",
  "georreferenciado": true,
  "tiene_documento": true,
  "tiene_anexo": false,
  "documento_ruta": "docuN.php",
  "documento_referencia": "hHkPqx0yRb2..."
}
Esquema que entrega el protocolo

Generado desde el servidor al construir esta página, así que no puede quedar desactualizado respecto del código.

{
  "name": "obtener_actuaciones_receptor",
  "inputSchema": {
    "properties": {
      "tipo": {
        "description": "Letra del rol en civil, cobranza y laboral; en civil son C, V, E, A, F o I y en cobranza A C D E J L P R y en laboral O, medidas. En apelaciones va el LIBRO en vez de una letra (por ejemplo 'Protección' o 'Exhorto'): ahí el número de rol se repite entre libros, así que sin él la consulta es ambigua y la herramienta falla en vez de abrir la causa equivocada. En penal el rol también lleva libro pero se busca por su CÓDIGO: medido, '1' es Ordinaria, y con el nombre el listado vuelve vacío. En suprema el rol no lleva nada adelante y este campo va VACÍO.",
        "title": "Tipo",
        "type": "string"
      },
      "rol": {
        "description": "Número del rol, sin la letra ni el año.",
        "minimum": 1,
        "title": "Rol",
        "type": "integer"
      },
      "anio": {
        "description": "Año del rol, cuatro dígitos.",
        "maximum": 2100,
        "minimum": 1900,
        "title": "Anio",
        "type": "integer"
      },
      "competencia": {
        "default": "civil",
        "description": "Una de: civil. Sólo esas publican las actuaciones del ministro de fe en la tabla de Historia. En cobranza el sitio las rotula en la Historia pero SIN la fecha en que se practicaron, así que no sirven para computar un plazo y esta herramienta no las ofrece; el panel `diligencias` de `obtener_detalle_causa` es otra cosa y puede venir vacío en una causa que sí tuvo diligencias. En las demás no existen.",
        "title": "Competencia",
        "type": "string"
      },
      "tribunal": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Código del tribunal. Esta herramienta devuelve UNA causa, así que el tribunal no acota nada: la identifica. En civil, cobranza, laboral y penal, donde un rol sin tribunal no identifica una causa: la búsqueda lo devuelve de cada juzgado que lo tenga, y en civil eso midió 43 causas de 43 personas distintas para un solo rol, sin él la llamada falla por ambigüedad en vez de abrir la causa de otra persona. En apelaciones eso lo hace `corte`, y en suprema no hace falta ninguno de los dos.",
        "title": "Tribunal"
      },
      "corte": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Código de la corte. Esta herramienta devuelve UNA causa, así que la corte no acota nada: la identifica. En apelaciones el mismo rol y el mismo libro existen en varias cortes, y sin ella la llamada falla por ambigüedad. En el resto, OMITIR salvo certeza: fijarla produce falsos negativos, porque excluye causas radicadas en otra jurisdicción.",
        "title": "Corte"
      }
    },
    "required": [
      "tipo",
      "rol",
      "anio"
    ],
    "title": "obtener_actuaciones_receptorArguments",
    "type": "object"
  },
  "outputSchema": {
    "$defs": {
      "Actuacion": {
        "description": "Una fila de la tabla Historia.",
        "properties": {
          "folio": {
            "title": "Folio",
            "type": "string"
          },
          "etapa": {
            "title": "Etapa",
            "type": "string"
          },
          "tramite": {
            "title": "Tramite",
            "type": "string"
          },
          "desc_tramite": {
            "description": "Texto literal de la celda, sin normalizar.",
            "title": "Desc Tramite",
            "type": "string"
          },
          "fecha_diligencia": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Fecha real de la diligencia del receptor, en ISO 8601. ES LA QUE CUENTA PARA LOS PLAZOS PROCESALES. Nula si la fila no la informa.",
            "title": "Fecha Diligencia"
          },
          "hora_diligencia": {
            "anyOf": [
              {
                "format": "time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Hora de la diligencia, cuando la descripción la trae.",
            "title": "Hora Diligencia"
          },
          "fecha_registro": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Fecha en que el trámite se registró en el sistema, en ISO 8601. NO es la que corre los plazos.",
            "title": "Fecha Registro"
          },
          "discrepancia_fechas": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Si las DOS fuentes de `fecha_diligencia` discrepan: la que va entre paréntesis en 'Fec. Trámite' y la del texto 'Diligencia:'. NO compara contra `fecha_registro`; que esas dos difieran es lo normal. NULO cuando falta una de las dos fuentes: ahí no hay nada que comparar, y un falso diría que concuerdan.",
            "title": "Discrepancia Fechas"
          },
          "cuaderno": {
            "default": "",
            "description": "Cuaderno al que pertenece la actuación. Ej: '0 - Principal'.",
            "title": "Cuaderno",
            "type": "string"
          },
          "foja": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Foja del expediente. La publica civil; cobranza no la trae, y ahí es ausente y no vacía.",
            "title": "Foja"
          },
          "estado_firma": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Estado de firma del trámite. La publica cobranza en lugar de la foja; civil no la trae.",
            "title": "Estado Firma"
          },
          "estado": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Estado del trámite. La publican laboral, suprema y apelaciones.",
            "title": "Estado"
          },
          "sala": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Sala que resolvió el trámite. Sólo en suprema y en Cortes de Apelaciones, donde forma parte de cómo se cita el fallo.",
            "title": "Sala"
          },
          "correlativo": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Correlativo interno del trámite. Sólo en suprema.",
            "title": "Correlativo"
          },
          "anio_tramite": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Año que suprema publica en columna aparte, además de la fecha.",
            "title": "Anio Tramite"
          },
          "georreferenciado": {
            "description": "Si el sitio OFRECE la georreferencia de esta actuación, no si existe.\n\nEstá medido que no es lo mismo: el 20 de agosto de 2026, una de las seis actuaciones georreferenciadas de C-1156-2026 abría un panel que responde 'No existen Georreferencia para mostrar'. Verdadero significa que hay dónde preguntar, y confirmarlo cuesta una petición por actuación.\n\nFalso significa AUSENTE **sólo donde la competencia publica la columna**, y ahí sí puede ser jurídicamente relevante (art. 9 inc. 3 Ley 20.886). Suprema no la publica, así que su falso significa que no hay dónde mirar, no que la diligencia no se georreferenció. Mirar `COMPETENCIAS[competencia].historia.columnas` para saber cuál de las dos cosas es.",
            "title": "Georreferenciado",
            "type": "boolean"
          },
          "tiene_documento": {
            "description": "Si la columna `Doc.` del folio ofrece algo. Verdadero NO garantiza que este servidor pueda traerlo: cuando `documento_ruta` viene en nulo, la celda abre el documento con un modal de JavaScript cuyo endpoint no está medido.",
            "title": "Tiene Documento",
            "type": "boolean"
          },
          "tiene_anexo": {
            "default": false,
            "description": "Si la columna `Anexo` del folio ofrece algo. Es un SEGUNDO canal de documentos, distinto de `Doc.`: un folio puede traer la resolución en uno y los anexos del escrito en el otro.\n\nSe puede pedir SÓLO donde `anexo_referencia` viene con valor. En las demás la celda abre un modal de JavaScript cuya ruta no está verificada contra la plataforma, así que verdadero significa que hay algo y no que este servidor lo pueda traer.\n\nSe publica igual porque el silencio es peor. Sin este campo, un folio con anexo se veía idéntico a uno sin nada, y quien preguntara por los documentos de la causa recibía una respuesta que parecía completa. Verdadero significa: acá hay algo que hay que ir a buscar al expediente.\n\nFalso significa AUSENTE sólo donde la competencia publica la columna. En `penal` no hay tabla de Historia medida, así que ahí no se sabe.",
            "title": "Tiene Anexo",
            "type": "boolean"
          },
          "documento_ruta": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Qué ruta de la plataforma entrega ese documento. Cada competencia usa la suya. NULO cuando la actuación no trae documento.",
            "title": "Documento Ruta"
          },
          "georreferencia_referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Con qué se pide la georreferencia de esta actuación. NULO cuando la competencia no publica la columna o la actuación no la ofrece.\n\nTenerla no garantiza que haya georreferencia: está medido que una de seis abre un panel que responde que no existe ninguna.",
            "title": "Georreferencia Referencia"
          },
          "anexo_ruta": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Qué ruta de la plataforma entrega los anexos de este folio. Va junto con `anexo_referencia` y hacen falta las dos, igual que para el documento: una misma competencia abre paneles distintos según el trámite, y civil tiene dos con parámetros distintos.",
            "title": "Anexo Ruta"
          },
          "anexo_referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Con qué se piden los anexos de este folio. NULO cuando el folio no trae anexo, y también cuando lo trae por un panel que no está medido: ahí `tiene_anexo` queda en verdadero y esto en nulo, que significa que hay anexos y este servidor no los puede traer.",
            "title": "Anexo Referencia"
          },
          "documento_referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "La referencia opaca con la que la plataforma identifica ese documento. Junto con `documento_ruta` es lo único que permite pedirlo después: sin ellas se sabe que el documento existe y no cuál es. NULO cuando la actuación no trae documento.",
            "title": "Documento Referencia"
          }
        },
        "required": [
          "folio",
          "etapa",
          "tramite",
          "desc_tramite",
          "georreferenciado",
          "tiene_documento"
        ],
        "title": "Actuacion",
        "type": "object"
      }
    },
    "properties": {
      "result": {
        "items": {
          "$ref": "#/$defs/Actuacion"
        },
        "title": "Result",
        "type": "array"
      }
    },
    "required": [
      "result"
    ],
    "title": "obtener_actuaciones_receptorOutput",
    "type": "object"
  },
  "annotations": {
    "read_only_hint": true,
    "destructive_hint": false,
    "idempotent_hint": true,
    "open_world_hint": true
  }
}

obtener_detalle_causa

Historia, litigantes, notificaciones, liquidaciones, diligencias, materias, escritos por resolver, causas agregadas, los dos lados del exhorto y la causa de la que subió el recurso, leídos de una sola cadena de peticiones. Recorre todos los cuadernos, no sólo el que la plataforma muestra por defecto.

No es el expediente completo. Quedan dos paneles que este servidor no sabe leer, los dos de apelaciones: los exhortos de la corte y la incompetencia. Su ausencia acá NO significa que la causa no los tenga. No se mapean porque no hay qué mapear: su tabla trae dos columnas, la primera en blanco y la segunda con el rótulo, y en la mitad de los detalles de apelaciones el panel ni siquiera aparece.

Advertencia

Tres paneles se leen con las columnas del encabezado y de ninguno se vio una fila Los escritos pendientes y la liquidación de laboral, y las causas agregadas de suprema. El sitio publica sus encabezados en la tabla vacía, así que el orden y la cantidad están medidos y la validación posicional protege igual; lo que no está medido es qué trae cada celda.

En sesenta y una causas abiertas a propósito para buscarlas, ninguna trajo una fila: son paneles de una etapa (la liquidación en cumplimiento, la acumulación en suprema) o de una cola transitoria. Se leen igual para que el día que una causa los traiga la respuesta los incluya en vez de descartarlos en silencio, y si el contenido de una celda resulta ser otra cosa, ese campo llegará vacío en vez de fallar.

Advertencia

La columna Anexo es un segundo canal de documentos, y sólo a veces se puede pedir. La celda abre un modal de JavaScript que nombra dieciocho rutas, y se ofrecen cuatro paneles: los medidos cuya referencia cuelga de una fila que este servidor lee. Las demás se declaran no medidas en vez de pedirse a ciegas.

Cuando la actuación trae anexo_ruta y anexo_referencia con valor, obtener_anexos_escrito entrega ese panel. Un folio con tiene_anexo en verdadero y anexo_ruta en nulo tiene algo que este servidor no entrega: hay que ir al expediente. Vale igual para las piezas de exhorto: PiezaExhorto declara el mismo campo, porque el panel de piezas publica la misma columna.

Importante

Preferir ésta antes que preguntar por partes Los paneles vienen juntos en la misma respuesta HTML. Pedirlos por separado multiplica las consultas contra la plataforma sin traer nada nuevo: preguntar cuatro cosas de una causa con dos cuadernos costaba dieciséis peticiones donde bastan cuatro, sin contar en ninguno de los dos las dos que abren la sesión.

Medido de punta a punta contra la plataforma el 20 de agosto de 2026, con C-1156-2026: seis peticiones, todas 200, con los dos cuadernos y el exhorto incluidos.

Cada campo distingue tres estados, y los dos últimos significan cosas distintas:

Valor

Qué significa

nulo

Esta competencia no publica ese panel. La pregunta no tiene respuesta acá

lista vacía

El panel existe y no trae filas. Es una respuesta

con elementos

Lo que hay

Campo

Dónde existe

historia

apelaciones, civil, cobranza, laboral, suprema

litigantes

apelaciones, civil, cobranza, laboral, suprema

notificaciones

civil, cobranza, laboral

liquidaciones

cobranza, laboral

diligencias

cobranza, laboral

materias

laboral

exhortos

civil

piezas_exhorto

civil

causa_de_origen

suprema

Y un campo que no es un panel: causa_es_exhorto. Existe porque en piezas_exhorto el nulo podía significar dos cosas, que la competencia no publica el panel o que esta causa no es un exhorto, y meterlas en el mismo nulo borra la distinción que el resto del modelo protege.

causa_es_exhorto

Qué significa

nulo

La pregunta no está medida en esta competencia

falso

La causa no es un exhorto, y por eso piezas_exhorto viene en nulo

verdadero

Lo es, y piezas_exhorto trae lo que el tribunal de origen le mandó

Sale de la cabecera de la causa, no de que el panel esté presente: deducirlo de la presencia ataría la afirmación a que la plataforma no renombre un id, y el día que lo renombre la respuesta diría «esta causa no es un exhorto» en vez de «no pude leerlo».

Y otro que tampoco es un panel: audio_referencia, con qué se pide el listado de audios de las audiencias de la causa. Viene con valor cuando la cabecera ofrece el enlace, o sea cuando hay audiencia grabada, y eso es un dato en sí: la Historia dice que hubo audiencia, y esto dice que quedó registrada. Nulo cuando no la hay y también cuando la competencia no está medida, que hoy es todas salvo laboral. Se usa con listar_audios_audiencia.

causa_de_origen está en la tabla y tampoco trae filas: es la causa de la Corte de Apelaciones desde la que subió el recurso, y cierra hacia abajo la misma clase de arista que los exhortos cierran hacia el lado. Sólo suprema publica el panel.

Viene en nulo en dos casos, los dos medidos: la competencia no publica el panel, o la causa no subió desde una Corte de Apelaciones y el sitio no emite el panel. Lo segundo es tres de dieciséis causas de suprema, así que no es una rareza: exequátur, contienda de competencia y desafuero llegan a la Corte Suprema sin pasar por una corte.

Lo que levanta es el panel presente y sin sus cuatro datos, que nunca se observó: un rol sin corte no ubica ninguna causa, y media identidad se lee como que el sitio no la publica.

Importante

La corte viene por su nombre causa_de_origen.corte dice C.A. DE CONCEPCIÓN, y las búsquedas piden un entero. Hay que resolverlo con listar_cortes antes de consultar la causa apelada: pasar el nombre donde va el código no devuelve un error, devuelve las causas de otra jurisdicción. Es la misma trampa que el tribunal de destino de un exhorto.

El rol sí viene partido en rol y anio, que es como lo piden las búsquedas: el sitio lo publica como 14988 - 2020, con espacios alrededor del guion.

El mismo dato como grafo, útil para ver de un vistazo qué competencia sirve para qué pregunta. Se genera desde el código igual que la tabla, así que no puede quedar viejo:

        graph LR
  apelaciones --> historia
  civil --> historia
  cobranza --> historia
  laboral --> historia
  suprema --> historia
  apelaciones --> litigantes
  civil --> litigantes
  cobranza --> litigantes
  laboral --> litigantes
  suprema --> litigantes
  civil --> notificaciones
  cobranza --> notificaciones
  laboral --> notificaciones
  cobranza --> liquidaciones
  laboral --> liquidaciones
  cobranza --> diligencias
  laboral --> diligencias
  laboral --> materias
  civil --> exhortos
  civil --> piezas_exhorto
  suprema --> causa_de_origen
  penal --> nada["ningún panel medido"]
    

Y los tres estados que hay que respetar al informar. La rama de la izquierda es la que este proyecto existe para no borrar: «acá no se informa» no es «no ocurrió».

        graph TD
  P["Se pide el detalle"] --> E{"¿la búsqueda<br/>encontró el rol?"}
  E -->|no| NF["causa_encontrada: false<br/>y TODO lo demás en nulo"]
  E -->|sí| C{"¿esta competencia<br/>publica el panel?"}
  C -->|no| N["nulo<br/>la pregunta no tiene respuesta acá"]
  C -->|sí| F{"¿el panel<br/>trae filas?"}
  F -->|no| V["lista vacía<br/>ES una respuesta: no ocurrió"]
  F -->|sí| D["las filas"]
    

Advertencia

Al computar plazos fecha_diligencia de la historia trae dato sólo en civil. En cobranza la plataforma no publica cuándo se practicó la diligencia, así que ahí no hay de dónde leerla: computar desde fecha_registro sería computar desde cuándo el tribunal la asentó, que es otra fecha.

El panel notificaciones incluye las no practicadas, que se distinguen por su estado: una fila pendiente no hizo correr ningún plazo. Y llega vacío en causas cuya demanda sí se notificó, medido en C-1156-2026: la pregunta de si se notificó se responde con las actuaciones del ministro de fe, no con este panel.

Los litigantes traen RUT de personas naturales: son datos personales de terceros.

Y si exhortos trae algo, parte de la tramitación ocurre en otro expediente: el exhorto abre una causa nueva en el tribunal destino, con su propio rol, y las actuaciones de esa parte no están acá. Un plazo que corre por una diligencia exhortada no se computa desde esta causa.

Parámetro

Tipo

Descripción

tipo

str

Letra del rol en civil, cobranza y laboral; el libro en apelaciones, el código del libro en penal, o VACÍO en suprema

rol

int

Número, sin la letra ni el año

anio

int

Año, cuatro dígitos

competencia

str

Las verificadas. penal se rechaza por decisión, no por falta de medición: su detalle se lee y no se expone

tribunal

int, opcional

Código del tribunal

corte

int, opcional

Omitir salvo certeza

Esquema que entrega el protocolo

Generado desde el servidor al construir esta página, así que no puede quedar desactualizado respecto del código.

{
  "name": "obtener_detalle_causa",
  "inputSchema": {
    "properties": {
      "tipo": {
        "description": "Letra del rol en civil, cobranza y laboral; en civil son C, V, E, A, F o I y en cobranza A C D E J L P R y en laboral O, medidas. En apelaciones va el LIBRO en vez de una letra (por ejemplo 'Protección' o 'Exhorto'): ahí el número de rol se repite entre libros, así que sin él la consulta es ambigua y la herramienta falla en vez de abrir la causa equivocada. En penal el rol también lleva libro pero se busca por su CÓDIGO: medido, '1' es Ordinaria, y con el nombre el listado vuelve vacío. En suprema el rol no lleva nada adelante y este campo va VACÍO.",
        "title": "Tipo",
        "type": "string"
      },
      "rol": {
        "description": "Número del rol, sin la letra ni el año.",
        "minimum": 1,
        "title": "Rol",
        "type": "integer"
      },
      "anio": {
        "description": "Año del rol, cuatro dígitos.",
        "maximum": 2100,
        "minimum": 1900,
        "title": "Anio",
        "type": "integer"
      },
      "competencia": {
        "default": "civil",
        "description": "Una de: apelaciones, civil, cobranza, laboral, suprema. Son aquellas con al menos un panel del detalle medido contra una respuesta real.",
        "title": "Competencia",
        "type": "string"
      },
      "tribunal": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Código del tribunal. Esta herramienta devuelve UNA causa, así que el tribunal no acota nada: la identifica. En civil, cobranza, laboral y penal, donde un rol sin tribunal no identifica una causa: la búsqueda lo devuelve de cada juzgado que lo tenga, y en civil eso midió 43 causas de 43 personas distintas para un solo rol, sin él la llamada falla por ambigüedad en vez de abrir la causa de otra persona. En apelaciones eso lo hace `corte`, y en suprema no hace falta ninguno de los dos.",
        "title": "Tribunal"
      },
      "corte": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Código de la corte. Esta herramienta devuelve UNA causa, así que la corte no acota nada: la identifica. En apelaciones el mismo rol y el mismo libro existen en varias cortes, y sin ella la llamada falla por ambigüedad. En el resto, OMITIR salvo certeza: fijarla produce falsos negativos, porque excluye causas radicadas en otra jurisdicción.",
        "title": "Corte"
      }
    },
    "required": [
      "tipo",
      "rol",
      "anio"
    ],
    "title": "obtener_detalle_causaArguments",
    "type": "object"
  },
  "outputSchema": {
    "$defs": {
      "Actuacion": {
        "description": "Una fila de la tabla Historia.",
        "properties": {
          "folio": {
            "title": "Folio",
            "type": "string"
          },
          "etapa": {
            "title": "Etapa",
            "type": "string"
          },
          "tramite": {
            "title": "Tramite",
            "type": "string"
          },
          "desc_tramite": {
            "description": "Texto literal de la celda, sin normalizar.",
            "title": "Desc Tramite",
            "type": "string"
          },
          "fecha_diligencia": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Fecha real de la diligencia del receptor, en ISO 8601. ES LA QUE CUENTA PARA LOS PLAZOS PROCESALES. Nula si la fila no la informa.",
            "title": "Fecha Diligencia"
          },
          "hora_diligencia": {
            "anyOf": [
              {
                "format": "time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Hora de la diligencia, cuando la descripción la trae.",
            "title": "Hora Diligencia"
          },
          "fecha_registro": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Fecha en que el trámite se registró en el sistema, en ISO 8601. NO es la que corre los plazos.",
            "title": "Fecha Registro"
          },
          "discrepancia_fechas": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Si las DOS fuentes de `fecha_diligencia` discrepan: la que va entre paréntesis en 'Fec. Trámite' y la del texto 'Diligencia:'. NO compara contra `fecha_registro`; que esas dos difieran es lo normal. NULO cuando falta una de las dos fuentes: ahí no hay nada que comparar, y un falso diría que concuerdan.",
            "title": "Discrepancia Fechas"
          },
          "cuaderno": {
            "default": "",
            "description": "Cuaderno al que pertenece la actuación. Ej: '0 - Principal'.",
            "title": "Cuaderno",
            "type": "string"
          },
          "foja": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Foja del expediente. La publica civil; cobranza no la trae, y ahí es ausente y no vacía.",
            "title": "Foja"
          },
          "estado_firma": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Estado de firma del trámite. La publica cobranza en lugar de la foja; civil no la trae.",
            "title": "Estado Firma"
          },
          "estado": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Estado del trámite. La publican laboral, suprema y apelaciones.",
            "title": "Estado"
          },
          "sala": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Sala que resolvió el trámite. Sólo en suprema y en Cortes de Apelaciones, donde forma parte de cómo se cita el fallo.",
            "title": "Sala"
          },
          "correlativo": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Correlativo interno del trámite. Sólo en suprema.",
            "title": "Correlativo"
          },
          "anio_tramite": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Año que suprema publica en columna aparte, además de la fecha.",
            "title": "Anio Tramite"
          },
          "georreferenciado": {
            "description": "Si el sitio OFRECE la georreferencia de esta actuación, no si existe.\n\nEstá medido que no es lo mismo: el 20 de agosto de 2026, una de las seis actuaciones georreferenciadas de C-1156-2026 abría un panel que responde 'No existen Georreferencia para mostrar'. Verdadero significa que hay dónde preguntar, y confirmarlo cuesta una petición por actuación.\n\nFalso significa AUSENTE **sólo donde la competencia publica la columna**, y ahí sí puede ser jurídicamente relevante (art. 9 inc. 3 Ley 20.886). Suprema no la publica, así que su falso significa que no hay dónde mirar, no que la diligencia no se georreferenció. Mirar `COMPETENCIAS[competencia].historia.columnas` para saber cuál de las dos cosas es.",
            "title": "Georreferenciado",
            "type": "boolean"
          },
          "tiene_documento": {
            "description": "Si la columna `Doc.` del folio ofrece algo. Verdadero NO garantiza que este servidor pueda traerlo: cuando `documento_ruta` viene en nulo, la celda abre el documento con un modal de JavaScript cuyo endpoint no está medido.",
            "title": "Tiene Documento",
            "type": "boolean"
          },
          "tiene_anexo": {
            "default": false,
            "description": "Si la columna `Anexo` del folio ofrece algo. Es un SEGUNDO canal de documentos, distinto de `Doc.`: un folio puede traer la resolución en uno y los anexos del escrito en el otro.\n\nSe puede pedir SÓLO donde `anexo_referencia` viene con valor. En las demás la celda abre un modal de JavaScript cuya ruta no está verificada contra la plataforma, así que verdadero significa que hay algo y no que este servidor lo pueda traer.\n\nSe publica igual porque el silencio es peor. Sin este campo, un folio con anexo se veía idéntico a uno sin nada, y quien preguntara por los documentos de la causa recibía una respuesta que parecía completa. Verdadero significa: acá hay algo que hay que ir a buscar al expediente.\n\nFalso significa AUSENTE sólo donde la competencia publica la columna. En `penal` no hay tabla de Historia medida, así que ahí no se sabe.",
            "title": "Tiene Anexo",
            "type": "boolean"
          },
          "documento_ruta": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Qué ruta de la plataforma entrega ese documento. Cada competencia usa la suya. NULO cuando la actuación no trae documento.",
            "title": "Documento Ruta"
          },
          "georreferencia_referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Con qué se pide la georreferencia de esta actuación. NULO cuando la competencia no publica la columna o la actuación no la ofrece.\n\nTenerla no garantiza que haya georreferencia: está medido que una de seis abre un panel que responde que no existe ninguna.",
            "title": "Georreferencia Referencia"
          },
          "anexo_ruta": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Qué ruta de la plataforma entrega los anexos de este folio. Va junto con `anexo_referencia` y hacen falta las dos, igual que para el documento: una misma competencia abre paneles distintos según el trámite, y civil tiene dos con parámetros distintos.",
            "title": "Anexo Ruta"
          },
          "anexo_referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Con qué se piden los anexos de este folio. NULO cuando el folio no trae anexo, y también cuando lo trae por un panel que no está medido: ahí `tiene_anexo` queda en verdadero y esto en nulo, que significa que hay anexos y este servidor no los puede traer.",
            "title": "Anexo Referencia"
          },
          "documento_referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "La referencia opaca con la que la plataforma identifica ese documento. Junto con `documento_ruta` es lo único que permite pedirlo después: sin ellas se sabe que el documento existe y no cuál es. NULO cuando la actuación no trae documento.",
            "title": "Documento Referencia"
          }
        },
        "required": [
          "folio",
          "etapa",
          "tramite",
          "desc_tramite",
          "georreferenciado",
          "tiene_documento"
        ],
        "title": "Actuacion",
        "type": "object"
      },
      "CausaAgregada": {
        "description": "Otra causa que se ve JUNTO con ésta en la Corte Suprema.\n\nEs lo que la plataforma rotula \"Agregados\". No es la causa de origen ni un exhorto: son\ncausas distintas que el tribunal ve en la misma cuenta, así que lo que ocurra en ellas puede\nresolverse el mismo día y no aparece en la historia de ésta.\n\n**Sus columnas salen del encabezado y ninguna fila se ha visto.** El panel vino vacío en las\nveintidós causas de suprema que se abrieron para medirlo, así que lo que trae cada celda no\nestá comprobado: si una publica un formulario donde acá se lee texto, el campo va a salir\nvacío en vez de fallar.",
        "properties": {
          "folio": {
            "default": "",
            "description": "Folio con que la causa agregada figura acá.",
            "title": "Folio",
            "type": "string"
          },
          "anio": {
            "default": "",
            "description": "Año que el panel publica en columna aparte.",
            "title": "Anio",
            "type": "string"
          },
          "rit": {
            "default": "",
            "description": "Rol de la causa agregada.",
            "title": "Rit",
            "type": "string"
          },
          "tribunal": {
            "default": "",
            "description": "Tribunal de esa causa, por su nombre.",
            "title": "Tribunal",
            "type": "string"
          },
          "materia": {
            "default": "",
            "description": "Qué se litiga en ella.",
            "title": "Materia",
            "type": "string"
          },
          "caratulado": {
            "default": "",
            "description": "Carátula de esa causa.",
            "title": "Caratulado",
            "type": "string"
          },
          "documento_ruta": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Qué ruta entrega su documento, si la fila lo trae.",
            "title": "Documento Ruta"
          },
          "documento_referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Con qué se pide. Va junto con su ruta.",
            "title": "Documento Referencia"
          }
        },
        "title": "CausaAgregada",
        "type": "object"
      },
      "CausaDeOrigen": {
        "description": "La causa de la Corte de Apelaciones de la que subió el recurso.\n\nCierra la arista hacia ABAJO, igual que `Exhorto` la cierra hacia el lado: sin esto el\ndetalle de una causa de la Corte Suprema dice que hubo una apelación y no dice dónde está\nla causa apelada, que es donde vive todo lo que ocurrió antes.\n\nLos cuatro rótulos del panel son UN dato, la identidad de una causa, y por eso ninguno\nviaja en nulo: el mismo número de rol existe en las diecisiete cortes y, dentro de una, en\nvarios libros a la vez. Un rol sin corte no ubica nada.",
        "properties": {
          "corte": {
            "description": "NOMBRE de la Corte de Apelaciones, tal como el sitio lo emite. Ej: 'C.A. DE CONCEPCIÓN'. NO es el código que las búsquedas exigen: para consultar esta causa hay que resolverlo con `listar_cortes` y pasar el entero, igual que con el tribunal de destino de un exhorto. Pasar el nombre donde va el código no devuelve un error, devuelve las causas de otra jurisdicción.",
            "title": "Corte",
            "type": "string"
          },
          "libro": {
            "description": "Libro en que la corte tramitó el recurso. Ej: 'Protección'. Es lo que va en `tipo` al buscar en apelaciones, que es la única competencia donde el rol lleva el libro adelante en vez de una letra: sin él, `14988-2020` no identifica una causa.",
            "title": "Libro",
            "type": "string"
          },
          "rol": {
            "description": "Número de rol en la corte, sin el libro ni el año. El sitio lo publica junto al año y con espacios alrededor del guion ('14988 - 2020'); se entrega partido porque es así como lo piden las búsquedas de este servidor, que exigen enteros.",
            "title": "Rol",
            "type": "integer"
          },
          "anio": {
            "description": "Año de ingreso a la corte, cuatro dígitos.",
            "title": "Anio",
            "type": "integer"
          },
          "recurso": {
            "description": "Qué se recurrió, tal como el sitio lo emite y sin normalizar. Ej: '(Civil) Apelación Protección'.",
            "title": "Recurso",
            "type": "string"
          }
        },
        "required": [
          "corte",
          "libro",
          "rol",
          "anio",
          "recurso"
        ],
        "title": "CausaDeOrigen",
        "type": "object"
      },
      "Diligencia": {
        "description": "Una diligencia del ministro de fe. La publican cobranza y laboral.\n\nEn cobranza es el panel donde se guardan de verdad: su tabla de Historia nombra algunas\ncomo `Actuacion - Receptor`, sin tilde y con guion, y ninguna trae fecha de diligencia,\nasí que leerlas de ahí daría una lista parcial y sin el dato que se busca.\n\nNo es una `Actuacion` y no se puede tratar como tal. Una actuación de civil trae la fecha\ndoble que corre los plazos; acá el sitio publica una sola columna de fecha, y en la fila\nmedida trae el valor cero.",
        "properties": {
          "estado": {
            "description": "Si la diligencia se practicó, y HAY QUE MIRARLO antes de leer la fecha. Valor medido: 'cumplida'. Que la fecha venga nula NO significa que no se practicó: significa que el sitio no publicó ninguna.",
            "title": "Estado",
            "type": "string"
          },
          "tipo": {
            "description": "Qué diligencia es. Ej: 'Oficios Varios 3'. Es lo que el sitio imprime, sin normalizar: dos causas pueden escribir distinto la misma diligencia.",
            "title": "Tipo",
            "type": "string"
          },
          "fecha_tramite": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "La única fecha que el panel publica, en ISO 8601. NO es la fecha de diligencia de civil: acá no viene la fecha doble, así que no se puede afirmar cuándo el ministro de fe la practicó. NULA también cuando el sitio imprime `31/12/1969`, que es el valor cero renderizado como fecha y no una diligencia de 1969: informarla haría computar un plazo desde ahí.",
            "title": "Fecha Tramite"
          },
          "destinatario": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "A quién se dirige la diligencia. Medido: 'No Asignado', o sea el panel publica la fila antes de que haya alguien encargado de practicarla. NULO en laboral, que no publica la columna.",
            "title": "Destinatario"
          },
          "responsable": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Quién figura a cargo de la diligencia, tal como lo publica el sitio. Es el nombre de una persona natural: es un dato personal de un tercero. NULO en laboral, que no publica la columna.",
            "title": "Responsable"
          },
          "referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Con qué se despachó la diligencia, como lo rotula el sitio. Medido en laboral: 'Envío Automatico'. NULO en cobranza, que no publica la columna.",
            "title": "Referencia"
          },
          "documento_ida_ruta": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Qué ruta entrega el oficio DESPACHADO. NULO cuando la fila no lo trae, y también en cobranza, donde sólo está medido el caso sin documento.",
            "title": "Documento Ida Ruta"
          },
          "documento_ida_referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Con qué se pide ese documento. Va junto con su ruta.",
            "title": "Documento Ida Referencia"
          },
          "documento_vuelta_ruta": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Qué ruta entrega el oficio que VOLVIÓ. Su ausencia es un dato: está medido que una diligencia `enviada` trae sólo el de ida, y una `cumplida` los dos.",
            "title": "Documento Vuelta Ruta"
          },
          "documento_vuelta_referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Con qué se pide ese documento. Va junto con su ruta.",
            "title": "Documento Vuelta Referencia"
          },
          "rit": {
            "description": "RIT de la causa A LA QUE la diligencia se dirige, que NO es necesariamente la que se consultó. Leerlo como el RIT de esta causa haría informar como propia una diligencia de otro expediente.",
            "title": "Rit",
            "type": "string"
          },
          "ruc": {
            "description": "RUC de esa misma causa, con el mismo cuidado que `rit`: es de la causa destinataria de la diligencia, no de la consultada.",
            "title": "Ruc",
            "type": "string"
          }
        },
        "required": [
          "estado",
          "tipo",
          "rit",
          "ruc"
        ],
        "title": "Diligencia",
        "type": "object"
      },
      "EscritoPendiente": {
        "description": "Un escrito presentado que el tribunal todavía NO resuelve.\n\nEl sitio rotula la pestaña \"Escritos por Resolver\" en civil y \"Escritos Pendientes\" en\nlaboral. No es el listado de todo lo presentado: es la cola de lo que espera proveído, y\npor eso una causa con años de tramitación suele traerla vacía mientras una de esta semana\ntrae dos.\n\nEs lo que responde \"¿ya me proveyeron el escrito?\", que es una pregunta distinta de la que\nresponde la Historia, donde el escrito aparece cuando YA fue resuelto.",
        "properties": {
          "fecha_ingreso": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Cuándo ingresó el escrito, en ISO 8601. NO es una fecha de plazos: el plazo lo corre la resolución que recaiga, y todavía no la hay.",
            "title": "Fecha Ingreso"
          },
          "tipo": {
            "default": "",
            "description": "Qué se pidió, como lo rotula el sitio. Ej: 'Ingreso Solicitud', 'Ingreso Exhorto', 'Designación de Martillero'.",
            "title": "Tipo",
            "type": "string"
          },
          "solicitante": {
            "default": "",
            "description": "Quién lo presentó, por su calidad procesal y no por su nombre. Ej: 'Demandante'.",
            "title": "Solicitante",
            "type": "string"
          },
          "referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Lo que laboral publica en su columna `Referencia`. NULO en civil, que no la publica, y en laboral mientras no se vea una fila: su contenido no está medido.",
            "title": "Referencia"
          },
          "tiene_documento": {
            "default": false,
            "description": "Si la columna `Doc.` del escrito ofrece algo.",
            "title": "Tiene Documento",
            "type": "boolean"
          },
          "documento_ruta": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Qué ruta entrega el escrito mismo. NULO cuando la fila no trae formulario.",
            "title": "Documento Ruta"
          },
          "documento_referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "La referencia opaca con la que se pide ese documento. Junto con `documento_ruta` es lo único que permite traerlo.",
            "title": "Documento Referencia"
          },
          "tiene_anexo": {
            "default": false,
            "description": "Si el escrito acompañó documentos. Mismo segundo canal que en la Historia: `Doc.` trae el escrito y `Anexo` los papeles que se acompañaron.",
            "title": "Tiene Anexo",
            "type": "boolean"
          },
          "anexo_ruta": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "A qué panel se piden esos anexos, para `obtener_anexos_escrito`. NULO cuando el escrito no trae anexo o cuando su panel no está medido.",
            "title": "Anexo Ruta"
          },
          "anexo_referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Con qué se piden. NULO por las mismas dos razones.",
            "title": "Anexo Referencia"
          }
        },
        "title": "EscritoPendiente",
        "type": "object"
      },
      "Exhorto": {
        "description": "Una causa que este tribunal despachó a otro para que practique una diligencia.\n\nSe ve desde el tribunal de ORIGEN: `rol_destino` es la causa que se abrió en el otro\ntribunal, y ahí viven las actuaciones que este expediente no muestra. Un plazo que corre\npor una diligencia exhortada NO se computa desde acá.",
        "properties": {
          "rol_origen": {
            "description": "El rol de esta causa, la que ordena el exhorto.",
            "title": "Rol Origen",
            "type": "string"
          },
          "rol_destino": {
            "description": "El rol que la causa recibió en el tribunal destino.",
            "title": "Rol Destino",
            "type": "string"
          },
          "tribunal_destino": {
            "description": "Tribunal que debe practicar la diligencia.",
            "title": "Tribunal Destino",
            "type": "string"
          },
          "tipo": {
            "default": "",
            "description": "Tipo de exhorto, según el sitio.",
            "title": "Tipo",
            "type": "string"
          },
          "estado": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Estado del exhorto. Medido: 'Generado'. Otros valores no se conocen.",
            "title": "Estado"
          },
          "fecha_orden": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Cuándo el tribunal ordenó despacharlo.",
            "title": "Fecha Orden"
          },
          "fecha_ingreso": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Cuándo ingresó al tribunal destino.",
            "title": "Fecha Ingreso"
          },
          "referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "La referencia con la que la plataforma abre el detalle de este exhorto. Se guarda para cuando ese panel esté medido: hoy no hay herramienta que la use.",
            "title": "Referencia"
          }
        },
        "required": [
          "rol_origen",
          "rol_destino",
          "tribunal_destino"
        ],
        "title": "Exhorto",
        "type": "object"
      },
      "Liquidacion": {
        "description": "Una liquidación del crédito. La publican cobranza y laboral.\n\nUna causa acumula liquidaciones sucesivas: la MÁS RECIENTE es la vigente y las anteriores\nson el historial. NO se suman. La causa medida fue de $4.481.885 en 2019 a $24.563.365 en\n2022, así que sumarlas informaría una deuda inflada varias veces.",
        "properties": {
          "fecha": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Fecha de la liquidación, en ISO 8601. Ordena el historial: la más reciente es la vigente y las anteriores NO se suman a ella. NULA en laboral, que no publica la columna: ahí no hay con qué ordenarlas, así que cuál es la vigente no se sabe.",
            "title": "Fecha"
          },
          "cuaderno": {
            "default": "",
            "description": "Cuaderno al que corresponde.",
            "title": "Cuaderno",
            "type": "string"
          },
          "estado": {
            "default": "",
            "description": "Estado de la liquidación. Ej: 'Firmado'.",
            "title": "Estado",
            "type": "string"
          },
          "monto": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Monto líquido en pesos, sin separadores. Es el total adeudado A ESA FECHA, no un cargo que se sume a los demás: la deuda vigente es el monto de la liquidación más reciente. NULO si no se pudo leer con la forma medida, y nulo NO es cero, que sería una deuda saldada.\n\nLa forma medida es la de cobranza (`$24.563.365.-`). En laboral el panel nunca trajo una fila, así que si imprime el monto de otra manera esto va a venir nulo con `monto_publicado` lleno, y ahí el dato está en el segundo.",
            "title": "Monto"
          },
          "monto_publicado": {
            "description": "El monto tal como lo imprime el sitio, ej: '$24.563.365.-'. Se conserva porque es lo que aparece en el expediente y es contra lo que alguien va a comparar.",
            "title": "Monto Publicado",
            "type": "string"
          },
          "rut": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "A QUIÉN se le paga, en las liquidaciones de laboral. Es un RUT de persona natural: dato personal de un tercero. NULO en cobranza, que liquida el crédito por documento y no por persona, y también mientras el panel de laboral no traiga una fila: su contenido sale del encabezado y nadie lo ha visto lleno.",
            "title": "Rut"
          },
          "nombre": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "El nombre de esa persona, tal como el sitio lo publica. NULO en cobranza por lo mismo.",
            "title": "Nombre"
          }
        },
        "required": [
          "monto_publicado"
        ],
        "title": "Liquidacion",
        "type": "object"
      },
      "Litigante": {
        "description": "Una parte de la causa, con su calidad procesal.\n\nTrae RUT de personas naturales. Es lo que la plataforma publica y lo que identifica a una\nparte sin ambigüedad, y por eso se entrega: dos personas pueden llamarse igual. Quien\nconecte este servidor debe saber que recibe datos personales de terceros.",
        "properties": {
          "sujeto": {
            "description": "Calidad procesal. Ej: 'DTE.' demandante, 'DDO.' demandado, 'RECURRIDO'.",
            "title": "Sujeto",
            "type": "string"
          },
          "nombre": {
            "description": "Nombre o razón social, tal como lo publica el sitio.",
            "title": "Nombre",
            "type": "string"
          },
          "rut": {
            "default": "",
            "description": "RUT con dígito verificador, como lo publica el sitio.",
            "title": "Rut",
            "type": "string"
          },
          "persona": {
            "default": "",
            "description": "Si es persona 'NATURAL' o 'JURIDICA', según el sitio.",
            "title": "Persona",
            "type": "string"
          },
          "abogado_defensor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Si tiene abogado defensor. Sólo laboral publica la columna.",
            "title": "Abogado Defensor"
          },
          "estado": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Estado de la parte, tal como el sitio lo emite: la clase del icono, sin interpretar. Sólo laboral publica la columna, y ahí NUNCA es nulo. Un nulo significa que esta competencia no publica el dato, no que la parte no tenga estado.",
            "title": "Estado"
          }
        },
        "required": [
          "sujeto",
          "nombre"
        ],
        "title": "Litigante",
        "type": "object"
      },
      "Materia": {
        "description": "Una materia de la causa: qué se está litigando.",
        "properties": {
          "codigo": {
            "description": "Código de la materia en la nomenclatura del sitio. Ej: 'L021'.",
            "title": "Codigo",
            "type": "string"
          },
          "glosa": {
            "description": "Qué es. Ej: 'Despido injustificado', 'Feriado legal'.",
            "title": "Glosa",
            "type": "string"
          },
          "estado": {
            "default": "",
            "description": "Estado de esa materia. Ej: 'Sentencia'.",
            "title": "Estado",
            "type": "string"
          },
          "fecha_termino": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Fecha de término de la materia, en ISO 8601.",
            "title": "Fecha Termino"
          }
        },
        "required": [
          "codigo",
          "glosa"
        ],
        "title": "Materia",
        "type": "object"
      },
      "Notificacion": {
        "description": "Una fila del panel de notificaciones.",
        "properties": {
          "estado": {
            "description": "Si la notificación se practicó, y HAY QUE MIRARLO: la lista incluye intentos que NO se practicaron. Valores medidos: 'Realizada' en civil y laboral, 'Pendiente' en laboral, 'realizada' y 'enviada' en cobranza. Una fila 'Pendiente' significa que la notificación no se ha practicado, así que su fecha NO hizo correr ningún plazo. 'enviada' es una carta despachada, que no es lo mismo que notificada.",
            "title": "Estado",
            "type": "string"
          },
          "tipo": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Vía por la que se notificó: 'mail', 'carta'. Laboral no la trae.",
            "title": "Tipo"
          },
          "fecha_notificacion": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Cuándo se practicó la notificación, en ISO 8601. NULO donde la competencia no publica esta columna: sólo cobranza la trae. Nulo significa que el dato no está, NO que coincida con la fecha de trámite.",
            "title": "Fecha Notificacion"
          },
          "fecha_tramite": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Fecha del trámite notificado, en ISO 8601. Es la única que publican civil y laboral. NO es por sí sola la fecha en que se notificó: mirar `estado` antes de computar un plazo con ella.",
            "title": "Fecha Tramite"
          },
          "tipo_parte": {
            "description": "Calidad de quien fue notificado. Ej: 'AB.DTE.' abogado demandante, 'DDO.' demandado.",
            "title": "Tipo Parte",
            "type": "string"
          },
          "nombre": {
            "description": "Nombre de quien fue notificado, tal como lo publica el sitio.",
            "title": "Nombre",
            "type": "string"
          },
          "tramite": {
            "default": "",
            "description": "Qué se notificó. Ej: 'resolución'.",
            "title": "Tramite",
            "type": "string"
          },
          "observacion": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Por qué falló la notificación, cuando falló. Cobranza no trae la columna.",
            "title": "Observacion"
          },
          "rol": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Rol de la causa. Sólo civil lo repite acá.",
            "title": "Rol"
          }
        },
        "required": [
          "estado",
          "tipo_parte",
          "nombre"
        ],
        "title": "Notificacion",
        "type": "object"
      },
      "PiezaExhorto": {
        "description": "Un trámite de la causa de ORIGEN que vino junto con el exhorto.\n\nNO es una actuación de esta causa, y por eso no comparte tipo con `Actuacion` ni viaja en\n`historia`: es tramitación que ocurrió en el otro tribunal, antes de que el exhorto llegara,\ny es lo que el tribunal exhortado tuvo a la vista. Los plazos de esta causa no se computan\ndesde acá.",
        "properties": {
          "folio": {
            "title": "Folio",
            "type": "string"
          },
          "cuaderno": {
            "default": "",
            "description": "Cuaderno de la causa de ORIGEN al que pertenece la pieza.",
            "title": "Cuaderno",
            "type": "string"
          },
          "etapa": {
            "default": "",
            "description": "Etapa en que la causa de origen la despachó.",
            "title": "Etapa",
            "type": "string"
          },
          "tramite": {
            "default": "",
            "description": "Tipo de trámite. Ej: 'Resolución', 'Escrito'.",
            "title": "Tramite",
            "type": "string"
          },
          "desc_tramite": {
            "default": "",
            "description": "Texto literal de la celda, sin normalizar.",
            "title": "Desc Tramite",
            "type": "string"
          },
          "fecha_registro": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Cuándo el tribunal de origen registró el trámite, en ISO 8601.",
            "title": "Fecha Registro"
          },
          "fecha_diligencia": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "La fecha entre paréntesis, cuando la celda trae las dos. Nula en las seis piezas medidas: ahí el sitio publica una sola fecha en esta columna.",
            "title": "Fecha Diligencia"
          },
          "foja": {
            "default": "",
            "description": "Foja del expediente de origen.",
            "title": "Foja",
            "type": "string"
          },
          "tiene_documento": {
            "description": "Si la columna `Doc.` de la pieza ofrece algo.",
            "title": "Tiene Documento",
            "type": "boolean"
          },
          "tiene_anexo": {
            "default": false,
            "description": "Si la columna `Anexo` de la pieza ofrece algo. Es el mismo canal que `Actuacion.tiene_anexo`, pero acá NO se puede pedir: las piezas sólo están medidas en civil, y de las rutas de anexo sólo se ejecutó la de laboral. Por eso esta pieza no trae referencia de anexo y la actuación laboral sí. La pieza puede traer su documento principal y un anexo aparte.",
            "title": "Tiene Anexo",
            "type": "boolean"
          },
          "documento_ruta": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Qué ruta de la plataforma entrega ese documento. NULO si no trae.",
            "title": "Documento Ruta"
          },
          "documento_referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "La referencia opaca con la que la plataforma identifica ese documento. Junto con `documento_ruta` es lo único que permite pedirlo después. NULO si no trae.",
            "title": "Documento Referencia"
          }
        },
        "required": [
          "folio",
          "tiene_documento"
        ],
        "title": "PiezaExhorto",
        "type": "object"
      }
    },
    "description": "Los paneles MAPEADOS del detalle, leídos de una sola vez. No es el expediente completo.\n\nDecirlo es parte del contrato, porque la ausencia se lee como inexistencia. Quedan dos\npaneles sin mapear, los dos de apelaciones: los exhortos de la corte y la incompetencia. Lo\nque no está acá **no está dicho**, no está negado.\n\nNo se mapean porque no hay qué mapear: su tabla trae dos columnas, la primera en blanco y la\nsegunda con el rótulo, y en la mitad de los detalles de apelaciones el panel ni siquiera\naparece.\n\nY tres de los que SÍ se leen tienen las columnas medidas del encabezado y ninguna fila\nobservada, que es otra cosa que conviene saber: `SIN_FILAS_OBSERVADAS` los nombra.\n\nY dos canales que sí se pueden pedir y NO vienen incluidos, porque cuestan una petición\naparte cada uno: los anexos de un folio, con `anexo_ruta` y `anexo_referencia` de su\nactuación, y el listado de audios de audiencia, con `audio_referencia`. Que esos campos\nvengan con valor significa que hay algo que este servidor puede traer y todavía no trajo.\n\nCada campo distingue tres estados, y la diferencia entre los dos últimos es la que este\nproyecto existe para no borrar:\n\n- `None`: esta competencia NO publica ese panel. La pregunta no tiene respuesta acá.\n- `[]`: el panel existe y no trae filas. Es una respuesta: no hay notificaciones\n  practicadas, no hay liquidaciones, no hay exhortos despachados.\n\nDos paneles NO pueden venir vacíos y por eso no están en esa lista: `litigantes`, porque\nuna causa sin partes no existe, y `materias`, porque una causa laboral sin materia tampoco.\nSi el sitio los devuelve sin filas se levanta en vez de publicar la lista vacía.\n- Con elementos: lo que hay.\n\nDevolver lista vacía en el primer caso las haría indistinguibles, y \"esta competencia no lo\ninforma\" se leería como \"no ocurrió\".\n\n`piezas_exhorto` trae un cuarto caso que esos tres no saben decir. El panel existe en civil,\npero sólo en las causas que SON un exhorto: \"esta competencia no lo publica\" y \"esta causa\nno es un exhorto\" son cosas distintas, y meter las dos en `None` borra justo la distinción\nque la lista de arriba protege. Por eso viaja al lado `causa_es_exhorto`, con el mismo\noficio que `causa_encontrada`: nombrar cuál de los dos silencios es éste.\n\n`causa_de_origen` no es una lista, así que nunca viene en `[]`: o trae entera la causa de\nla que subió el recurso, o viene en nulo porque la competencia no publica ese panel. Un\npanel presente que no se entiende levanta, y no se degrada a campos vacíos.",
    "properties": {
      "causa_encontrada": {
        "default": true,
        "description": "Falso cuando la búsqueda no dio con el rol pedido. En ese caso TODOS los demás campos vienen en nulo por no haber causa que leer, NO porque la competencia no publique esos paneles: sin este campo las dos situaciones se verían iguales.",
        "title": "Causa Encontrada",
        "type": "boolean"
      },
      "historia": {
        "anyOf": [
          {
            "items": {
              "$ref": "#/$defs/Actuacion"
            },
            "type": "array"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Todas las actuaciones, de todos los cuadernos. NULO si la competencia no tiene su panel de historia medido.",
        "title": "Historia"
      },
      "litigantes": {
        "anyOf": [
          {
            "items": {
              "$ref": "#/$defs/Litigante"
            },
            "type": "array"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Quiénes son parte y con qué calidad procesal. Trae RUT de personas naturales: son datos personales de terceros.",
        "title": "Litigantes"
      },
      "notificaciones": {
        "anyOf": [
          {
            "items": {
              "$ref": "#/$defs/Notificacion"
            },
            "type": "array"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Notificaciones practicadas Y no practicadas. Mirar `estado` antes de computar un plazo con sus fechas.",
        "title": "Notificaciones"
      },
      "liquidaciones": {
        "anyOf": [
          {
            "items": {
              "$ref": "#/$defs/Liquidacion"
            },
            "type": "array"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Lo publican cobranza y laboral, y NO es la misma pregunta: cobranza liquida el crédito por documento y fecha, y laboral publica a quién se le paga, sin fecha. Que la más reciente sea la vigente vale donde hay fecha con qué ordenarlas.",
        "title": "Liquidaciones"
      },
      "diligencias": {
        "anyOf": [
          {
            "items": {
              "$ref": "#/$defs/Diligencia"
            },
            "type": "array"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Diligencias del ministro de fe, con su estado y quién figura a cargo. Lo publican cobranza y laboral. En la fila de cobranza medida su fecha NO es la que corre los plazos: el sitio imprime el valor cero y se entrega en nulo. En laboral no está medida.",
        "title": "Diligencias"
      },
      "materias": {
        "anyOf": [
          {
            "items": {
              "$ref": "#/$defs/Materia"
            },
            "type": "array"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Qué se litiga. Sólo laboral publica el panel.",
        "title": "Materias"
      },
      "exhortos": {
        "anyOf": [
          {
            "items": {
              "$ref": "#/$defs/Exhorto"
            },
            "type": "array"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Causas que este tribunal despachó a otro. Una lista con elementos significa que parte de la tramitación ocurre en OTRO expediente, y las actuaciones de esa parte no están acá.",
        "title": "Exhortos"
      },
      "causa_es_exhorto": {
        "anyOf": [
          {
            "type": "boolean"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Si ESTA causa es un exhorto: una que otro tribunal abrió acá para que se practiquen diligencias suyas. Sale de la cabecera de la causa, no de qué paneles llegaron. NULO significa que la competencia no tiene la pregunta medida, NO que la causa no lo sea: sin este campo, `piezas_exhorto` en nulo diría las dos cosas a la vez.",
        "title": "Causa Es Exhorto"
      },
      "audio_referencia": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Con qué se pide el listado de audios de las audiencias de esta causa, si las tiene. NULO cuando la causa no ofrece grabación y también cuando su competencia no está medida: sólo laboral lo está.\n\nQue venga con valor significa que HAY audiencia grabada, que es un dato en sí: la Historia dice que hubo audiencia, y esto dice que quedó registrada.",
        "title": "Audio Referencia"
      },
      "causa_de_origen": {
        "anyOf": [
          {
            "$ref": "#/$defs/CausaDeOrigen"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "La causa de la Corte de Apelaciones desde la que subió el recurso. Es cómo se sigue la causa hacia abajo: sin ella el detalle dice que hubo apelación y no dice dónde está lo que ocurrió antes. Sólo suprema publica el panel, y en las demás viene en NULO por eso, no porque la causa no venga de ninguna parte.\n\nSu `corte` es el NOMBRE y las búsquedas piden el código: se resuelve con `listar_cortes` antes de consultarla."
      },
      "escritos_pendientes": {
        "anyOf": [
          {
            "items": {
              "$ref": "#/$defs/EscritoPendiente"
            },
            "type": "array"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Los escritos presentados que el tribunal todavía NO resuelve. La lista vacía es una respuesta: no queda nada por proveer. NULO si la competencia no tiene medido el panel.",
        "title": "Escritos Pendientes"
      },
      "causas_agregadas": {
        "anyOf": [
          {
            "items": {
              "$ref": "#/$defs/CausaAgregada"
            },
            "type": "array"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Las causas que se ven JUNTO con ésta en la Corte Suprema. La lista vacía es lo normal y es una respuesta. NULO donde la competencia no publica el panel.",
        "title": "Causas Agregadas"
      },
      "piezas_exhorto": {
        "anyOf": [
          {
            "items": {
              "$ref": "#/$defs/PiezaExhorto"
            },
            "type": "array"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Los trámites que el tribunal de ORIGEN despachó junto con el exhorto, o sea lo que este tribunal tuvo a la vista. NO son actuaciones de esta causa y no corren sus plazos. Viene en nulo cuando `causa_es_exhorto` no es verdadero, y ese campo dice cuál de las dos ausencias es.",
        "title": "Piezas Exhorto"
      }
    },
    "title": "DetalleCausa",
    "type": "object"
  },
  "annotations": {
    "read_only_hint": true,
    "destructive_hint": false,
    "idempotent_hint": true,
    "open_world_hint": true
  }
}

obtener_georreferencia

Dónde y cuándo el ministro de fe registró que practicó una diligencia. Es el registro del art. 9 inc. 3 de la Ley 20.886.

Parámetro

Qué es

georreferencia_referencia

Lo entrega cada actuación. Cuando viene nula, esa actuación no la ofrece

competencia

Sólo las que publican la columna. Suprema no la publica

Importante

Trae la única hora del proyecto Las dos fechas de la Historia son del día. Ésta viene del aparato con que se tomó la coordenada, así que es una tercera fuente sobre cuándo ocurrió la diligencia, independiente de las dos que el sitio publica en la tabla.

No reemplaza a fecha_diligencia, que es la que corre los plazos. Sirve para contrastarla, y si no coinciden hay que informarlo, no elegir.

Campo

Tipo

Qué es

existe

bool

Falso cuando la actuación la ofrecía y el panel respondió que no hay ninguna

latitud / longitud

float | null

Como las publica el sitio

precision_metros

float | null

Radio de incertidumbre. Medidas: 6,0 · 10,04 · 26,68 · 56,22 · 103,13

fecha_dispositivo

date | null

Cuándo el aparato tomó la coordenada

hora_dispositivo

time | null

La hora de esa toma

intentos

int | null

Cuántas veces el aparato intentó fijar la posición

Advertencia

La precisión varía mucho, y con 103 metros la ubicación no identifica un domicilio Medidas en una sola causa: 6,0 · 10,04 · 26,68 · 56,22 y 103,13 metros. Un radio de 103 metros abarca una manzana entera en zona urbana, así que la coordenada dice el sector y no la puerta. Informar la precisión junto con las coordenadas, siempre: sin ella el punto se lee como exacto.

existe: false no es lo mismo que no haber preguntado, y está medido: de las seis actuaciones georreferenciadas de una causa, una abre un panel que dice que no hay ninguna.

Cuesta una petición por actuación, con su intervalo. Se pide de la actuación concreta que importa, nunca de todas: para las seis de una causa de dos cuadernos serían seis peticiones más sobre las seis que ya costó leerla.

Trae coordenadas de un domicilio de terceros, con el mismo criterio que el RUT de los litigantes: es lo que la plataforma publica.

Esquema que entrega el protocolo

Generado desde el servidor al construir esta página, así que no puede quedar desactualizado respecto del código.

{
  "name": "obtener_georreferencia",
  "inputSchema": {
    "properties": {
      "georreferencia_referencia": {
        "description": "Lo entrega cada actuación en `georreferencia_referencia`. Cuando esa viene nula, la actuación no ofrece georreferencia y no hay nada que pedir.",
        "title": "Georreferencia Referencia",
        "type": "string"
      },
      "competencia": {
        "default": "civil",
        "description": "Una de: apelaciones, civil, cobranza, laboral. Son las que publican la columna de georreferencia en su tabla de Historia. Suprema no la publica.",
        "title": "Competencia",
        "type": "string"
      }
    },
    "required": [
      "georreferencia_referencia"
    ],
    "title": "obtener_georreferenciaArguments",
    "type": "object"
  },
  "outputSchema": {
    "description": "Dónde y cuándo el ministro de fe registró que practicó una diligencia.\n\nEs el registro del art. 9 inc. 3 de la Ley 20.886, y trae algo que no hay en ninguna otra\nparte de la respuesta: la **hora**. Las dos fechas de la Historia son del día, y ésta viene\ndel aparato con que se tomó la coordenada.\n\nEso la vuelve una TERCERA fuente sobre cuándo ocurrió la diligencia, independiente de las\ndos que el sitio publica en la tabla. No reemplaza a `fecha_diligencia`, que es la que\ncorre los plazos: sirve para contrastarla.\n\nTrae coordenadas de un domicilio de terceros. Se entregan porque son lo que la plataforma\npublica y lo que hace útil el registro, con el mismo criterio que el RUT de los litigantes,\ny por eso mismo no se guardan en este repositorio.",
    "properties": {
      "existe": {
        "description": "Falso cuando la actuación ofrece georreferencia y el panel responde que no hay ninguna. Está medido: una de seis. En ese caso los demás campos vienen nulos, y eso NO es lo mismo que no haber preguntado.",
        "title": "Existe",
        "type": "boolean"
      },
      "latitud": {
        "anyOf": [
          {
            "type": "number"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Latitud, como la publica el sitio.",
        "title": "Latitud"
      },
      "longitud": {
        "anyOf": [
          {
            "type": "number"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Longitud, como la publica el sitio.",
        "title": "Longitud"
      },
      "precision_metros": {
        "anyOf": [
          {
            "type": "number"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Radio de incertidumbre en metros. Medidas en una sola causa: 6,0 · 10,04 · 26,68 · 56,22 y 103,13.\n\nInformarla SIEMPRE junto con las coordenadas. Un radio de 103 metros abarca una manzana entera en zona urbana, así que ahí la coordenada dice el sector y no la puerta, y presentarla como una dirección exacta es afirmar de más.",
        "title": "Precision Metros"
      },
      "fecha_dispositivo": {
        "anyOf": [
          {
            "format": "date",
            "type": "string"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Cuándo el aparato tomó la coordenada. Es la ÚNICA fecha del proyecto que viene con hora, y es una fuente independiente de las dos de la Historia.",
        "title": "Fecha Dispositivo"
      },
      "hora_dispositivo": {
        "anyOf": [
          {
            "format": "time",
            "type": "string"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "La hora de esa toma, que ninguna otra fecha del proyecto trae.",
        "title": "Hora Dispositivo"
      },
      "intentos": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Cuántas veces el aparato intentó fijar la posición, según el sitio. Sin medir qué significa un número alto.",
        "title": "Intentos"
      }
    },
    "required": [
      "existe"
    ],
    "title": "Georreferencia",
    "type": "object"
  },
  "annotations": {
    "read_only_hint": true,
    "destructive_hint": false,
    "idempotent_hint": true,
    "open_world_hint": true
  }
}

obtener_anexos_escrito

Los documentos que un escrito acompañó. Son un canal distinto del de la resolución.

Parámetro

Qué es

anexo_ruta

Lo entrega cada actuación, y se usa tal cual. Civil tiene dos paneles con parámetros distintos

anexo_referencia

Lo entrega cada actuación. Cuando viene nula, o el folio no ofrece anexos, o su panel no está medido

competencia

Sólo aquellas con al menos un panel verificado contra la plataforma

Importante

Un folio con documento puede tener otro escondido al lado La Historia publica dos columnas de documentos por folio: Doc. trae la resolución o el escrito, y Anexo los papeles que se acompañaron, que es donde suele estar la prueba documental. Un folio puede traer las dos cosas.

Por eso preguntar por los documentos de una causa mirando sólo Doc. devuelve una respuesta que parece completa: entrega un documento real y omite otro. Una fila en blanco se nota; un documento entregado, no.

Campo

Tipo

Qué es

folio

str | null

El folio de la actuación. Sólo el panel de escritos de laboral lo publica

fecha

date | null

La que publica el panel. No corre plazos: eso lo hace fecha_diligencia

descripcion

str

Qué es el documento, escrito por quien lo acompañó. En suprema sale de Observación del Documento

tipo

str | null

Cómo lo clasifica el sitio. Ej: “Anexo Escrito”. Sólo suprema

cantidad

str | null

Cuántos ejemplares declara. Sólo suprema

documento_fisico

str | null

Lo que suprema publica en Docto. Físico. Medido: “No Requerido”

documento_ruta

str | null

Con qué ruta se pide

documento_referencia

str | null

La referencia opaca con la que se pide

Un nulo significa que ese panel no publica la columna, no que el dato no exista: los cinco paneles medidos no comparten forma.

Entrega con qué pedir cada anexo, no el anexo: para traerlo se usa obtener_documento. Esa ruta de descarga se leyó del formulario de cada fila y no se ha ejecutado: lo medido es el panel que la nombra.

Cuesta una petición por folio, con su intervalo. Se pide del folio concreto que importa, nunca de barrido.

Un panel con encabezados y cero filas levanta un error. Es la diferencia con las notificaciones y las liquidaciones, donde la lista vacía es un estado real de la causa: este panel sólo se pide cuando la actuación ya dijo que hay anexos, así que la tabla vacía significa que la respuesta cambió, no que el escrito se haya acompañado sin documentos.

Esquema que entrega el protocolo

Generado desde el servidor al construir esta página, así que no puede quedar desactualizado respecto del código.

{
  "name": "obtener_anexos_escrito",
  "inputSchema": {
    "properties": {
      "anexo_ruta": {
        "description": "Lo entrega cada actuación en `anexo_ruta`, y se usa TAL CUAL. Una misma competencia abre paneles distintos según el trámite: civil tiene dos, con parámetros distintos.",
        "title": "Anexo Ruta",
        "type": "string"
      },
      "anexo_referencia": {
        "description": "Lo entrega cada actuación en `anexo_referencia`. Cuando esa viene nula, o el folio no ofrece anexos, o su panel no está medido.",
        "title": "Anexo Referencia",
        "type": "string"
      },
      "competencia": {
        "default": "civil",
        "description": "Una de: civil, laboral, suprema. Son aquellas cuya ruta de anexos está verificada contra la plataforma. Las demás publican la columna `Anexo` y su ruta no está medida, así que se rechazan por no verificadas.",
        "title": "Competencia",
        "type": "string"
      }
    },
    "required": [
      "anexo_ruta",
      "anexo_referencia"
    ],
    "title": "obtener_anexos_escritoArguments",
    "type": "object"
  },
  "outputSchema": {
    "$defs": {
      "Anexo": {
        "description": "Un documento que acompaña a un escrito, en el segundo canal del folio.\n\nEs lo que la columna `Anexo` de la Historia ofrece y hasta la versión 0.9.0 no se podía\npedir. No es una copia de lo que entrega `Doc.`: ahí va la resolución o el escrito, y acá\nlos papeles que se acompañaron, que es donde vive la prueba documental.\n\nQue el folio SÍ entregue un documento por el otro canal es lo que hacía invisible esta\nfalta: una respuesta con documento se lee como completa mucho mejor que una fila en blanco.\n\nLos campos que vienen en nulo dependen del panel: cada competencia publica columnas\ndistintas y no son las mismas cinco con otro nombre. Civil no publica folio, suprema no\npublica fecha y en cambio dice cuántos ejemplares hay y si el documento físico se exige.\nUn nulo significa que ESE panel no publica la columna, no que el dato no exista.",
        "properties": {
          "folio": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Folio de la causa al que pertenece el anexo, para volver a ubicarlo en la Historia. Sólo el panel de escritos de laboral lo publica.",
            "title": "Folio"
          },
          "fecha": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Fecha que el panel publica para el anexo, en ISO 8601. NO es una fecha de plazos: la que corre plazos es `fecha_diligencia` de la actuación.",
            "title": "Fecha"
          },
          "descripcion": {
            "default": "",
            "description": "Qué es el documento, escrito por quien lo acompañó. Ej: 'Pasajes aéreos'. Es texto libre, no una clasificación. Sale de la columna `Referencia`, y en suprema de `Observación del Documento`, que es la que cumple ese papel ahí.",
            "title": "Descripcion",
            "type": "string"
          },
          "tipo": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Cómo clasifica el sitio el documento. Ej: 'Anexo Escrito'. Sólo suprema publica la columna.",
            "title": "Tipo"
          },
          "cantidad": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Cuántos ejemplares declara el sitio, tal cual lo emite. Sólo suprema.",
            "title": "Cantidad"
          },
          "documento_fisico": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Lo que suprema publica en `Docto. Físico`, sin interpretar. Medido: 'No Requerido'. Sólo suprema publica la columna.",
            "title": "Documento Fisico"
          },
          "documento_ruta": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Qué ruta de la plataforma entrega este anexo. Sale del formulario de la fila, y esa ruta NO se ha ejecutado: lo medido es el panel que la nombra. NULO si la fila no trae formulario.",
            "title": "Documento Ruta"
          },
          "documento_referencia": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "La referencia opaca con la que se pide este anexo. Junto con `documento_ruta` es lo único que permite traerlo después.",
            "title": "Documento Referencia"
          }
        },
        "title": "Anexo",
        "type": "object"
      }
    },
    "properties": {
      "result": {
        "items": {
          "$ref": "#/$defs/Anexo"
        },
        "title": "Result",
        "type": "array"
      }
    },
    "required": [
      "result"
    ],
    "title": "obtener_anexos_escritoOutput",
    "type": "object"
  },
  "annotations": {
    "read_only_hint": true,
    "destructive_hint": false,
    "idempotent_hint": true,
    "open_world_hint": true
  }
}

listar_audios_audiencia

Qué audios de audiencia tiene la causa, y con qué enlace se bajan. No los trae.

Parámetro

Qué es

audio_referencia

Lo entrega obtener_detalle_causa. Cuando viene nula, la causa no ofrece grabación o su competencia no está medida

Importante

Entrega los enlaces, no el audio Un audio de audiencia son las voces de las partes, los testigos y el tribunal. Una transcripción automática no es lo mismo que oírlo, y no siempre se puede transcribir. Lo que corresponde es entregar los enlaces y decir qué tramo es cada uno, para que la persona baje el que necesita.

Campo

Tipo

Qué es

numero

str

El correlativo con que el sitio ordena los archivos

archivo

str

Nombre del archivo, tal cual. Trae el tramo al final, y a veces la hora

fecha

date | null

Lo que publica la columna Fecha. Medido: vacía en los once

descarga_url

str

Enlace directo, para abrir en el navegador

El audio viene troceado por acto procesal, no en una pista única: medidos once archivos para una sola audiencia preparatoria, del inicio al fin, pasando por el llamado a conciliación y los hechos a probar. El nombre de cada archivo es lo más útil que trae, porque la columna Fecha viene vacía en todos.

El nombre empieza con el RUC de la causa: repetirlo completo publica ese identificador, así que conviene nombrar el tramo y no el archivo entero.

Los enlaces caducan. Si uno deja de funcionar hay que volver a pedir el listado, no reintentar el mismo.

Sólo laboral está medida. Un listado sin filas levanta un error: sólo se pide cuando el detalle ofreció el enlace, así que cero filas significa que la respuesta cambió, no que la audiencia no se haya grabado.

Esquema que entrega el protocolo

Generado desde el servidor al construir esta página, así que no puede quedar desactualizado respecto del código.

{
  "name": "listar_audios_audiencia",
  "inputSchema": {
    "properties": {
      "audio_referencia": {
        "description": "Lo entrega `obtener_detalle_causa` en `audio_referencia`. Cuando esa viene nula, la causa no ofrece grabación o su competencia no está medida.",
        "title": "Audio Referencia",
        "type": "string"
      }
    },
    "required": [
      "audio_referencia"
    ],
    "title": "listar_audios_audienciaArguments",
    "type": "object"
  },
  "outputSchema": {
    "$defs": {
      "AudioAudiencia": {
        "description": "Un archivo de audio de una audiencia, tal como el sitio lo publica.\n\nRompe el supuesto de que todo lo descargable de la plataforma es PDF: acá el archivo es un\n`.mp3`. Este servidor NO lo trae: entrega qué hay y con qué enlace, para que quien lo\nnecesite lo baje y lo escuche. Un audio de audiencia son las voces de las partes, los\ntestigos y el tribunal, y transcribirlo automáticamente no es lo mismo que oírlo.\n\nEl audio viene TROCEADO por acto procesal, no en una pista única: el nombre de archivo dice\nde qué tramo es. Medido: once archivos para una sola audiencia preparatoria, del \"Inicio\" al\n\"Fin\", pasando por el llamado a conciliación y los hechos a probar.",
        "properties": {
          "numero": {
            "description": "El correlativo con que el sitio ordena los archivos.",
            "title": "Numero",
            "type": "string"
          },
          "archivo": {
            "description": "Nombre del archivo, tal cual. Trae el tramo de la audiencia al final, que es lo que dice de qué es la grabación. Ej: '...-05-Llamado a conciliacion.mp3'.\n\nEmpieza con el RUC de la causa, así que nombrarlo completo publica ese identificador.",
            "title": "Archivo",
            "type": "string"
          },
          "fecha": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Lo que el sitio publica en su columna `Fecha`. Medido: viene VACÍA en los once archivos, aunque la columna existe. La fecha de la audiencia hay que sacarla de la Historia o del propio nombre del archivo, no de acá.",
            "title": "Fecha"
          },
          "descarga_url": {
            "description": "Enlace directo al archivo, para abrirlo en un navegador. Este servidor no lo descarga.\n\nEl enlace lleva una referencia firmada que CADUCA: si deja de funcionar hay que volver a pedir el listado. Entregarlo tal cual al usuario es lo correcto; guardarlo para después, no.",
            "title": "Descarga Url",
            "type": "string"
          }
        },
        "required": [
          "numero",
          "archivo",
          "descarga_url"
        ],
        "title": "AudioAudiencia",
        "type": "object"
      }
    },
    "properties": {
      "result": {
        "items": {
          "$ref": "#/$defs/AudioAudiencia"
        },
        "title": "Result",
        "type": "array"
      }
    },
    "required": [
      "result"
    ],
    "title": "listar_audios_audienciaOutput",
    "type": "object"
  },
  "annotations": {
    "read_only_hint": true,
    "destructive_hint": false,
    "idempotent_hint": true,
    "open_world_hint": true
  }
}

obtener_documento

El archivo de una actuación: la resolución, el escrito, el certificado o el expediente entero.

Parámetro

Qué es

documento_ruta

Lo entrega cada actuación. Sólo se aceptan las rutas que la plataforma emite

documento_referencia

Lo entrega cada actuación. Identifica el documento

competencia

Bajo qué módulo cuelga la ruta. docCertificadoEscrito.php existe en tres

desde_pagina

Desde qué página entregar el texto, contando desde 1. Sólo hace falta cuando el texto completo no cabe en una respuesta

No pide el rol: la referencia ya identifica el documento, y buscar la causa antes serían dos peticiones que no verifican nada.

Nota

La referencia NO muere con la sesión Se emite al dibujar la página y el mismo documento llega con una distinta en cada render, así que no es la identidad estable del archivo. Pero es un token firmado y no un identificador de sesión: medido el 20 de agosto de 2026, sirve desde una sesión distinta de la que la emitió, así que el flujo normal, leer el detalle con una herramienta y pedir el documento con otra, funciona.

Cuánto dura no está medido. Pedir el documento cerca de leer la actuación sigue siendo lo prudente, y una referencia que la plataforma ya no acepte devuelve una página de error con HTTP 200, no un «no existe»: por eso se verifica que lo que llegó sea un PDF.

El texto del documento viaja con él

Si el PDF trae capa de texto, la respuesta lleva ese texto, página por página. Sale de la misma pasada que describe el archivo, o sea no cuesta una petición más: antes se extraía para contar cuántas páginas traían texto y después se tiraba.

El enlace no lo reemplaza. resources/read devuelve el PDF, no su texto, así que un cliente que lo lea recibe base64: sirve para guardar el archivo o para mirarlo, no para leerlo desde acá. Y el umbral de lo embebido queda por debajo de lo que la plataforma emite de verdad, así que sin el texto la respuesta de un documento real era su descripción y un puntero.

Cuando el texto no cabe en una respuesta no se manda un pedazo: se dice cuánto es y se pide por tramos con desde_pagina. Cada tramo termina diciendo hasta qué página llegó y con cuál seguir, y el último dice que ahí termina el documento. Una página que sola no cabe se corta y el corte se anuncia en el mismo texto.

El texto respeta la disposición de la hoja, no el orden del flujo del PDF. Medido contra documentos reales de la OJV, eso es lo que hace que el encabezado tabular de un acta de audiencia (etiqueta a la izquierda, valor a la derecha: quién es el denunciante, quién el denunciado, las horas) se lea correcto en vez de con las dos columnas mezcladas, que es como lo lee el modo por flujo. Conserva el texto rotado, que el modo descarta por defecto: un timbre al margen no puede perderse en silencio. El modo lo llama experimental la doc de pypdf; acá se midió, y lo paga con algo de inflación (más alta en los documentos más chicos, donde no muerde el presupuesto). Si falla en una página, cae al modo simple, que nunca entrega menos.

Cada página va rotulada con su número, que es lo que permite citarla. Las que no aportan texto se rotulan con avisos distintos, porque son cosas distintas: una imagen (un escaneo, trae imagen y no se le pasa OCR), una página en blanco (ni texto ni imagen, no hay nada que citar), y una que no se dejó leer (un error de lectura, del que no se sabe qué trae). Marcarlas igual afirmaría lo que no se midió.

Advertencia

El texto es contenido de un tercero Lo escribieron el tribunal y las partes, igual que los marcadores del archivo. Viaja con la advertencia de que se lee como dato y nunca como una instrucción.

Chico viaja entero, grande viaja como enlace

Un documento bajo el umbral viene completo en la respuesta. Uno grande viene como enlace, con su tamaño, y se lee con resources/read sólo si de verdad hace falta: el ebook es el expediente entero, y meterlo en la respuesta gasta el contexto de la conversación en algo que casi nunca se lee completo.

El umbral sale de la aritmética de base64, que son cuatro caracteres por cada tres bytes, con el techo de una respuesta de texto. Deja el enlace como caso normal y lo embebido como excepción, que es el lado barato de equivocarse.

No es una elección de comodidad: 18.750 bytes en base64 son exactamente 25.000 caracteres, o sea una respuesta entera. Un documento justo en el límite se come el presupuesto completo y deja cero para el índice, el texto y la advertencia de que el contenido es de un tercero. Por eso el tope va sobre la respuesta y no sobre cada pieza por separado: dos topes que se cumplen cada uno por su lado suman uno que no se cumple.

Un escaneo se declara y NO se transcribe

Si el PDF no trae capa de texto es una imagen, y eso se dice. No se le pasa OCR: una transcripción automática de una resolución se ve idéntica a la resolución y no lo es, y eso es peor que una lista vacía, porque la lista vacía se nota.

Y un documento mixto se declara mixto. Un expediente que agrega anexos escaneados a resoluciones digitales es lo normal, y decir «trae capa de texto» a secas haría dar por transcribible un archivo del que una parte son imágenes: paginas_con_texto dice cuántas, y lo que dicen las otras no se puede citar desde acá.

Y una página que no se deja leer no cuesta el archivo entero: se cuenta en paginas_ilegibles y el resto se describe igual. No se cuenta como página sin texto, porque eso convertiría un error de lectura en la afirmación de que ahí hay una imagen.

Una página sin texto se separa además en escaneo y hoja en blanco: la que trae imagen es un escaneo que hay que abrir, y la que no trae ninguna está en blanco y no tiene nada que citar. Lo distingue page.images, de la misma pasada. Marcar las dos como «imagen» mandaría a abrir una hoja vacía.

Por lo mismo, si NINGUNA de las páginas leídas trajo texto y alguna falló, capa_de_texto queda en nulo y no en falso: falso significa escaneo, que es una afirmación sobre todas las páginas, y de las que fallaron no se sabe. Verdadero, en cambio, se sostiene con una sola: se vio texto, y que otra haya fallado no lo desmiente.

Si el archivo no se puede abrir, la capa de texto queda nula y no falsa: no saber si tiene texto no es lo mismo que saber que no tiene. problema_al_leer separa dos casos que no son el mismo problema: a uno cifrado le falta una contraseña que este servidor no tiene, y uno truncado o mal formado no se abre con ninguna. Que esté cifrado es lo medido, y no que haya llegado entero: los dos defectos pueden venir juntos.

El índice sale de la misma lectura

Describir el PDF ya obligaba a recorrer sus páginas. De esa pasada salen, sin una petición más:

Campo

Qué es

rangos_con_texto

CUÁLES páginas traen texto, por tramos y contando desde 1: ["1-40", "57"]. Lista vacía es «ninguna»; nulo es «no se pudo abrir»

rangos_hasta_pagina

Hasta qué página alcanza esa lista. Menor que paginas significa que se cortó, y de ahí en adelante no se dice nada

rangos_omitidos

Cuántos tramos quedaron sin enumerar

marcadores

El índice que trae el archivo: titulo y pagina. Lista vacía es «no trae»; nulo es «no se pudo leer»

marcadores_omitidos

Cuántos quedaron fuera, por cantidad o por profundidad

tamano_primera_pagina

Cuánto mide, en centímetros

paginas_de_otro_tamano

Cuántas de las demás miden distinto

fecha_creacion

Cuándo dice el archivo que se creó (ISO 8601). Proxy de la firma. Nulo si no la trae

fecha_modificacion

Cuándo dice el archivo que se modificó. Mismo carácter

fecha_creacion y fecha_modificacion salen de la metadata del PDF, así que son dato de un tercero y no fecha oficial: sirven para contrastar contra fecha_diligencia, nunca para reemplazarla. El resumen lo dice cada vez que la trae.

Los tramos van por rangos y no por lista de números porque el índice tiene que ser de tamaño constante: «1 a 40 con texto» son dos entradas para doscientas páginas y siguen siendo dos para tres mil. Se enumeran hasta 20 tramos y hasta 20 marcadores, bajando 2 niveles, con los títulos recortados a 80 caracteres.

Al llegar a cualquiera de esos topes se dice que se cortó y hasta dónde alcanzó. paginas y paginas_con_texto siguen cubriendo el documento entero, así que los totales no cambian: lo que se acota es la enumeración, no la cuenta.

Advertencia

Los marcadores son contenido de un tercero Los títulos los escribe quien creó el PDF, que puede ser la contraparte: entran por un canal que parece metadato del archivo y no lo es. Viajan delimitados y con la advertencia de que se leen como datos y no como instrucciones, en una sola línea y recortados.

El recurso pjud://documento

Es el otro extremo del enlace. Leerlo vuelve a consultar al Poder Judicial, con su intervalo: no hay copia guardada de nada, que es la regla 5 del proyecto.

Su argumento competencia tiene completado. completion/complete sobre la plantilla pjud://documento{?competencia,ruta,referencia} devuelve las competencias cuyo detalle publica documentos, acotadas por lo que se lleve escrito; penal no aparece, porque no publica ninguno. Los otros dos argumentos no se completan: salen de la actuación que se leyó.

Esquema que entrega el protocolo

Generado desde el servidor al construir esta página, así que no puede quedar desactualizado respecto del código.

{
  "name": "obtener_documento",
  "inputSchema": {
    "properties": {
      "documento_ruta": {
        "description": "El campo `documento_ruta` de la actuación, tal cual. Sólo se aceptan las rutas que el detalle de cada competencia emite: apelaciones (anexoDocRecursoApelaciones.php, docCausaApelaciones.php, newebookapelaciones.php); civil (anexoDocCivil.php, docCertificadoDemanda.php, docCertificadoEscrito.php, docu.php, docuN.php, docuS.php, newebookcivil.php); cobranza (docCertificadoEscrito.php, docDemandaCobranza.php, docLiquidacionCobranza.php, docOficioCobranza.php, docuCobranza.php, newebookcobranza.php); laboral (docAnexoLaboral.php, docCertificadoDemanda.php, docCertificadoEscrito.php, docDiligenciaIdaLaboral.php, docDiligenciaVueltaLaboral.php, docReformadoEscritoLaboral.php, docReformadoLaboral.php, newebooklaboral.php); suprema (docCausaSuprema.php, docEscritosSuprema.php, newebooksuprema.php). Una ruta libre convertiría esto en un proxy contra cualquier página del sitio y por eso se rechaza.\n\nCuando la actuación trae `documento_ruta` en nulo, el sitio abre ese documento con un modal de JavaScript y a qué endpoint llama no está medido: ese documento todavía no se puede pedir, y no hay ruta que inventarle.",
        "title": "Documento Ruta",
        "type": "string"
      },
      "documento_referencia": {
        "description": "El campo `documento_referencia` de la actuación, tal cual. CADUCA: su JWT declara durar 60 minutos. La plataforma la emite al dibujar el detalle y es un token firmado, no un identificador de sesión: está medido que sirve desde otra sesión. Una guardada de antes no devuelve 'no existe', devuelve otra cosa. Si la herramienta responde que lo recibido no es un PDF, volver a pedir el detalle de la causa y usar la referencia nueva.",
        "title": "Documento Referencia",
        "type": "string"
      },
      "competencia": {
        "default": "civil",
        "description": "Una de: apelaciones, civil, cobranza, laboral, suprema. Son aquellas cuyo detalle publica documentos descargables. La competencia elige bajo qué módulo del sitio cuelga la ruta, así que tiene que ser la MISMA con que se leyó la actuación.",
        "title": "Competencia",
        "type": "string"
      },
      "desde_pagina": {
        "anyOf": [
          {
            "minimum": 1,
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Desde qué página entregar el texto, contando desde 1. Sólo hace falta cuando el texto completo no cabe en una respuesta: ahí la herramienta lo dice y con esto se pide por tramos. La respuesta indica con qué página seguir.",
        "title": "Desde Pagina"
      }
    },
    "required": [
      "documento_ruta",
      "documento_referencia"
    ],
    "title": "obtener_documentoArguments",
    "type": "object"
  },
  "outputSchema": null,
  "annotations": {
    "read_only_hint": true,
    "destructive_hint": false,
    "idempotent_hint": true,
    "open_world_hint": true
  }
}

buscar_jurisprudencia

Sentencias de la Corte Suprema desde el Buscador Unificado de Fallos. Sirve sobre todo para verificar que una cita existe antes de usarla: con rol y anio devuelve la sentencia con su caratulado, sala, fecha, ministros y enlace permanente.

Parámetro

Tipo

Descripción

rol

int, opcional

Rol de la causa en el buscador elegido, sin el año

anio

int, opcional

Año del rol

todas

str, opcional

Texto libre: deben aparecer todas estas palabras

literal

str, opcional

Frase exacta

excluir

str, opcional

Palabras que no deben aparecer

desde / hasta

str, opcional

Rango de fechas, AAAA-MM-DD. Es el formato que el buscador acepta: medido, con DD/MM/AAAA responde un error de Solr y ninguna sentencia

filas

int

Cuántas traer, de 1 a 250

desplazamiento

int

Desde qué coincidencia empezar. Cero es la primera; para la siguiente página, desplazamiento + filas

buscador

str

suprema, apelaciones, laborales, civiles, cobranza, familia o salud

facetas

dict, opcional

Con qué acotar: nombre de faceta a los valores que se aceptan

Exige al menos un criterio: sin ninguno el buscador devuelve el índice entero, y eso no es una búsqueda.

Advertencia

Un valor de faceta que no calza no da error: devuelve cero resultados.

El rol de una Corte de Apelaciones no es único a nivel nacional. Medido el 25 de agosto de 2026, 2476-2023 devuelve 13 sentencias de cinco cortes distintas, y con facetas={"corte_origen": ["C.A. de Santiago"]} quedan 7. Eso es lo que hace alcanzable una cita que de otro modo hay que buscar a mano entre decenas.

Los valores hay que copiarlos de facetas de una búsqueda sin filtrar, porque la plataforma los publica con su propia ortografía: en esa misma respuesta conviven C.A. de Valparaiso sin tilde y un libro escrito PROTECCIN. Un valor tecleado de memoria devuelve la lista vacía, que se leería como que la sentencia no existe; por eso el cliente se detiene con un error cuando una búsqueda con facetas no devuelve nada.

Cada buscador declara las suyas y pedir una que no declara falla antes de consultar. Salen de campos_facetas, que cada página del buscador publica:

Buscador

Facetas que se exponen

suprema

comuna, corte de origen, libro, ministros, norma, redactor, resultado, sala, tipo de recurso

apelaciones

corte de origen, libro, materia, sala, tipo de recurso, tribunal

salud

corte de origen, organismo, resultado, temática

civiles, familia, laborales

juez, materia, tribunal

cobranza

juez, tribunal

Dos que la plataforma declara y este servidor no expone: enfermedad y medicamento, del buscador de salud. Un desglose acotado a un rol publica de qué está enferma y qué toma la persona que recurrió, que es el mismo criterio por el que no se exponen los buscadores penales ni el compendio de extranjería. Tampoco se expone la de fecha: sus valores son marcas de tiempo y para eso están desde y hasta.

Las cuentas son de la consulta, no del índice, y no se suman: una sentencia puede caer en más de un valor de la misma faceta. Medido en laborales, materia reparte 228 apariciones sobre 88 sentencias.

Advertencia

ocultas sólo tiene significado en suprema, y está medido.

Buscador

Rol que existe

Rol imposible

Qué cuenta

suprema

2 y 2

0 y 0

la consulta

laborales

8 y 269.264

0 y 269.264

el índice completo

En laborales el número que la plataforma entrega es el tamaño del corpus, así que la diferencia contra lo visible no son coincidencias reservadas. Informar 269.256 ocultas para una consulta que encontró 8 haría ver cada resultado como una fracción de un universo oculto que no existe, así que ahí ocultas y coincidencias vienen en nulo.

Nulo no es cero. Cero significa «no hay nada reservado»; nulo significa «en este buscador no se puede saber», y entonces un resultado vacío puede igual corresponder a algo reservado. apelaciones está en nulo por MEDICIÓN: el 17 de agosto de 2026 devolvió el mismo número para un rol que existe y para uno imposible, o sea cuenta el corpus y no la consulta. Los cuatro intentos anteriores habían muerto por timeout, y el timeout era nuestro.

Advertencia

En suprema, el resultado trae ocultas: cuántas coincidencias existen y no se entregan a una consulta anónima. Medido el 16 de agosto de 2026 sin filtros, el buscador declaraba 1.223.925 coincidencias y entregaba 300.005.

Si ocultas es mayor que cero, la lista es un subconjunto. No se puede afirmar que algo no existe porque no aparezca, y condiciones_de_publicacion desglosa todas las coincidencias por su condición (Excluido salud, Anonimizadas, Reservado restringido, Publicable, entre otras). Ese desglose suma coincidencias, no ocultas: incluye a las visibles. El buscador no publica su regla de visibilidad, así que no se puede decir qué categorías componen las que faltan.

El propio sitio dejó de mostrar ese aviso: los dos mensajes que lo decían siguen en su JavaScript, comentados.

Campos de la respuesta

sentencias, más seis campos de completitud (visibles, coincidencias, ocultas, desplazamiento, no_entregadas y condiciones_de_publicacion) y facetas, el desglose de esas mismas coincidencias por cada faceta que el buscador declara.

ocultas en cero no significa que la lista esté completa. Son dos recortes distintos y hay que mirar los dos: ocultas son las coincidencias que la plataforma reserva a una consulta anónima, y no_entregadas son las visibles que esta llamada no trajo porque filas acota cuántas se piden. Una búsqueda con 400 visibles y filas en 10 devuelve diez sentencias, ocultas en cero y no_entregadas en 390.

no_entregadas es además la única señal de recorte que funciona en todos: ocultas sólo trae número en uno de los siete buscadores expuestos, suprema, y en los otros seis viene en nulo.

Importante

no_entregadas mayor que cero ahora se puede resolver Se vuelve a llamar con desplazamiento en desplazamiento + filas, hasta que llegue a cero. no_entregadas cuenta lo que queda después de esta página, así que baja sola a medida que se avanza.

Medido el 22 de agosto de 2026 contra el buscador de Corte Suprema: con desplazamiento 0, 10 y 250, tres páginas sin una sola sentencia repetida. Hasta esa medición el desplazamiento iba fijo en cero y la coincidencia 251 era inalcanzable.

Pedir más allá de visibles devuelve una lista vacía con HTTP 200, no un error: una página vacía significa que se pasó del final, no que no haya coincidencias. Y cada página cuesta una petición con su intervalo, así que se recorre lo que hace falta y no el índice entero.

coincidencias es lo que el buscador declara antes de aplicar su filtro de condición de publicación. No es el tamaño del índice: el Poder Judicial habla públicamente de más de un millón y medio de sentencias, y esa diferencia no está explicada.

Cada sentencia trae rol, caratulado, fecha_sentencia (ISO 8601), sala, tipo_recurso, resultado_recurso, corte_origen, rol_corte_apelaciones, redactor, ministros, condicion_publicacion, anonimizada y url.

No trae el texto completo del fallo. La respuesta del buscador lo incluye, pero diez sentencias serían megabytes con nombres y cédulas de personas naturales: se entrega el enlace permanente y quien lo necesite entra.

Están verificados diez de los diez buscadores y se exponen siete: suprema, apelaciones, laborales, civiles, cobranza, familia y salud. El de penales se midió y queda fuera por decisión, por lo mismo que el detalle de las causas penales: sus caratulados llegan con el nombre del imputado cuando el fallo no está anonimizado. Se eligen con el parámetro buscador.

Cada uno declara sus propios campos, y ésa es la razón de que esto sea una tabla y no un parser por buscador: Corte Suprema identifica sus sentencias con rol_era_sup_s y Apelaciones con rol_era_ape_s, así que un cliente que asumiera los campos del primero devolvería el rol vacío en el segundo sin que nada reviente. En laborales el origen es un juzgado y no una corte, así que corte_origen trae el juzgado.

Los siete restantes se rechazan en vez de adivinar sus campos.

Advertencia

En laborales el rol que el buscador publica no lleva la letra del tipo de causa. Medido: pedir el rol 364 del año 2020 devuelve O-364-2020 aunque lo buscado sea T-364-2020, que es otra causa. Una respuesta con el mismo número no prueba que sea la misma causa: hay que comparar el caratulado.

Es el falso positivo simétrico del que motivó el proyecto. Acá no es que falte un dato: es que sobra uno que parece el correcto.

Esquema que entrega el protocolo

Generado desde el servidor al construir esta página, así que no puede quedar desactualizado respecto del código.

{
  "name": "buscar_jurisprudencia",
  "inputSchema": {
    "properties": {
      "rol": {
        "anyOf": [
          {
            "minimum": 1,
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Rol de la causa en el buscador elegido, sin el año.",
        "title": "Rol"
      },
      "anio": {
        "anyOf": [
          {
            "maximum": 2100,
            "minimum": 1900,
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Año del rol.",
        "title": "Anio"
      },
      "todas": {
        "default": "",
        "description": "Texto libre: deben aparecer todas estas palabras.",
        "title": "Todas",
        "type": "string"
      },
      "literal": {
        "default": "",
        "description": "Frase exacta.",
        "title": "Literal",
        "type": "string"
      },
      "excluir": {
        "default": "",
        "description": "Palabras que NO deben aparecer.",
        "title": "Excluir",
        "type": "string"
      },
      "desde": {
        "default": "",
        "description": "Fecha inicial, AAAA-MM-DD. Es el formato que el buscador acepta: medido, con DD/MM/AAAA responde un error y ninguna sentencia.",
        "title": "Desde",
        "type": "string"
      },
      "hasta": {
        "default": "",
        "description": "Fecha final, AAAA-MM-DD, igual que `desde`.",
        "title": "Hasta",
        "type": "string"
      },
      "filas": {
        "default": 10,
        "description": "Cuántas sentencias traer.",
        "maximum": 250,
        "minimum": 1,
        "title": "Filas",
        "type": "integer"
      },
      "desplazamiento": {
        "default": 0,
        "description": "Desde qué coincidencia empezar. Cero es la primera. Para la página siguiente: `desplazamiento + filas`.\n\nPedir más allá de `visibles` devuelve una lista VACÍA, no un error, así que una página vacía acá significa que se pasó del final y no que no haya coincidencias.",
        "minimum": 0,
        "title": "Desplazamiento",
        "type": "integer"
      },
      "facetas": {
        "anyOf": [
          {
            "additionalProperties": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "type": "object"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Con qué acotar, de nombre de faceta a los valores que se aceptan. Los valores hay que COPIARLOS de `facetas` de ESTA MISMA búsqueda sin filtrar, no de otra: el mismo campo publica valores que conviven y sólo aparecen si algo los trae ('ACOGE,UNIFICACIÓN DE JURISPRUDENCIA' y el mismo con '(M)' son dos valores distintos). Y con su ortografía: 'C.A. de Valparaiso' sin tilde, un libro como 'PROTECCIN'.\n\nUn valor que no calza no da error EN LA PLATAFORMA, devuelve cero: por eso esta herramienta se detiene en vez de entregar la lista vacía, que se leería como que la sentencia no existe. 'SIN INFORMACION' es un valor más y filtra igual. Cada buscador declara sus facetas y pedir una que no declara falla antes de buscar.",
        "title": "Facetas"
      },
      "buscador": {
        "default": "suprema",
        "description": "Cuál de los buscadores de fallos consultar. Se aceptan: apelaciones, civiles, cobranza, familia, laborales, salud, suprema. En `laborales` el origen es un juzgado y no una corte.",
        "title": "Buscador",
        "type": "string"
      }
    },
    "title": "buscar_jurisprudenciaArguments",
    "type": "object"
  },
  "outputSchema": {
    "$defs": {
      "Sentencia": {
        "description": "Una sentencia del buscador de fallos.\n\nMetadatos de cita, no el texto completo: una búsqueda de diez sentencias devolvería\nmegabytes de texto con nombres y cédulas de personas naturales. El texto se lee\nentrando por `url`.",
        "properties": {
          "rol": {
            "description": "Rol y año en el buscador consultado. Ej: 34546-2025.",
            "title": "Rol",
            "type": "string"
          },
          "caratulado": {
            "title": "Caratulado",
            "type": "string"
          },
          "fecha_sentencia": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Fecha de la sentencia, ISO 8601.",
            "title": "Fecha Sentencia"
          },
          "sala": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Sala que la dictó. NULO: este buscador no publica el campo.",
            "title": "Sala"
          },
          "tipo_recurso": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Tipo de recurso. NULO: este buscador no publica el campo.",
            "title": "Tipo Recurso"
          },
          "resultado_recurso": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cómo se resolvió. NULO: este buscador no publica el campo.",
            "title": "Resultado Recurso"
          },
          "corte_origen": {
            "description": "Corte de Apelaciones de origen.",
            "title": "Corte Origen",
            "type": "string"
          },
          "rol_corte_apelaciones": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rol ante la corte de origen. NULO: no consta acá, sea porque este buscador no publica el campo o porque la sentencia no lo trae.",
            "title": "Rol Corte Apelaciones"
          },
          "redactor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Quien redactó. NULO: este buscador no publica el campo.",
            "title": "Redactor"
          },
          "ministros": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "description": "Quienes firmaron. NULO: este buscador no publica el campo. Una lista VACÍA diría que no firmó nadie, y eso no lo dice ningún buscador.",
            "title": "Ministros"
          },
          "condicion_publicacion": {
            "description": "Cómo está publicada. Determina si el texto se ve completo, anonimizado o no se ve.",
            "title": "Condicion Publicacion",
            "type": "string"
          },
          "anonimizada": {
            "description": "Si el texto publicado viene anonimizado.",
            "title": "Anonimizada",
            "type": "boolean"
          },
          "url": {
            "description": "Enlace permanente a la sentencia en el buscador.",
            "title": "Url",
            "type": "string"
          },
          "palabras": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Extensión del fallo en palabras, según el buscador.",
            "title": "Palabras"
          },
          "paginas": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Extensión en páginas.",
            "title": "Paginas"
          },
          "texto_preview": {
            "default": "",
            "description": "Primeras líneas del fallo, tal como el buscador las entrega para la lista de resultados. Sirve para decidir si vale pedir el texto completo, que es dos órdenes de magnitud más grande.",
            "title": "Texto Preview",
            "type": "string"
          }
        },
        "required": [
          "rol",
          "caratulado",
          "fecha_sentencia",
          "sala",
          "tipo_recurso",
          "resultado_recurso",
          "corte_origen",
          "rol_corte_apelaciones",
          "redactor",
          "ministros",
          "condicion_publicacion",
          "anonimizada",
          "url"
        ],
        "title": "Sentencia",
        "type": "object"
      }
    },
    "description": "Resultado de una búsqueda, con lo que quedó fuera declarado.\n\n`ocultas` no es una advertencia: es la diferencia entre lo que el buscador dice que\ncoincide y lo que una consulta anónima puede ver.",
    "properties": {
      "sentencias": {
        "items": {
          "$ref": "#/$defs/Sentencia"
        },
        "title": "Sentencias",
        "type": "array"
      },
      "visibles": {
        "description": "Cuántas coincidencias son visibles para esta consulta.",
        "title": "Visibles",
        "type": "integer"
      },
      "coincidencias": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "description": "Cuántas coincidencias declara el buscador ANTES de aplicar el filtro de condición de publicación. Nulo cuando ese número, en este buscador, cuenta el corpus entero y no la consulta: informarlo entonces sería dar por medido algo que no lo es.",
        "title": "Coincidencias"
      },
      "ocultas": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ],
        "description": "Coincidencias que existen y NO se entregan. Si es mayor que cero, la lista es un subconjunto: no se puede afirmar que no exista lo que no aparece.\n\nNULO significa que en este buscador no se puede saber, porque el número que la plataforma entrega cuenta el índice completo. Nulo NO significa cero: significa que la pregunta no tiene respuesta acá, y un resultado sin coincidencias puede igual corresponder a algo reservado.",
        "title": "Ocultas"
      },
      "desplazamiento": {
        "default": 0,
        "description": "Desde qué coincidencia empieza esta página. Cero es la primera.\n\nSirve para pedir la siguiente: `desplazamiento + filas`. Medido el 22 de agosto de 2026: pedir más allá de `visibles` devuelve una página VACÍA con 200, no un error.",
        "title": "Desplazamiento",
        "type": "integer"
      },
      "no_entregadas": {
        "description": "Coincidencias visibles que esta llamada NO trajo: las que quedan DESPUÉS de esta página, contando desde `desplazamiento`. Si es mayor que cero, la lista es un subconjunto de lo visible y se puede pedir el resto.\n\nEs distinto de `ocultas`, y hay que mirar los dos: `ocultas` son las que la plataforma reserva, `no_entregadas` son las que sí se podrían ver y no se pidieron. Un resultado con `ocultas` en cero puede igual estar recortado.",
        "title": "No Entregadas",
        "type": "integer"
      },
      "condiciones_de_publicacion": {
        "anyOf": [
          {
            "additionalProperties": {
              "type": "integer"
            },
            "type": "object"
          },
          {
            "type": "null"
          }
        ],
        "description": "Desglose de TODAS las coincidencias por condición de publicación, visibles incluidas. Suma `coincidencias`, no `ocultas`: la categoría 'Publicable' son justamente las que sí se entregan. Sirve para ver de qué está hecho el universo (anonimizadas, reservadas, excluidas de salud), no para saber cuáles faltan: el buscador no publica la regla de visibilidad, así que no se puede decir qué categorías componen `ocultas`.\n\nNULO donde ese desglose cuenta el índice completo y no la consulta, que son los mismos buscadores en que `coincidencias` viene en nulo: ahí sumaría millones para una búsqueda de decenas.",
        "title": "Condiciones De Publicacion"
      },
      "facetas": {
        "anyOf": [
          {
            "additionalProperties": {
              "additionalProperties": {
                "type": "integer"
              },
              "type": "object"
            },
            "type": "object"
          },
          {
            "type": "null"
          }
        ],
        "default": null,
        "description": "Cómo se reparten ESTAS coincidencias, por cada faceta que el buscador declara. Sirve para dos cosas: ver si un rol se repite entre cortes o libros antes de leer nada, y sacar el valor EXACTO con que filtrar en `facetas`, que hay que copiar tal cual.\n\nLas cuentas son de la consulta, no del índice. NO se suman: una sentencia puede aparecer en más de un valor de la misma faceta, y está medido que `materia` suma 228 sobre 88 sentencias.",
        "title": "Facetas"
      }
    },
    "required": [
      "sentencias",
      "visibles",
      "coincidencias",
      "ocultas",
      "no_entregadas",
      "condiciones_de_publicacion"
    ],
    "title": "ResultadoJurisprudencia",
    "type": "object"
  },
  "annotations": {
    "read_only_hint": true,
    "destructive_hint": false,
    "idempotent_hint": true,
    "open_world_hint": true
  }
}

obtener_texto_sentencia

El texto completo de una sentencia, de una en una.

Parámetro

Tipo

Descripción

rol

int

Rol de la sentencia, sin el año

anio

int

Año del rol

buscador

str

suprema, apelaciones, laborales, civiles, cobranza, familia o salud

cual

int, opcional

Cuál de las sentencias del rol, empezando en 1. Sólo hace falta cuando el rol trae más de una

Advertencia

Un rol puede tener más de una sentencia, y la equivocada se ve igual de válida.

Medido en suprema, rol 1933-2025: la de casación en el fondo son 3.646 palabras y trae el razonamiento; la de reemplazo son 157 palabras y sólo confirma. Antes esta herramienta entregaba la que el buscador pusiera primero, y devolvió la de reemplazo, de 157 palabras, sin decir que existía otra.

Y no siempre son dos: el rol 1504-2019 de apelaciones trae tres, medido. Cuando pasan de 10, el mensaje enumera las primeras y dice cuántas quedan fuera.

Ahora se detiene, las enumera con su resultado y su extensión, y hay que elegir con cual. Es la misma decisión que en el detalle de causa ante dos causas homónimas: entregar una se vería perfectamente bien.

Está separado de la búsqueda a propósito, y la razón es de tamaño: una sentencia de trece páginas son unos 25.000 caracteres, medido. Devolver diez con cada búsqueda serían 250.000. La búsqueda entrega texto_preview, más la extensión en palabras y páginas, que suele bastar para decidir si vale pedir el resto.

Advertencia

El texto trae los nombres de quienes fueron parte, y cuando el fallo no está anonimizado también sus cédulas.

anonimizada dice si lo entregado es la versión con los datos suprimidos por el propio tribunal, y fuente dice cuál de los dos campos del buscador se leyó (texto_sentencia o texto_sentencia_anon). Se informan las dos cosas para que quien lea sepa qué está leyendo.

Campos de la respuesta

rol, anonimizada, fuente, palabras, paginas y texto.

Si la sentencia existe en el índice pero está reservada para consultas anónimas, se levanta PlataformaRechaza con el número de coincidencias reservadas, en vez de devolver un texto vacío. Distinguir «existe y no se publica» de «no existe» es el punto.

Plantillas

Además de las herramientas, el servidor expone plantillas por prompts/list (prompts en el protocolo). No las llama el modelo: las invoca la persona desde su cliente, donde aparecen como comandos. Lo que devuelven es texto que entra a la conversación, y la consulta al Poder Judicial la hace después la herramienta que cada plantilla nombra, con su ritmo.

Los argumentos viajan como texto. Los que no son obligatorios se pueden omitir: cuando falta el código que identifica la causa, la plantilla dice con qué resolverlo antes de abrirla.

Los que aceptan un conjunto cerrado tienen completado por completion/complete, acotado por lo que se lleve escrito: competencia en computar-plazo y en revisar-causa, y buscador en verificar-cita. Cada plantilla ofrece las suyas y no la unión, porque las competencias que publican al ministro de fe no son las mismas que tienen panel del detalle. tipo no se completa: sus valores dependen de la competencia elegida, así que la única lista honesta es la que ya la tiene.

computar-plazo

Manda a pedir obtener_actuaciones_receptor y a presentar cada actuación con fecha_diligencia y fecha_registro separadas, más discrepancia_fechas cuando las dos fuentes del sitio no coinciden. Enumera qué queda fuera de esa lectura. No hace la cuenta de días hábiles: entrega la fecha desde la que se cuenta.

Argumento

Obligatorio

Qué es

tipo

sí

Letra del rol en civil, cobranza y laboral; el libro en apelaciones, el código del libro en penal, o VACÍO en suprema

rol

sí

Número del rol, sin la letra ni el año

anio

sí

Año del rol

competencia

no

Sólo las que publican al ministro de fe en la Historia. Por defecto civil

tribunal

no

Código del tribunal, donde la competencia lo usa

corte

no

Código de la corte, donde la competencia la usa

revisar-causa

Manda a pedir obtener_detalle_causa y a enumerar panel por panel cuál trajo datos, cuál vino vacío y cuál vino en NULO porque esa competencia no lo publica. Avisa si hay exhortos, o sea si parte de la tramitación ocurre en otro expediente.

Argumento

Obligatorio

Qué es

tipo

sí

Letra del rol en civil, cobranza y laboral; el libro en apelaciones, el código del libro en penal, o VACÍO en suprema

rol

sí

Número del rol, sin la letra ni el año

anio

sí

Año del rol

competencia

no

Sólo las que tienen al menos un panel del detalle medido. Por defecto civil

tribunal

no

Código del tribunal, donde la competencia lo usa

corte

no

Código de la corte, donde la competencia la usa

verificar-cita

Manda a pedir buscar_jurisprudencia por rol y a informar ocultas y no_entregadas, las dos cuentas de completitud. Que la búsqueda no devuelva la sentencia no se informa como que la sentencia no exista.

Argumento

Obligatorio

Qué es

rol

sí

Rol de la sentencia citada, sin el año

anio

sí

Año del rol

buscador

no

Cuál de los buscadores de fallos consultar. Por defecto suprema

literal

no

Una frase textual de la cita, para contrastarla contra el texto del fallo

Errores

Excepción

Qué significa

Qué hacer

PjudBloqueado

403 o 429 (rechazo), o consultaUnificada.php sin el prefijo de rutas o el token

Si es 403 o 429: detenerse, revisar si la IP quedó bloqueada. Si es por el prefijo o el token: puede ser un cambio de estructura o una caída transitoria, reintentar más tarde y si persiste, reportar

PlataformaRechaza

La plataforma rechazó la consulta por sus propias reglas

El mensaje es el suyo, textual. Corregir los parámetros

ValueError sobre campos

Faltan campos que la plataforma exige

Se detecta antes de consultar, sin gastar una petición

EstructuraInesperada

El HTML no tiene la forma esperada, o un 404 en una ruta construida

La plataforma cambió, o una caída transitoria del host: si otras consultas al mismo host fallan, reintentar; si sólo ésta, reportar

ValueError

Competencia o buscador no verificado, o falta MCP_PJUD_CONTACTO

Corregir la llamada o la configuración

CausaNoEncontrada

La búsqueda no dio con la causa que se pidió

Revisar rol, año, competencia y el código del tribunal o la corte. No es que la causa no tenga actuaciones: para eso la lista vacía

ResultadosTruncados

La búsqueda excedió el tope de páginas

Hay más resultados de los que caben. Acotar la búsqueda o subir paginas, nunca informar que no se encontró nada

PjudNoRespondio

La petición salió y no volvió en el tiempo de espera

La plataforma puede estar lenta. Se puede reintentar más tarde, respetando el intervalo. No es que la causa no exista

PlataformaNoDisponible

La plataforma respondió 5xx

Error suyo, no de la consulta. Se reintenta más tarde, respetando el intervalo

Todas llegan con su mensaje. El servidor envuelve cada herramienta y cada recurso para que así sea: desde mcp 2.1 el SDK sólo propaga el texto de las excepciones que él anticipa y reemplaza el del resto por Error executing tool <nombre>, que le diría al cliente que algo falló y no qué. El resultado sigue viajando con is_error: true, o sea el cliente ve el error en vez de una lista vacía que parecería decir «no hubo actuaciones».

Las tres que describen un fallo de la consulta y no un rechazo (PjudNoRespondio, PlataformaNoDisponible y el EstructuraInesperada de un código HTTP inesperado) dicen textualmente que no significa que la causa no exista. Sin esa frase, un timeout llegaba como Error executing tool listar_cortes: timed out y se resumía como que no hay resultados.