---
title: "Convivencia educativa"
description: "El canal de denuncias del art. 16 E e), el expediente de convivencia con reloj legal, la expulsión con cuatro ojos, las constancias del reglamento, el ciclo participativo y el registro de revisiones, por API."
url: "https://docs.edugoverna.com/api-organizacion/convivencia"
---
# Convivencia educativa

La **Ley 21.809** reescribió el Párrafo 3° del DFL 2/2009: desde el 1 de julio de 2026 todo establecimiento con reconocimiento oficial debe tener un **canal seguro y confidencial de denuncias con reserva de identidad**, tramitar los casos con plazos verificables, dejar constancia de la entrega del reglamento a cada apoderado y actualizar participativamente su plan cada cuatro años. Los arts. 16 D a 16 H son exigibles el **1 de abril de 2027**. {{ className: 'lead' }}

<Note>
  Dos módulos. El **canal de denuncias** (`convivencia_channel`) viene en
  **todos los planes**: es deber legal de cada colegio. El **expediente**
  (`convivencia`) se contrata como complemento y se habilita por organización.
  Sin él, las rutas de expedientes, expulsiones, constancias, ciclo y
  revisiones responden `403 MODULE_NOT_LICENSED`.
</Note>

Las llaves asignables a una API key son de lectura: `convivencia_channel.reports.read`, `convivencia.cases.read` y `convivencia.searches.read`. Todo lo que escribe —y en particular **revelar la identidad de un denunciante** (`convivencia_channel.identity.reveal`), **resolver una expulsión** (`convivencia.expulsion.approve`), **sellar** (`convivencia.seal`) y **exportar la planilla** (`convivencia.export`)— es exclusivo de sesión: son actos atribuibles a una persona.

Las marcas de tiempo son **milisegundos epoch**.

---

## Denuncias recibidas {{ tag: 'GET', label: '/api/convivencia/channel/reports' }}

<Row>
  <Col>

    Requiere `convivencia_channel.reports.read`. Devuelve las denuncias del canal público con su código de seguimiento, modo (`anonymous` | `reserved`), tipo, estado y cuenta de adjuntos, más los contadores de la bandeja.

    **La identidad reservada nunca viaja aquí.** Existe en una tabla aparte y sale sólo por `POST /api/convivencia/channel/reports/:id/identity`, con motivo obligatorio, llave propia y un evento de acceso que el denunciante tiene derecho a conocer.

    ### Estados

    <Properties>
      <Property name="received">Nueva.</Property>
      <Property name="in_review">Con un mensaje intermedio del colegio.</Property>
      <Property name="answered">Con respuesta.</Property>
      <Property name="linked">Convertida en expediente; deja de purgarse.</Property>
      <Property name="closed">Archivada.</Property>
      <Property name="purged">Purgada (90 días sin convertirse en caso; interpretación del producto).</Property>
    </Properties>

  </Col>
  <Col sticky>

    <CodeGroup title="Solicitud" tag="GET" label="/api/convivencia/channel/reports">

    ```bash {{ title: 'cURL' }}
    curl "https://app.edugoverna.com/api/convivencia/channel/reports" \
      -H "x-api-key: {tu_api_key}"
    ```

    </CodeGroup>

  </Col>
</Row>

---

## Expedientes {{ tag: 'GET', label: '/api/convivencia/cases' }}

<Row>
  <Col>

    Requiere `convivencia.cases.read`. Cada caso trae su `clock`: el plazo de investigación de **dos meses calendario** (art. 16 E g) que corre desde la activación del protocolo, sólo cuando hay estudiantes involucrados. Los contadores (`open`, `dueSoon`, `overdue`, `withExpulsion`, `closed`) se cuentan en SQL sobre toda la organización.

    Las partes salen con el rótulo del **nivel de acceso de quien lee**: sin permisos de identidad de titulares, un estudiante es su código de referencia.

    ### Relojes

    <Properties>
      <Property name="investigationDeadlineAt">Dos meses calendario desde `protocolActivatedAt`.</Property>
      <Property name="suspensionCapAt">Por medida: 15 días hábiles administrativos (descuentan feriados).</Property>
      <Property name="regulatorReportDeadlineAt">Expulsión: 5 días hábiles desde la resolución del director para informar a la autoridad educativa y a la SEREMI.</Property>
    </Properties>

    ### Actuaciones con adjunto

    `POST /convivencia/cases/:id/events` recibe multipart `title`, `body`, `occurredAt`, `evidenceKind` y `file` opcional. El archivo entra como evidencia del expediente y el hito de la cronología lo apunta: los eventos del detalle traen `createdByName`, `evidenceId` y `evidenceLabel`, y el PDF sellado nombra el adjunto junto al hito. Un expediente cerrado responde `409 CONVIVENCIA_CASE_CLOSED`.

    `PATCH /convivencia/cases/:id` con `collaborativeResolutionOffered: true` deja el hito «Gestión colaborativa ofrecida» (arts. 61 y 62 de la Ley 20.529); un `assignedUserId` nuevo deja «Responsable: …».

  </Col>
  <Col sticky>

    <CodeGroup title="Solicitud" tag="GET" label="/api/convivencia/cases/{id}">

    ```bash {{ title: 'cURL' }}
    curl "https://app.edugoverna.com/api/convivencia/cases/{id}" \
      -H "x-api-key: {tu_api_key}"
    ```

    </CodeGroup>

  </Col>
