---
title: "Gobernanza y evidencia"
description: "Encargados con su contrato del Art. 15 bis, capacitaciones con evidencia, documentos de autoridad y reportes de cumplimiento, por API."
url: "https://docs.edugoverna.com/api-organizacion/gobernanza"
---
# Gobernanza y evidencia

Esta página reúne las superficies que sostienen el cumplimiento del día a día: los **encargados de tratamiento** y sus contratos del Art. 15 bis, las **capacitaciones** del personal con su evidencia, los **documentos de autoridad** de los apoderados, el **catálogo de gobernanza** (categorías de datos, políticas de retención, destinos, delegados) y los **reportes** descargables. {{ className: 'lead' }}

## Encargados (Art. 15 bis) {{ tag: 'GET', label: '/api/processors' }}

<Row>
  <Col>

    Un encargado es un destino de transferencia (`transfer_destination`) con acceso a datos; su contrato de encargo es un `dpa_contract` versionado. Lectura con `processing_activities.read` — los encargados son, ante todo, destinatarios del RAT.

    ### Vocabularios

    <Properties>
      <Property name="contract.status" type="string">
        `missing` (calculado, no escribible), `draft`, `in_negotiation`,
        `active`, `expired`, `terminated`.
      </Property>
      <Property name="contract.clauses" type="string[]">
        Las 10 cláusulas exigibles: `objeto`, `duracion`, `finalidad`,
        `tipos_de_datos`, `categorias_de_titulares`,
        `derechos_y_obligaciones`, `prohibicion_de_subdelegar`,
        `deber_de_secreto`, `medidas_de_seguridad`,
        `supresion_o_devolucion`. `missingClauses` lista las que faltan.
      </Property>
      <Property name="verification" type="object">
        `{ state, lastPerformedAt, lastOutcome, nextDueAt }`; `state` ∈
        `never`, `overdue`, `due_soon` (30 días), `current`. Métodos:
        `cuestionario`, `documental`, `certificacion`, `prueba_tecnica`,
        `visita`; resultados: `conforme`, `con_observaciones`,
        `no_conforme`.
      </Property>
    </Properties>

    ### Parámetros opcionales

    <Properties>
      <Property name="uncoveredOnly" type="string">
        `true` deja sólo encargados sin contrato vigente.
      </Property>
      <Property name="verificationDueOnly" type="string">
        `true` deja sólo verificaciones vencidas o por vencer.
      </Property>
    </Properties>

  </Col>
  <Col sticky>

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

    ```bash {{ title: 'cURL' }}
    curl -G "https://app.edugoverna.com/api/processors" \
      -H "x-api-key: {tu_api_key}" \
      -d uncoveredOnly=true
    ```

    ```js
    const { processors } = await fetch(
      'https://app.edugoverna.com/api/processors?uncoveredOnly=true',
      { headers: { 'x-api-key': process.env.EDUGOVERNA_API_KEY } },
    ).then((r) => r.json())
    ```

    </CodeGroup>

    ```json {{ title: 'Respuesta (recortada)' }}
    {
      "processors": [
        {
          "id": "td5a…",
          "name": "Plataforma LMS",
          "destinationType": "processor",
          "countryCode": "CL",
          "residencyClass": "cross_border_managed",
          "criticality": "medium",
          "isSubprocessor": false,
          "dataAccess": { "linked": true, "sensitive": false },
          "covered": false,
          "expiringSoon": false,
          "contract": {
            "versionNumber": 1,
            "status": "in_negotiation",
            "clauses": ["objeto", "finalidad", "deber_de_secreto"],
            "missingClauses": ["duracion", "tipos_de_datos", "…"],
            "effectiveFrom": null,
            "executedAt": null
          },
          "verification": {
            "state": "never",
            "lastPerformedAt": null,
            "lastOutcome": null,
            "nextDueAt": null
          }
        }
      ]
    }
    ```

  </Col>
</Row>

### Rutas del encargado

