Sujetos del padrón
El padrón es el corazón del producto: cada persona cuyos datos trata el colegio es un titular (data_subject) — estudiante, apoderado, funcionario u otro. Alrededor del titular orbitan los vínculos de apoderado (guardianship), las Generaciones (student_cohort, la promoción que avanza junta) y los Cursos y segmentos (student_segment; un Curso es un segmento con kind: "course"). Esta página cubre las cinco superficies, empezando por la regla que las gobierna a todas: la proyección de lectura.
La vista de producto del padrón está en Padrón.
Qué ves depende de tu proyección
Cada respuesta de lectura de titulares se filtra por la escalera de permisos subjects.read.* de tu API key, y la proyección aplicada viaja en meta.projection para que tu integración no tenga que adivinar:
- Los listados nunca son sensibles.
GET /data-subjectsdegrada la proyección al nivel de nómina: identidad a lo másbasic(nombres sí, fecha de nacimiento/dirección/RUT no) y contacto a lo másmasked. Por eso listar no exige aprobación de lectura masiva ni escribe eventos de acceso sensible. - El registro completo vive en el detalle. Sólo
GET /data-subjects/:subjectIdentrega la proyección plena de tu key; una lectura con proyección sensible queda registrada en el historial de accesos. directoryno entrega ningún nombre. A ese tier los campos de identidad llegan ennully el titular se referencia porreferenceCode.
Los campos que la proyección oculta llegan como null, nunca desaparecen del cuerpo: la forma de la respuesta es estable entre tiers.
Listar titulares
Requiere cualquier permiso subjects.read.*. Pagina por cursor y filtra por tipo y ciclo de vida; los titulares suprimidos o anonimizados no aparecen salvo que pidas lifecycle=suppressed.
Parámetros opcionales
- Nombre
type- Tipo
- string
- Descripción
Uno o más tipos separados por coma:
student,guardian,staff,other(p. ej.type=staff,other).
- Nombre
q- Tipo
- string
- Descripción
Búsqueda: código de referencia, RUT o contacto exacto; nombres sólo si tu proyección es al menos
identity_basic.
- Nombre
lifecycle- Tipo
- string
- Descripción
suppressedlista únicamente titulares suprimidos/anonimizados.
- Nombre
limit / cursor- Tipo
- varios
- Descripción
Paginación por cursor;
meta.nextCursorindica la página siguiente.
Solicitud
curl -G "https://app.edugoverna.com/api/data-subjects" \
-H "x-api-key: {tu_api_key}" \
-d type=student -d limit=50
Respuesta (recortada)
{
"dataSubjects": [
{
"id": "3f6f0a2e-…",
"subjectType": "student",
"referenceCode": "EST-2026-0412",
"status": "active",
"currentAgeBand": "minor_14_17",
"currentGeneralConsentAuthority": "guardian",
"activeGuardianCount": 2,
"legalGivenNames": "Martina",
"legalFamilyNames": "Rojas Fuentes",
"preferredName": null,
"birthDate": null,
"contactType": "email",
"contactValue": null,
"contactMaskedValue": "a•••o@example.com",
"identifierType": "rut",
"identifierValue": null,
"identifierLast4": "6789",
"studentGroupSummary": {
"activeCohort": { "name": "Generación 2030" },
"segments": [{ "name": "1°A" }]
}
// …
}
],
"meta": {
"filteredRestrictedCount": 0,
"totalMatchedCount": 412,
"nextCursor": "eyJz…",
"projection": {
"identity": "basic",
"contact": "masked",
"identifier": "metadata",
"studentProfile": "redacted",
"guardianProfile": "redacted"
}
}
}
El detalle (GET /data-subjects/:subjectId) responde { dataSubject, meta } con la misma forma pero bajo la proyección completa de tu key: con identity_sensitive aparecen birthDate, dirección y el RUT en claro; con contact_full, los valores de contacto descifrados en contacts[] y primaryContact.
Crear un titular
Requiere subjects.write. La creación es idempotente si envías un id generado por el cliente: reenviar el mismo payload devuelve el registro existente en vez de duplicarlo.
Atributos requeridos
- Nombre
subjectType- Tipo
- string
- Descripción
student,guardian,staffuother.
Atributos opcionales frecuentes
- Nombre
legalGivenNames / legalFamilyNames- Tipo
- string
- Descripción
Identidad legal;
preferredNamepara el nombre social.
- Nombre
birthDate- Tipo
- string
- Descripción
YYYY-MM-DD; alimenta la banda etaria y con ella la autoridad de consentimiento. Una fecha imposible responde422 SUBJECT_BIRTH_DATE_INVALID.
- Nombre
identifier- Tipo
- object
- Descripción
{ identifierType, value, last4?, isPrimary? }— típicamente el RUT.
- Nombre
contacts- Tipo
- array
- Descripción
Hasta 4 contactos
{ contactType, value, isNotificationEnabled? }(email,phone,sms,other);primaryContactTypedesigna el primario. Un correo mal formado responde422 SUBJECT_CONTACT_VALUE_INVALID.
- Nombre
studentProfile / guardianProfile- Tipo
- object
- Descripción
Perfil según el tipo: código escolar, nivel, alertas; o relación y prioridad de emergencia.
- Nombre
id- Tipo
- string
- Descripción
UUID del cliente para idempotencia.
Solicitud
curl -X POST "https://app.edugoverna.com/api/data-subjects" \
-H "x-api-key: {tu_api_key}" \
-H "Content-Type: application/json" \
-d '{
"subjectType": "student",
"legalGivenNames": "Martina",
"legalFamilyNames": "Rojas Fuentes",
"birthDate": "2012-04-18",
"identifier": { "identifierType": "rut", "value": "23456789-6", "isPrimary": true },
"contacts": [{ "contactType": "email", "value": "apoderado@example.com" }],
"primaryContactType": "email"
}'
El resto del ciclo de vida del titular
| Método y ruta | Permiso | Qué hace |
|---|---|---|
PATCH /data-subjects/:id/identity | subjects.write | Rectifica nombres y fecha de nacimiento (recalcula la banda etaria). |
PATCH /data-subjects/:id/contacts | subjects.write | Reemplaza el set de contactos y designa el primario. |
PATCH /data-subjects/:id/contact | subjects.write | Atajo legado: actualiza sólo el contacto primario. |
PATCH /data-subjects/:id/lifecycle | subjects.write | suppress (excluye de todo proceso operativo) o reactivate. |
GET /data-subjects/:id/verifications | subjects.read.* | Verificaciones de identidad del titular (referencias, no bytes). |
GET /data-subjects/:id/restrictions | subjects.read.* | Restricciones de tratamiento activas. |
GET /data-subjects/:id/anonymization-approvals | subjects.write | Estado de la aprobación de anonimización abierta. |
POST /data-subjects/:id/anonymization-approvals | subjects.write | Abre la solicitud de anonimización a cuatro ojos (responde 202). Requiere sesión: la ejecuta otra persona al aprobar. |
Sólo disponible con sesión de la consola: la purga de un registro creado
por error (GET /data-subjects/:id/purge-eligibility y DELETE /data-subjects/:id, permiso subjects.purge). Destruir una fila exige una
persona identificable, y el servidor rechaza purgar cualquier titular con
historial de consentimientos, ARCO o incidentes.
Apoderados
El vínculo estudiante ↔ apoderado, con su autoridad de consentimiento. Lectura con guardians.read (filtros studentSubjectId y guardianSubjectId); creación y edición con guardians.write.
Campos clave del vínculo: relationshipType, authorityScope (full por defecto), canConsentGeneral, canConsentSensitive, canExerciseRights, requiresCoSignature, priority, status, validFrom/validTo y provenance — administrative (creado por el colegio) o self_attested (declarado por el apoderado en una campaña pública, provisional hasta que se verifique su documento de autoridad).
POST /guardianships requiere studentSubjectId, guardianSubjectId y relationshipType; responde 201 con la fila creada. Cada elemento del listado agrega studentSummary, guardianSummary y studentGroupSummary.
Solicitud
curl -G "https://app.edugoverna.com/api/guardianships" \
-H "x-api-key: {tu_api_key}" \
-d studentSubjectId=3f6f0a2e-…
Respuesta (recortada)
{
"guardianships": [
{
"id": "gd12…",
"studentSubjectId": "3f6f0a2e-…",
"guardianSubjectId": "8a4c…",
"relationshipType": "madre",
"authorityScope": "full",
"canConsentGeneral": true,
"canConsentSensitive": true,
"canExerciseRights": true,
"priority": 1,
"status": "active",
"provenance": "administrative",
"studentSummary": { "referenceCode": "EST-2026-0412", "displayName": "Martina Rojas" },
"guardianSummary": { "referenceCode": "APO-2026-0311", "displayName": "Carolina Fuentes" }
}
],
"meta": { "filteredRestrictedCount": 0 }
}
Los documentos que acreditan la autoridad de un apoderado (resoluciones, poderes) se gestionan en /records/authority-documents.
Generaciones
La Generación es la promoción que avanza junta por los años escolares. Lectura con students.read, escritura con students.write.
| Método y ruta | Permiso | Qué hace |
|---|---|---|
GET /student-cohorts | students.read | Lista { studentCohorts }: cada una con name, anchorSchoolYear, expectedGraduationYear, curso actual y activeMemberCount. |
POST /student-cohorts | students.write | Crea una Generación (name y anchorSchoolYear requeridos); 409 STUDENT_COHORT_CODE_CONFLICT si el código choca. |
GET /student-cohorts/:cohortId | students.read | Detalle. |
PATCH /student-cohorts/:cohortId | students.write | Actualiza año, curso o estado. |
POST /student-cohorts/:cohortId/members | students.write | Matricula un estudiante. |
POST /student-cohorts/:cohortId/members/bulk | students.write | Matrícula masiva; responde un reporte por fila. |
DELETE /student-cohorts/:cohortId/members/:studentSubjectId | students.write | Retira un estudiante. |
Cursos y segmentos
Un segmento agrupa estudiantes; un Curso es un segmento con kind: "course", que además porta courseSchoolYear, courseGradeLevel y courseCode. Los segmentos pueden ser de membresía fija (type: "fixed") o dinámicos por filtro (type: "dynamic"); un Curso sólo admite membresía fija.
Lectura con students.read; el parámetro kind=course filtra los Cursos. Escritura con students.write (mismas rutas de miembros que las Generaciones). Dos particularidades:
POST /student-segments/previewsimula unfilterDefinitionantes de crear el segmento (muestra hasta 50 estudiantes). Filtrar porhasSpecialNeedsohasHealthAlertsexige ademássubjects.read.identity_sensitive(403 SUBJECT_SENSITIVE_READ_REQUIRED).GET /student-segments/:segmentIdresponde{ studentSegment, members, meta }; cada miembro trae unstudentSummaryde nómina (nombre y código de referencia), no el registro completo del titular.
Solicitud
curl -G "https://app.edugoverna.com/api/student-segments" \
-H "x-api-key: {tu_api_key}" \
-d kind=course
Respuesta (recortada)
{
"studentSegments": [
{
"id": "5b2c…",
"name": "1°A",
"kind": "course",
"type": "fixed",
"courseSchoolYear": 2026,
"courseGradeLevel": "1° básico",
"courseCode": "1A",
"status": "active",
"activeMemberCount": 32,
"filterDefinition": null
}
]
}
Perfil del colegio
La organización dueña de la API key, con su perfil escolar. Lectura con schools.read; POST /schools/current (con schools.write) crea o actualiza el perfil (201 la primera vez, 200 después).
Respuesta
{
"organization": {
"id": "org_…",
"name": "Colegio Andes",
"slug": "colegio-andes",
"logo": "/api/public/branding/logos/org_…?v=…",
"brandColor": "#D64545"
},
"schoolProfile": {
"legalName": "Colegio Andes SpA",
"schoolCode": "12345-5",
"schoolType": "school",
"educationLevels": ["basica", "media"],
"commune": "Providencia",
"countryCode": "CL",
"privacyContactEmail": "privacidad@colegioandes.cl"
// …
}
}
Para poblar el padrón masivamente desde una planilla, sigue con Importaciones.