</Row>

---

## Planilla de expedientes {{ tag: 'GET', label: '/api/convivencia/cases/export' }}

<Row>
  <Col>

    Requiere `convivencia.export` —llave distinta de `convivencia.cases.read`, porque saca la organización entera en un archivo— y devuelve un XLSX con dos hojas: **Expedientes** (una fila por caso, con el estado del plazo) y **Medidas** (una fila por medida, con el tope legal de las suspensiones).

    Los rótulos de las partes se recortan al nivel de acceso de quien exporta y **los menores salen siempre por su código de referencia**, nunca por su nombre: el archivo viaja.

  </Col>
  <Col sticky>

    <CodeGroup title="Solicitud" tag="GET" label="/api/convivencia/cases/export">

    ```bash {{ title: 'cURL' }}
    # Exclusivo de sesión: se descarga desde la consola, no con una API key.
    curl "https://app.edugoverna.com/api/convivencia/cases/export" \
      -H "cookie: {tu_sesión}" \
      -o convivencia.xlsx
    ```

    </CodeGroup>

  </Col>
</Row>

---

## Paquete de una versión sellada {{ tag: 'GET', label: '/api/convivencia/cases/:id/seals/:sealId/package' }}

<Row>
  <Col>

    Requiere `convivencia.export` y devuelve un ZIP (`expediente-{código}-v{n}.zip`) con tres cosas: el PDF de esa versión sellada, con los mismos bytes que se guardaron; los archivos de evidencia del expediente, en `evidencia/`; y `manifiesto.txt`, que lista el código del caso, la versión, la fecha del sello, la huella del sello y, por cada archivo, su ruta, nombre original, tipo, tamaño y SHA-256.

    Sólo entra la evidencia que existía al sellar, para que el paquete coincida con la versión; el manifiesto declara cuántos archivos posteriores quedaron fuera y cuáles ya no están disponibles. Cada archivo leído queda en el registro de accesos (`convivencia_case_package_export`). Un paquete de más de 50 MB responde `413 CONVIVENCIA_PACKAGE_TOO_LARGE`: en ese caso la evidencia se descarga archivo por archivo.

  </Col>
  <Col sticky>

    <CodeGroup title="Solicitud" tag="GET" label="/api/convivencia/cases/:id/seals/:sealId/package">

    ```bash {{ title: 'cURL' }}
    # Exclusivo de sesión: se descarga desde la consola, no con una API key.
    curl "https://app.edugoverna.com/api/convivencia/cases/{caseId}/seals/{sealId}/package" \
      -H "cookie: {tu_sesión}" \
      -o expediente.zip
    ```

    </CodeGroup>

  </Col>
</Row>

---

## Registro de revisiones {{ tag: 'GET', label: '/api/convivencia/searches' }}

<Row>
  <Col>

    Requiere `convivencia.searches.read`. El registro del art. 16 J de la Ley 21.827: cada revisión de efectos personales con estudiante, adultos presentes, motivos, elementos hallados, horas, firmas y copias entregadas, más el resumen semestral (`records`, `elementsFound`, `weapons`) que se reporta a la SEREMI.

    La retención de tres años y el registro de todas las revisiones (no sólo las individuales en lugar privado) son **interpretaciones del producto**: la ley no fija ninguna de las dos.

  </Col>
  <Col sticky>

    <CodeGroup title="Solicitud" tag="GET" label="/api/convivencia/searches">

    ```bash {{ title: 'cURL' }}
    curl "https://app.edugoverna.com/api/convivencia/searches?year=2026&semester=2" \
      -H "x-api-key: {tu_api_key}"
    ```

    </CodeGroup>

  </Col>
</Row>

---

## Portal público

El canal vive en `/convivencia/{slug}` y es la única página, junto a la del Art. 14 ter, que se indexa: el art. 16 G obliga a publicarlo permanentemente en el sitio web. El seguimiento (`/convivencia/{slug}/seguimiento`) se entra con código y clave, y la constancia de recepción del reglamento (`/convivencia/reglamento/{token}`) es un enlace personal de un solo paso. Ninguna de las tres tiene API pública de escritura fuera del navegador: el formulario protege con Turnstile y cuenta cada intento de seguimiento, con la misma frase exista o no la denuncia.