| Método y ruta                                      | Permiso                       | Qué hace                                                                                                                 |
| -------------------------------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `GET /processors/clauses`                          | `processing_activities.read`  | El catálogo de cláusulas y métodos de verificación, con sus textos.                                                      |
| `GET /processors/:destinationId/contracts`         | `processing_activities.read`  | Historial de versiones del contrato.                                                                                     |
| `POST /processors/:destinationId/contract`         | `processing_activities.write` | Registra una versión nueva; JSON o multipart (`payload` + `file` con el contrato firmado, hasta 15 MB). **Sólo sesión.** |
| `GET /processors/:destinationId/contract/document` | `processing_activities.read`  | Descarga el contrato archivado.                                                                                          |
| `GET /processors/:destinationId/contract/draft`    | `processing_activities.read`  | Genera el borrador PDF con las cláusulas del 15 bis.                                                                     |
| `GET /processors/:destinationId/verifications`     | `processing_activities.read`  | Verificaciones realizadas al encargado.                                                                                  |
| `POST /processors/:destinationId/verifications`    | `processing_activities.write` | Registra una verificación (JSON o multipart con evidencia). **Sólo sesión.**                                             |
| `GET …/verifications/:verificationId/evidence`     | `processing_activities.read`  | Descarga la evidencia de una verificación.                                                                               |

---

## Capacitaciones {{ tag: 'GET', label: '/api/training-sessions' }}

<Row>
  <Col>

    El registro de capacitaciones del personal en protección de datos — parte de la evidencia de responsabilidad proactiva. Lectura con `dpia.read`; escritura con `dpia.write` (**sólo sesión**).

    `POST /training-sessions` requiere `title` y `heldAt`; opcionales `topic`, `trainerName`, `audienceDescription`, `attendeeCount`, `nextDueAt`, `notes`. La evidencia (lista de asistencia, certificado) se adjunta con `POST /training-sessions/:id/evidence` — `multipart/form-data`, campo `file`, hasta 15 MB — y se recupera con `GET /training-sessions/:id/evidence`.

  </Col>
  <Col sticky>

    <CodeGroup title="Solicitud" tag="GET" label="/api/training-sessions">

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

    ```js
    const { trainingSessions } = await fetch(
      'https://app.edugoverna.com/api/training-sessions',
      { headers: { 'x-api-key': process.env.EDUGOVERNA_API_KEY } },
    ).then((r) => r.json())
    ```

    </CodeGroup>

    ```json {{ title: 'Respuesta (recortada)' }}
    {
      "trainingSessions": [
        {
          "id": "ts21…",
          "title": "Capacitación anual 2026",
          "topic": "Qué se puede y qué no con datos de estudiantes",
          "heldAt": "2026-03-15T12:00:00.000Z",
          "trainerName": "Estudio Jurídico Pérez",
          "attendeeCount": 42,
          "evidenceArtifactId": "ar54…",
          "nextDueAt": "2027-03-15T12:00:00.000Z",
          "createdBy": "dpo@colegioandes.cl"
        }
      ]
    }
    ```

  </Col>
</Row>

---

## Documentos de autoridad {{ tag: 'GET', label: '/api/records/authority-documents' }}

<Row>
  <Col>

    Los documentos que acreditan la autoridad de un apoderado sobre un estudiante (resoluciones judiciales, poderes). Lectura con `guardians.read`; registro y revisión con `guardians.write`.

    `POST /records/authority-documents` recibe `guardianshipId`, `documentType` y exactamente uno de `artifactId` (artefacto ya subido) o `artifact` (referencia de almacenamiento). El documento nace `pending`; `POST …/:id/verify` y `POST …/:id/reject` resuelven la revisión — rechazar un documento de un vínculo `self_attested` revoca la autoridad provisional del apoderado.

    ### Parámetros opcionales del listado

    <Properties>
      <Property name="verificationStatus" type="string">
        `pending`, `verified` o `rejected`.
      </Property>
      <Property name="limit / cursor / offset" type="varios">
        Por defecto 50, máximo 100; `cursor` tiene prioridad sobre `offset`.
      </Property>
    </Properties>

  </Col>
  <Col sticky>

    <CodeGroup title="Solicitud" tag="GET" label="/api/records/authority-documents">

    ```bash {{ title: 'cURL' }}
    curl -G "https://app.edugoverna.com/api/records/authority-documents" \
      -H "x-api-key: {tu_api_key}" \
      -d verificationStatus=pending
    ```

    ```js
    const { documents, meta } = await fetch(
      'https://app.edugoverna.com/api/records/authority-documents?verificationStatus=pending',
      { headers: { 'x-api-key': process.env.EDUGOVERNA_API_KEY } },
    ).then((r) => r.json())
    ```

    </CodeGroup>

    ```json {{ title: 'Respuesta (recortada)' }}
    {
      "documents": [
        {
          "id": "ad83…",
          "guardianshipId": "gd12…",
          "documentType": "resolucion_judicial",
          "issuingAuthority": "Juzgado de Familia de Santiago",
          "artifactId": "ar62…",
          "verificationStatus": "pending",
          "issuedAt": "2026-06-01T12:00:00.000Z",
          "guardianshipStatus": "active",
          "relationshipType": "madre",
          "studentSummary": { "referenceCode": "EST-2026-0412", "displayName": "Martina Rojas" },
          "guardianSummary": { "referenceCode": "APO-2026-0311", "displayName": "Carolina Fuentes" }
        }
      ],
      "meta": {
        "totalMatchedCount": 3,
        "nextCursor": null,
        "filteredRestrictedCount": 0
      }
    }
    ```

  </Col>
