API de organización

La API de organización es la interfaz programática de tu propio colegio: los mismos recursos que administras en la consola —padrón, consentimientos, derechos ARCO, RAT, transparencia— disponibles para tus scripts e integraciones internas mediante una API key de organización. En esta página verás cómo se emite una key, cómo se autentica una llamada, qué permisos puede portar y cómo esos permisos determinan cuánto ve del padrón.

El modelo de la API key

Una API key de organización es una credencial emitida por un administrador desde la consola (Integraciones → API keys) o mediante la ruta POST /api/api-keys con sesión activa. Al emitirla se eligen sus permisos con casillas de verificación: la key sólo puede portar permisos del catálogo asignable (listado más abajo) y nunca hereda los permisos de la persona que la creó.

Tres propiedades definen su comportamiento:

  • Se muestra una sola vez. La respuesta de creación es la única copia en texto plano; Edugoverna almacena sólo el hash. En adelante la consola muestra el prefix y el inicio enmascarado (start) para identificarla. Si se pierde, se revoca y se emite otra.
  • Pertenece a la organización, no a una persona. La key queda ligada al colegio que la emitió (referenceId) y toda llamada opera dentro de ese tenant. No hay que pasar el identificador de la organización en la URL: la key es el contexto.
  • Es revocable y auditable. Emitirla y revocarla escribe eventos de auditoría; revocar la deshabilita (queda visible como «Revocada») en vez de borrarla.

Autenticación con x-api-key

Toda llamada lleva la key en el encabezado x-api-key, contra la base https://app.edugoverna.com/api:

Llamada autenticada con API key

curl "https://app.edugoverna.com/api/schools/current" \
  -H "x-api-key: {tu_api_key}"

Casi todas las rutas de la API de organización aceptan indistintamente una sesión de la consola (cookie) o una API key: si no hay sesión y falta el encabezado, la respuesta es 401 API_KEY_REQUIRED. Una key deshabilitada o expirada responde 401. Unas pocas rutas pensadas para sistemas (como las verificaciones de /records) exigen API key incluso con sesión activa, y las operaciones sensibles marcadas «sólo sesión» en estas páginas rechazan cualquier key.

Algunas superficies sensibles son sólo de sesión: exportaciones ARCO, incidentes de seguridad, reporte al regulador, decisiones manuales de consentimiento con evidencia, y la purga de titulares, entre otras. Cada página de esta referencia lo indica donde corresponde con la frase «sólo disponible con sesión de la consola». Un intento con API key sobre esas superficies queda además registrado en auditoría.

Permisos asignables

Estos son los 28 permisos que una API key de organización puede portar, agrupados por familia. En cada endpoint de esta referencia encontrarás cuál exige.

FamiliaPermisos
Colegio y gobernanzaschools.read, schools.write
Lectura de titulares (escalera de proyección)subjects.read.directory, subjects.read.identity_basic, subjects.read.identity_sensitive, subjects.read.contact_masked, subjects.read.contact_full
Escritura de titularessubjects.write
Estudiantes (Generaciones y Cursos)students.read, students.write
Apoderadosguardians.read, guardians.write
Actividades de tratamiento (RAT)processing_activities.read, processing_activities.write
Evaluaciones de impacto y riesgosdpia.read
Portal de transparenciatransparency.read
Consentimientosconsents.read, consents.write
Derechos ARCOrights_requests.read, rights_requests.write
Integracionesintegrations.read, integrations.write
Padrones compartidosregistry_shares.read, registry_shares.write, shared_subjects.read, shared_campaigns.write, registrar_invites.manage
Auditoríaaudit.read

La escalera de lectura de titulares

Los cinco permisos subjects.read.* no son excluyentes entre sí: componen una proyección que determina qué campos de cada titular devuelve la API. La identidad y el contacto se resuelven por separado, y la key puede combinar tiers (por ejemplo identity_basic + contact_masked).

  • Nombre
    subjects.read.directory
    Tipo
    tier base
    Descripción

    Sólo datos de directorio: ningún nombre (los campos de identidad llegan en null), sólo el código de referencia (referenceCode), tipo de titular y estado. Es el tier del rol de gestión de incidentes.

  • Nombre
    subjects.read.identity_basic
    Tipo
    identidad
    Descripción

    Agrega nombres y apellidos legales y nombre preferido. La fecha de nacimiento, dirección y nacionalidad siguen en null.

  • Nombre
    subjects.read.identity_sensitive
    Tipo
    identidad
    Descripción

    Identidad completa descifrada: fecha de nacimiento, dirección, RUT en claro y perfiles de estudiante/apoderado sin censurar.

  • Nombre
    subjects.read.contact_masked
    Tipo
    contacto
    Descripción

    Contactos con el valor enmascarado (contactMaskedValue, p. ej. a•••o@example.com); el valor en claro llega en null.

  • Nombre
    subjects.read.contact_full
    Tipo
    contacto
    Descripción

    Contactos descifrados completos (correo y teléfono en claro).

Dos reglas transversales protegen el padrón independiente del tier:

  1. Los listados nunca son sensibles. GET /data-subjects degrada la proyección a nivel de nómina (identity_sensitivebasic, contact_fullmasked). El registro completo con PII sólo existe en el detalle (GET /data-subjects/:subjectId), y leerlo con proyección sensible queda registrado.
  2. Buscar por nombre exige poder leer uno. El parámetro de búsqueda sólo consulta nombres si la proyección es al menos identity_basic; a tier directory la búsqueda por RUT o correo funciona como verificación de pertenencia, pero se audita sin almacenar el término.