</Row>

El mismo archivo de rutas ofrece `POST /records/verifications` y `POST /records/verifications/:id/complete` (verificaciones de identidad de titulares, `subjects.write`) y `POST /records/enrollments` (matrículas, `students.write`).

---

## Catálogo de gobernanza {{ tag: 'GET', label: '/api/governance/catalog' }}

`GET /governance/catalog` (con `processing_activities.read`) devuelve, en cuatro arreglos, los bloques de configuración que el RAT referencia:

- `dataCategories` — categorías de datos con su sensibilidad (`sensitivityLevel`, `isSensitive`, `requiresExpressConsent`) y retención por defecto.
- `retentionPolicies` — políticas de retención (`retentionDays`, `actionAfterRetention`, `triggerEvent`).
- `transferDestinations` — destinos de transferencia (los mismos que la página de encargados enriquece).
- `policyDocuments` — documentos de política con su versión vigente y si hay aprobación pendiente.

| Método y ruta                              | Permiso                      | Qué hace                                                                   |
| ------------------------------------------ | ---------------------------- | -------------------------------------------------------------------------- |
| `GET /governance/delegates`                | `schools.read`               | Delegados de protección de datos designados, con su usuario.               |
| `POST /governance/delegates`               | `schools.write`              | Designa un delegado.                                                       |
| `POST /governance/delegates/:id/acta`      | `schools.write`              | Sube el acta de designación (multipart, campo `file`).                     |
| `GET /governance/delegates/:id/acta`       | `schools.read`               | Descarga el acta.                                                          |
| `GET /governance/controllers/assignments`  | `schools.read`               | Entidades responsables (sostenedor/fundación) asignadas a la organización. |
| `POST /governance/controllers/assignments` | `schools.write`              | Crea o asigna la entidad responsable.                                      |
| `GET /governance/dpia-assessments`         | `processing_activities.read` | Vista de gobernanza sobre las EIPD (filtro `processingActivityId`).        |
| `POST /governance/dpia-assessments`        | `processing_activities.write` | Registra la EIPD mínima de una actividad (ver abajo).                     |
| `PATCH /governance/dpia-assessments/:id`   | `processing_activities.write` | Completa o corrige esa EIPD mientras siga editable.                       |
| `GET /governance/system-register-entries`  | `processing_activities.read` | Registro de sistemas.                                                      |

### La EIPD mínima del núcleo

Una actividad cuyo screening del Art. 15 ter da `required` no se publica sin evaluación de impacto. Estas dos rutas existen para que una organización **sin el módulo EIPD** pueda cumplir esa exigencia: registran los contenidos mínimos del artículo, sin escenarios, matriz ni aprobación (eso vive en [`/api/dpia`](/api-organizacion/actividades-tratamiento), con licencia). Aceptan sesión o API key.

<Properties>
  <Property name="processingActivityId" type="string (uuid)">
    **Requerido en el `POST`.** La actividad que la evaluación cubre; una
    actividad de otra organización responde `404 PROCESSING_ACTIVITY_NOT_FOUND`.
  </Property>
  <Property name="title" type="string">
    Requerido en el `POST` (2–160 caracteres); opcional en el `PATCH`.
  </Property>
  <Property name="summary" type="string | null">
    Descripción de las operaciones de tratamiento y su finalidad (hasta 4.000).
  </Property>
  <Property name="necessityAssessment / proportionalityAssessment" type="string | null">
    Evaluación de la necesidad y de la proporcionalidad (hasta 6.000 cada una).
  </Property>
  <Property name="mitigationPlan" type="string | null">
    Medidas previstas para tratar los riesgos (hasta 6.000).
  </Property>
</Properties>