El detalle está en Sujetos del padrón.


GET/api/api-keys

Listar las API keys

Devuelve todas las keys de la organización activa, vigentes y revocadas, sin material secreto: el hash nunca se proyecta, sólo start (inicio enmascarado) y prefix. Requiere sesión de la consola con el permiso api_keys.manage; las tres rutas de gestión de keys son de sesión, una API key no puede administrar otras keys.

Campos de cada key

  • Nombre
    id
    Tipo
    string
    Descripción

    Identificador de la key.

  • Nombre
    name
    Tipo
    string
    Descripción

    Nombre descriptivo (máximo 32 caracteres).

  • Nombre
    start
    Tipo
    string
    Descripción

    Primeros caracteres de la key, para identificarla.

  • Nombre
    prefix
    Tipo
    string
    Descripción

    Prefijo opcional elegido al crearla.

  • Nombre
    enabled
    Tipo
    boolean
    Descripción

    false cuando fue revocada.

  • Nombre
    permissions
    Tipo
    string[]
    Descripción

    Los permisos canónicos que porta, ordenados.

  • Nombre
    expiresAt
    Tipo
    timestamp | null
    Descripción

    Expiración, si se fijó al crearla.

  • Nombre
    lastRequest
    Tipo
    timestamp | null
    Descripción

    Última vez que la key fue usada.

Solicitud

GET
/api/api-keys
curl "https://app.edugoverna.com/api/api-keys" \
  -H "Cookie: {sesion_de_consola}"

Respuesta

{
  "apiKeys": [
    {
      "id": "k4d9…",
      "name": "Sync biblioteca",
      "start": "edug_a1b2",
      "prefix": "edug",
      "enabled": true,
      "permissions": [
        "students.read",
        "subjects.read.contact_masked",
        "subjects.read.identity_basic"
      ],
      "expiresAt": null,
      "lastRequest": "2026-08-24T18:12:03.000Z",
      "requestCount": 1204,
      "metadata": null,
      "createdAt": "2026-06-01T12:00:00.000Z",
      "updatedAt": "2026-08-24T18:12:03.000Z"
    }
  ],
  "total": 1
}

POST/api/api-keys

Emitir una API key

Crea una key nueva con los permisos indicados. Requiere sesión de la consola con api_keys.manage. La respuesta incluye el campo key con la credencial en texto plano: es la única vez que se entrega.

Atributos requeridos

  • Nombre
    permissions
    Tipo
    string[]
    Descripción

    Uno o más permisos del catálogo asignable. Un permiso fuera del catálogo responde 422.

Atributos opcionales

  • Nombre
    name
    Tipo
    string
    Descripción

    Nombre descriptivo, entre 1 y 32 caracteres.

  • Nombre
    expiresIn
    Tipo
    integer | null
    Descripción

    Vida útil en segundos; null para no expirar.

  • Nombre
    prefix
    Tipo
    string
    Descripción

    Prefijo visible de la key (2 a 32 caracteres).

  • Nombre
    metadata
    Tipo
    object
    Descripción

    Metadatos libres que la consola muestra junto a la key.

  • Nombre
    partnerConnectionId
    Tipo
    string | null
    Descripción

    Asocia la key a una conexión de partner para mostrarla como «asignada a» esa conexión.

Solicitud

POST
/api/api-keys
curl -X POST "https://app.edugoverna.com/api/api-keys" \
  -H "Cookie: {sesion_de_consola}" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Sync biblioteca",
    "prefix": "edug",
    "permissions": [
      "students.read",
      "subjects.read.identity_basic",
      "subjects.read.contact_masked"
    ]
  }'

Respuesta · 201

{
  "id": "k4d9…",
  "name": "Sync biblioteca",
  "key": "edug_a1b2c3d4e5…",
  "start": "edug_a1b2",
  "prefix": "edug",
  "enabled": true,
  "permissions": [
    "students.read",
    "subjects.read.contact_masked",
    "subjects.read.identity_basic"
  ],
  "expiresAt": null,
  "createdAt": "2026-08-25T12:00:00.000Z",
  "updatedAt": "2026-08-25T12:00:00.000Z"
}

DELETE/api/api-keys/:id

Revocar una API key

Deshabilita la key: deja de verificar de inmediato, pero el registro permanece visible en la consola como «Revocada» para conservar la historia operativa. Requiere sesión de la consola con api_keys.manage. Una key de otra organización responde 404 API_KEY_NOT_FOUND — la existencia de keys ajenas no se revela.

Solicitud

DELETE
/api/api-keys/:id
curl -X DELETE "https://app.edugoverna.com/api/api-keys/k4d9…" \
  -H "Cookie: {sesion_de_consola}"

Errores y límites

Todos los errores llegan en el mismo sobre, con un código estable y un mensaje en español:

Sobre de error

{
  "error": {
    "code": "SUBJECTS_READ_FORBIDDEN",
    "message": "Se requiere un permiso de lectura de titulares…",
    "details": null
  }
}

Cada key trae un límite de tasa propio (por defecto 10.000 solicitudes por ventana de 24 horas); al excederlo la verificación de la key deja de aceptarla y la API responde 401 con el código RATE_LIMITED hasta que la ventana se renueva. El catálogo de códigos está en Errores y la política completa de límites en Límites.

Las páginas de esta referencia

¿Te sirvió esta página?