El `POST` responde `201` y el `PATCH` `200`, ambos con la evaluación tal como quedó (sin envoltorio): `id`, `assessmentCode` (folio `EIPD-AAAA-NNNN`), `status` (nace en `draft`), los cuatro textos y `metadata`. `riskLevel` ya no se acepta: el núcleo no tiene escenarios de los que derivarlo. El `PATCH` sobre una evaluación `approved`, `superseded` o `archived` responde `409 DPIA_LOCKED`.

**Qué cuenta para publicar.** La guarda de `POST /processing-activities/:id/versions` sólo cuenta una evaluación **viva** (`draft`, `in_review`, `approved` o `under_revision`) con `summary`, `necessityAssessment` y `proportionalityAssessment` escritos. Sin ninguna viva responde `409 DPIA_REQUIRED`; con una viva a la que le falta contenido, `409 DPIA_INCOMPLETE`:

```json {{ title: '409 DPIA_INCOMPLETE' }}
{
  "error": {
    "code": "DPIA_INCOMPLETE",
    "message": "A la evaluación de impacto le faltan contenidos que exige el Art. 15 ter: …",
    "details": {
      "assessmentId": "5c0e…",
      "assessmentCode": "EIPD-2026-0007",
      "missing": ["necessityAssessment", "proportionalityAssessment"]
    }
  }
}
```

`missing` usa los nombres de campo, así que se completa con un `PATCH` sobre `assessmentId` y se vuelve a publicar.

---

## Reportes de cumplimiento {{ tag: 'POST', label: '/api/reports/generate' }}

<Row>
  <Col>

    Reportes descargables para dirección o el regulador. **Sólo disponible con sesión de la consola**: generar exige `reports.generate` (permiso de sesión) más el permiso de lectura del dominio del reporte; listar y descargar exigen `audit.read`.

    ### Atributos

    <Properties>
      <Property name="reportType" type="string">
        `arco_compliance` (exige `rights_requests.read`), `consent_coverage`
        (`consents.read`) o `incident_summary` (`audit.read`).
      </Property>
      <Property name="format" type="string">
        `pdf` o `csv`.
      </Property>
      <Property name="periodFrom / periodTo" type="string">
        Opcionales: `YYYY-MM-DD` (día calendario chileno, fin inclusivo) o
        ISO 8601 completo.
      </Property>
    </Properties>

  </Col>
  <Col sticky>

    <CodeGroup title="Solicitud" tag="POST" label="/api/reports/generate">

    ```bash {{ title: 'cURL' }}
    curl -X POST "https://app.edugoverna.com/api/reports/generate" \
      -H "Cookie: {sesion_de_consola}" \
      -H "Content-Type: application/json" \
      -d '{ "reportType": "arco_compliance", "format": "csv" }'
    ```

    ```js
    const { report } = await fetch(
      'https://app.edugoverna.com/api/reports/generate',
      {
        method: 'POST',
        credentials: 'include',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ reportType: 'arco_compliance', format: 'csv' }),
      },
    ).then((r) => r.json())
    ```

    </CodeGroup>

    ```json {{ title: 'Respuesta · 201' }}
    {
      "report": {
        "id": "rp44…",
        "reportType": "arco_compliance",
        "format": "csv",
        "title": "Reporte de cumplimiento",
        "periodFrom": null,
        "periodTo": null,
        "generatedAt": "2026-08-25T15:00:00.000Z",
        "sizeBytes": 18240,
        "contentType": "text/csv"
      }
    }
    ```

  </Col>
</Row>

`GET /reports` lista los generados (paginado con `meta`) y `GET /reports/:artifactId/download` entrega el archivo.

---

## Paneles de resumen

Dos lecturas agregadas, ambas **sólo disponibles con sesión de la consola**:

- `GET /dashboard/overview` — el panel del colegio: `summary` con conteos por dominio (`subjects`, `activities`, `dpia`, `processors`, `governance`, `cases`, `consents`), actividad reciente, plazos próximos y acciones prioritarias. Cada bloque trae `available` y devuelve `null` (no `0`) en los conteos que la persona no puede ver.
- `GET /network/overview` — para organizaciones de tipo red (sostenedores): **sólo conteos** por colegio miembro (`totals` y el mismo `summary` por colegio), nunca datos de titulares de los colegios.

Para la auditoría fina de accesos y eventos, `GET /audit/events` y `GET /audit/sensitive-access-events` (con `audit.read`, sesión) complementan estos paneles.
