---
title: "Padrón"
description: "Endpoints de padrón de la Partner API: sincronización de estudiantes, apoderados, vínculos y matrículas por upsert con código de referencia."
url: "https://docs.edugoverna.com/padron"
---
# Padrón

El padrón es el registro de titulares del sostenedor: estudiantes, apoderados, los vínculos entre ellos y las matrículas por año escolar. En esta página revisamos los endpoints que permiten a tu integración mantener ese padrón sincronizado con tu propio sistema, usando el `referenceCode` de cada titular como llave externa. {{ className: 'lead' }}

<Note>
  Todas las rutas de esta página cuelgan de la URL base
  `https://app.edugoverna.com/api/partner/v1/organizations/:organizationId`,
  donde `:organizationId` es la organización dueña del padrón (el colegio o
  registro con el que tu credencial tiene una conexión activa). La autenticación
  se describe en [Autenticación](/autenticacion) y los alcances de conexión en
  [Conexiones](/gestion/conexiones).
</Note>

## El modelo de padrón

El padrón se compone de cuatro entidades, todas escribibles por upsert:

- **Estudiante** y **apoderado** son titulares (`subjectType: "student"` y `"guardian"`). Cada uno se identifica ante la API por su `referenceCode`, un código estable que tu sistema define — típicamente tu propio ID de alumno o apoderado. Un `PUT` sobre un `referenceCode` inexistente crea el titular; sobre uno existente, lo rectifica.
- **Vínculo (guardianship)** conecta a un apoderado con un estudiante y declara qué autoridad tiene: consentir tratamiento general, consentir datos sensibles, ejercer derechos. Es único por par estudiante–apoderado.
- **Matrícula (enrollment)** registra la situación de un estudiante en un año escolar concreto (curso, nivel, estado). Es única por estudiante y `schoolYear`.

Las lecturas del padrón devuelven una **proyección parcial** del titular, no el registro completo: la API Partner recibe nombres y contactos (Edugoverna necesita que puedas verificar a quién le pides consentimiento), pero el RUT viaja enmascarado (`identifierType` y `last4`, nunca el valor), la fecha de nacimiento no se devuelve, y los campos sensibles del perfil (`hasSpecialNeeds`, `hasHealthAlerts`, códigos internos) vuelven en `null`. Toda lectura queda registrada en la auditoría de la organización dueña.

## Campos de identidad compartidos

Los `PUT` de estudiante y apoderado aceptan el mismo bloque de identidad:

<Properties>
  <Property name="legalGivenNames" type="string">
    Nombres legales. Máximo 160 caracteres.
  </Property>
  <Property name="legalFamilyNames" type="string">
    Apellidos legales. Máximo 160 caracteres.
  </Property>
  <Property name="preferredName" type="string">
    Nombre social o de uso preferente. Máximo 160 caracteres.
  </Property>
  <Property name="birthDate" type="string">
    Fecha de nacimiento en formato ISO (`YYYY-MM-DD`). Determina la banda etaria
    y con ella quién puede consentir. Se acepta en escritura pero no se devuelve
    en las lecturas de la API Partner.
  </Property>
  <Property name="identifier" type="object">
    Identificador primario del titular: `identifierType` (por ejemplo `"rut"`),
    `value`, y opcionalmente `normalizedValue` y `last4`. Se cifra en reposo;
    las lecturas sólo devuelven `identifierType` y `last4`.
  </Property>
  <Property name="contact" type="object">
    Contacto primario: `contactType` (típicamente `"email"` o `"phone"`,
    que son los canales que Edugoverna normaliza y despacha), `value`, y
    opcionalmente `label`, `normalizedValue` e `isNotificationEnabled`. El
    upsert es por tipo: escribir un email no borra el teléfono existente, sólo
    le quita la marca de primario. Cambiar el valor reinicia la verificación del
    contacto.
  </Property>
</Properties>

---

## Listar sujetos del padrón {{ tag: 'GET', label: '/v1/organizations/:organizationId/directory/subjects' }}

<Row>
  <Col>

    Devuelve una página de titulares del padrón con la proyección parcial descrita arriba.

    Permiso requerido: `partner.subjects.read` · Alcance de conexión: `subjects:read`.

    Este endpoint está pensado para **consultas acotadas**, no para exportar el padrón: como la proyección incluye valores de contacto, rige el control de lecturas masivas y una consulta cuyo total de coincidencias supere los 25 titulares se rechaza con `403 SUBJECT_BULK_READ_APPROVAL_REQUIRED`. La excepción es tu **propio workspace** (la autoconexión `controller_processor_self` de una cuenta con espacio propio): ahí el padrón es tuyo y no hay colegio que proteger, así que el umbral no aplica. Usa el filtro `referenceCode` para resolver titulares puntuales; para recorrer grupos completos compartidos contigo está la lectura ofuscada de [Campañas compartidas](/campanas-compartidas).

    Si la conexión define la condición `onlyActive` en su alcance `subjects:read`, la lista excluye automáticamente a los titulares que no estén en estado `active`.

    ### Parámetros de consulta opcionales

    <Properties>
      <Property name="subjectType" type="string">
        Filtra por tipo de titular: `student` o `guardian`.
      </Property>
      <Property name="referenceCode" type="string">
        Devuelve únicamente el titular con ese código de referencia (a lo más
        un resultado).
      </Property>
      <Property name="limit" type="integer">
        Tamaño de página. Por defecto 100, máximo 250.
      </Property>
      <Property name="cursor" type="string">
        Cursor de la página anterior (`meta.nextCursor`). Ver
        [Paginación](/paginacion).
      </Property>
    </Properties>

  </Col>
  <Col sticky>

    <CodeGroup title="Request" tag="GET" label="/v1/.../directory/subjects">

    ```bash {{ title: 'cURL' }}
    curl -G https://app.edugoverna.com/api/partner/v1/organizations/org_2f7a/directory/subjects \
      -H "Authorization: Bearer {keyId}.{secret}" \
      -d referenceCode=EST-2026-0142
    ```

    ```js
    const response = await fetch(
      'https://app.edugoverna.com/api/partner/v1/organizations/org_2f7a/directory/subjects?referenceCode=EST-2026-0142',
      {
        headers: { Authorization: `Bearer ${keyId}.${secret}` },
      },
    )
    const { subjects, meta } = await response.json()
    ```

    </CodeGroup>

    ```json {{ title: 'Response' }}
    {
      "subjects": [
        {
          "id": "9c1f6d1e-1c9d-4f6a-9a44-1f2ab5c0d9e1",
          "organizationId": "org_2f7a",
          "subjectType": "student",
          "referenceCode": "EST-2026-0142",
          "currentAgeBand": "under_14",
          "currentGeneralConsentAuthority": "guardian",
          "currentSensitiveConsentAuthority": "guardian",
          "status": "active",
          "activeGuardianCount": 1,
          "legalGivenNames": "Martina",
          "legalFamilyNames": "Rojas Pino",
          "preferredName": null,
          "birthDate": null,
          "identifierType": "rut",
          "identifierValue": null,
          "identifierNormalizedValue": null,
          "identifierLast4": "435-2",
          "contactType": "email",
          "contactValue": "apoderado@familia.cl",
          "contactIsNotificationEnabled": true,
          "studentProfile": {
            "currentGradeLevel": "5° Básico",
            "currentEnrollmentYear": 2026,
            "schoolStudentCode": null,
            "nationalStudentNumber": null,
            "hasSpecialNeeds": null,
            "hasHealthAlerts": null,
            "metadata": null
          },
          "guardianProfile": null
          // ...
        }
      ],
      "meta": {
        "projection": {
          "identity": "basic",
          "contact": "full",
          "identifier": "metadata",
          "studentProfile": "redacted",
          "guardianProfile": "redacted"
        },
        "filteredRestrictedCount": 0,
        "totalMatchedCount": 1,
        "nextCursor": null
      }
    }
    ```

  </Col>
</Row>

---

## Upsert de un estudiante {{ tag: 'PUT', label: '/v1/organizations/:organizationId/directory/students/:referenceCode' }}

<Row>
  <Col>

    Crea o rectifica al estudiante identificado por `:referenceCode`. Todos los campos del cuerpo son opcionales: en una rectificación sólo se tocan los campos presentes.

    Permiso requerido: `partner.subjects.write` · Alcance de conexión: `subjects:write`.

    Si el `referenceCode` ya pertenece a un apoderado, la llamada falla con `409 PARTNER_SUBJECT_TYPE_CONFLICT`. Un RUT inválido o ya asignado a otro titular se rechaza antes de escribir nada. Lo mismo vale para el contacto: un correo o teléfono es único por organización, y si ya es de otro titular la llamada falla con `409 SUBJECT_CONTACT_CONFLICT`. En tu propio workspace, `error.details.holderReferenceCode` trae el `referenceCode` del titular que ya lo tiene, para que reconozcas a la misma persona en vez de duplicarla; en la organización de un colegio no se informa. Cada rectificación deja un evento de auditoría `partner_synced` sobre el titular en la organización dueña.

    ### Atributos opcionales

    Además del [bloque de identidad](#campos-de-identidad-compartidos):

    <Properties>
      <Property name="studentProfile" type="object">
        Perfil académico: `schoolStudentCode`, `nationalStudentNumber`,
        `currentGradeLevel`, `currentEnrollmentYear` (2000–2100),
        `hasSpecialNeeds`, `hasHealthAlerts` y `metadata` (objeto libre).
      </Property>
    </Properties>

    La respuesta es el estudiante con la misma proyección parcial del listado.

  </Col>
  <Col sticky>

    <CodeGroup title="Request" tag="PUT" label="/v1/.../directory/students/EST-2026-0142">

    ```bash {{ title: 'cURL' }}
    curl -X PUT https://app.edugoverna.com/api/partner/v1/organizations/org_2f7a/directory/students/EST-2026-0142 \
      -H "Authorization: Bearer {keyId}.{secret}" \
      -H "Content-Type: application/json" \
      -d '{
        "legalGivenNames": "Martina",
        "legalFamilyNames": "Rojas Pino",
        "birthDate": "2015-04-12",
        "identifier": { "identifierType": "rut", "value": "25.678.435-2" },
        "studentProfile": { "currentGradeLevel": "5° Básico", "currentEnrollmentYear": 2026 }
      }'
    ```

    ```js
    const response = await fetch(
      'https://app.edugoverna.com/api/partner/v1/organizations/org_2f7a/directory/students/EST-2026-0142',
      {
        method: 'PUT',
        headers: {
          Authorization: `Bearer ${keyId}.${secret}`,
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          legalGivenNames: 'Martina',
          legalFamilyNames: 'Rojas Pino',
          birthDate: '2015-04-12',
          identifier: { identifierType: 'rut', value: '25.678.435-2' },
          studentProfile: {
            currentGradeLevel: '5° Básico',
            currentEnrollmentYear: 2026,
          },
        }),
      },
    )
    ```

    </CodeGroup>

    ```json {{ title: 'Response' }}
    {
      "id": "9c1f6d1e-1c9d-4f6a-9a44-1f2ab5c0d9e1",
      "subjectType": "student",
      "referenceCode": "EST-2026-0142",
      "status": "active",
      "legalGivenNames": "Martina",
      "legalFamilyNames": "Rojas Pino",
      "birthDate": null,
      "identifierType": "rut",
      "identifierLast4": "435-2",
      "studentProfile": {
        "currentGradeLevel": "5° Básico",
        "currentEnrollmentYear": 2026,
        "hasSpecialNeeds": null,
        "hasHealthAlerts": null
      }
      // ...
    }
    ```

  </Col>
</Row>

---

## Upsert de un apoderado {{ tag: 'PUT', label: '/v1/organizations/:organizationId/directory/guardians/:referenceCode' }}

<Row>
  <Col>

    Crea o rectifica al apoderado identificado por `:referenceCode`. La semántica es idéntica al upsert de estudiante — mismos campos de identidad, mismo `409 PARTNER_SUBJECT_TYPE_CONFLICT` si el código pertenece a un estudiante, mismo evento de auditoría `partner_synced` en rectificaciones.

    Permiso requerido: `partner.subjects.write` · Alcance de conexión: `subjects:write`.

    ### Atributos opcionales

    Además del [bloque de identidad](#campos-de-identidad-compartidos):

    <Properties>
      <Property name="guardianProfile" type="object">
        Perfil del apoderado: `relationshipLabel` (máx. 80),
        `emergencyPriority` (0–10), `canPickUpStudent` y `metadata`.
      </Property>
    </Properties>

    El contacto primario del apoderado es lo que el motor de consentimientos usa para despachar solicitudes cuando el estudiante es menor, así que conviene mantenerlo al día.

  </Col>
  <Col sticky>

    <CodeGroup title="Request" tag="PUT" label="/v1/.../directory/guardians/APO-889">

    ```bash {{ title: 'cURL' }}
    curl -X PUT https://app.edugoverna.com/api/partner/v1/organizations/org_2f7a/directory/guardians/APO-889 \
      -H "Authorization: Bearer {keyId}.{secret}" \
      -H "Content-Type: application/json" \
      -d '{
        "legalGivenNames": "Carolina",
        "legalFamilyNames": "Pino Soto",
        "contact": { "contactType": "email", "value": "carolina.pino@familia.cl" },
        "guardianProfile": { "relationshipLabel": "Madre" }
      }'
    ```

    ```js
    const response = await fetch(
      'https://app.edugoverna.com/api/partner/v1/organizations/org_2f7a/directory/guardians/APO-889',
      {
        method: 'PUT',
        headers: {
          Authorization: `Bearer ${keyId}.${secret}`,
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          legalGivenNames: 'Carolina',
          legalFamilyNames: 'Pino Soto',
          contact: { contactType: 'email', value: 'carolina.pino@familia.cl' },
          guardianProfile: { relationshipLabel: 'Madre' },
        }),
      },
    )
    ```

    </CodeGroup>

    ```json {{ title: 'Response' }}
    {
      "id": "5d2a8c3b-77e1-4b0e-9f1d-3c4e5f6a7b8c",
      "subjectType": "guardian",
      "referenceCode": "APO-889",
      "status": "active",
      "legalGivenNames": "Carolina",
      "legalFamilyNames": "Pino Soto",
      "contactType": "email",
      "contactValue": "carolina.pino@familia.cl",
      "guardianProfile": {
        "relationshipLabel": "Madre",
        "emergencyPriority": 0,
        "canPickUpStudent": true,
        "metadata": null
      }
      // ...
    }
    ```

  </Col>
</Row>

---

## Upsert de un vínculo {{ tag: 'PUT', label: '/v1/organizations/:organizationId/directory/guardianships/:studentReferenceCode/:guardianReferenceCode' }}

<Row>
  <Col>

    Crea o actualiza el vínculo entre el estudiante y el apoderado identificados en la ruta. Ambos titulares deben existir previamente; si alguno no existe la llamada falla con `404 PARTNER_SUBJECT_NOT_FOUND`, y si un código pertenece al tipo equivocado, con `409 PARTNER_SUBJECT_TYPE_CONFLICT`.

    Permiso requerido: `partner.guardianships.write` · Alcance de conexión: `guardianships:write`.

    Un vínculo creado por esta ruta nace con `provenance: "partner_synced"`: el colegio ve que llegó de tu padrón y no lo confunde con un registro administrativo propio ni con la auto-declaración de un apoderado en una campaña pública. Un vínculo que ya existía conserva su procedencia. Para respaldarlo con evidencia está [el documento de autoridad](#adjuntar-un-documento-de-autoridad).

    En una actualización, los campos omitidos conservan su valor anterior (`relationshipType` es el único siempre requerido). Las actualizaciones dejan un evento de auditoría `updated` sobre el vínculo.

    ### Atributos requeridos

    <Properties>
      <Property name="relationshipType" type="string">
        Tipo de relación (por ejemplo `"madre"`, `"padre"`, `"tutor_legal"`).
        Entre 2 y 80 caracteres.
      </Property>
    </Properties>

    ### Atributos opcionales

    <Properties>
      <Property name="authorityScope" type="string">
        Alcance de la autoridad. Por defecto `"full"`.
      </Property>
      <Property name="canConsentGeneral" type="boolean">
        Puede otorgar consentimiento para tratamiento general. Por defecto `true`.
      </Property>
      <Property name="canConsentSensitive" type="boolean">
        Puede otorgar consentimiento sobre datos sensibles. Por defecto `true`.
      </Property>
      <Property name="canExerciseRights" type="boolean">
        Puede ejercer derechos en nombre del estudiante. Por defecto `true`.
      </Property>
      <Property name="priority" type="integer">
        Prioridad del apoderado (0–100). Por defecto 0.
      </Property>
      <Property name="status" type="string">
        Estado del vínculo. Por defecto `"active"`.
      </Property>
      <Property name="validFrom" type="timestamp">
        Inicio de vigencia del vínculo.
      </Property>
      <Property name="validTo" type="timestamp">
        Fin de vigencia del vínculo.
      </Property>
      <Property name="notes" type="string">
        Notas libres. Máximo 1000 caracteres.
      </Property>
    </Properties>

  </Col>
  <Col sticky>

    <CodeGroup title="Request" tag="PUT" label="/v1/.../guardianships/EST-2026-0142/APO-889">

    ```bash {{ title: 'cURL' }}
    curl -X PUT https://app.edugoverna.com/api/partner/v1/organizations/org_2f7a/directory/guardianships/EST-2026-0142/APO-889 \
      -H "Authorization: Bearer {keyId}.{secret}" \
      -H "Content-Type: application/json" \
      -d '{ "relationshipType": "madre", "canConsentSensitive": true }'
    ```

    ```js
    const response = await fetch(
      'https://app.edugoverna.com/api/partner/v1/organizations/org_2f7a/directory/guardianships/EST-2026-0142/APO-889',
      {
        method: 'PUT',
        headers: {
          Authorization: `Bearer ${keyId}.${secret}`,
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          relationshipType: 'madre',
          canConsentSensitive: true,
        }),
      },
    )
    ```

    </CodeGroup>

    ```json {{ title: 'Response' }}
    {
      "id": "1b7d9e2f-4a6c-4d8e-b0f1-2c3d4e5f6a7b",
      "organizationId": "org_2f7a",
      "studentSubjectId": "9c1f6d1e-1c9d-4f6a-9a44-1f2ab5c0d9e1",
      "guardianSubjectId": "5d2a8c3b-77e1-4b0e-9f1d-3c4e5f6a7b8c",
      "relationshipType": "madre",
      "authorityScope": "full",
      "canConsentGeneral": true,
      "canConsentSensitive": true,
      "canExerciseRights": true,
      "priority": 0,
      "status": "active",
      "validFrom": null,
      "validTo": null,
      "notes": null,
      "provenance": "partner_synced",
      "createdAt": "2026-03-02T14:11:09.000Z",
      "updatedAt": "2026-08-25T12:30:00.000Z"
    }
    ```

  </Col>
</Row>

---

## Adjuntar un documento de autoridad {{ tag: 'POST', label: '/v1/organizations/:organizationId/directory/guardianships/:studentReferenceCode/:guardianReferenceCode/authority-documents' }}

<Row>
  <Col>

    Sube la evidencia que respalda un vínculo — poder notarial, resolución de cuidado personal, certificado de nacimiento — como `multipart/form-data`. El archivo queda en el almacenamiento gestionado del colegio y el documento se adjunta en estado `pending`: el colegio lo verifica o lo rechaza desde su consola, tú aportas la evidencia. Responde `201` con el documento y deja el evento de auditoría `guardian_authority_document · uploaded_by_partner`.

    Permiso requerido: `partner.guardianships.write` · Alcance de conexión: `guardianships:write`.

    Un vínculo que no existe responde `404 GUARDIANSHIP_NOT_FOUND`. Se aceptan PDF, JPEG y PNG de hasta 10 MB (`415 UPLOAD_TYPE_UNSUPPORTED`, `413 UPLOAD_TOO_LARGE`).

    ### Partes del formulario

    <Properties>
      <Property name="file" type="file">
        El documento (requerido).
      </Property>
      <Property name="documentType" type="string">
        Tipo de documento (2–80 caracteres), requerido.
      </Property>
      <Property name="issuingAuthority" type="string">
        Quién lo emitió (máx. 160).
      </Property>
      <Property name="documentNumber" type="string">
        Número del documento (máx. 160). Se guarda cifrado.
      </Property>
      <Property name="issuedAt / effectiveFrom / effectiveTo" type="date">
        Fechas del documento (ISO 8601).
      </Property>
    </Properties>

  </Col>
  <Col sticky>

    <CodeGroup title="Request" tag="POST" label="/v1/.../guardianships/EST-2026-0142/APO-2026-0088/authority-documents">

    ```bash {{ title: 'cURL' }}
    curl https://app.edugoverna.com/api/partner/v1/organizations/org_2f7a/directory/guardianships/EST-2026-0142/APO-2026-0088/authority-documents \
      -H "Authorization: Bearer {keyId}.{secret}" \
      -F "documentType=power_of_attorney" \
      -F "issuingAuthority=Notaría 12 de Santiago" \
      -F "file=@poder.pdf;type=application/pdf"
    ```

    ```js
    const form = new FormData()
    form.set('documentType', 'power_of_attorney')
    form.set('issuingAuthority', 'Notaría 12 de Santiago')
    form.set('file', new File([bytes], 'poder.pdf', { type: 'application/pdf' }))
    const response = await fetch(
      'https://app.edugoverna.com/api/partner/v1/organizations/org_2f7a/directory/guardianships/EST-2026-0142/APO-2026-0088/authority-documents',
      { method: 'POST', headers: { Authorization: `Bearer ${keyId}.${secret}` }, body: form },
    )
    const document = await response.json()
    ```

    </CodeGroup>

    ```json {{ title: 'Response' }}
    {
      "id": "6a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
      "guardianshipId": "1b7d9e2f-4a6c-4d8e-b0f1-2c3d4e5f6a7b",
      "documentType": "power_of_attorney",
      "issuingAuthority": "Notaría 12 de Santiago",
      "artifactId": "art_9f1c",
      "verificationStatus": "pending",
      "createdAt": "2026-08-25T12:30:00.000Z"
    }
    ```

  </Col>
</Row>

---

## Upsert de una matrícula {{ tag: 'PUT', label: '/v1/organizations/:organizationId/directory/students/:studentReferenceCode/enrollments/:schoolYear' }}

<Row>
  <Col>

    Crea o actualiza la matrícula del estudiante para el año escolar `:schoolYear` (entero entre 2000 y 2100; un valor fuera de rango responde `422 VALIDATION_ERROR`). La matrícula es única por estudiante y año, así que repetir la llamada actualiza la misma fila.

    Permiso requerido: `partner.enrollments.write` · Alcance de conexión: `enrollments:write`.

    Si el `:studentReferenceCode` no existe o pertenece a un apoderado, la llamada falla con `404 PARTNER_SUBJECT_NOT_FOUND` o `409 PARTNER_SUBJECT_TYPE_CONFLICT` respectivamente.

    ### Atributos opcionales

    <Properties>
      <Property name="enrollmentStatus" type="string">
        Estado de la matrícula. Por defecto `"enrolled"`.
      </Property>
      <Property name="gradeLevel" type="string">
        Nivel (por ejemplo `"5° Básico"`).
      </Property>
      <Property name="courseCode" type="string">
        Código del curso (por ejemplo `"5B"`).
      </Property>
      <Property name="courseName" type="string">
        Nombre del curso.
      </Property>
      <Property name="enrollmentSource" type="string">
        Origen del dato de matrícula en tu sistema.
      </Property>
      <Property name="admittedAt" type="timestamp">
        Fecha de admisión. Por defecto, el momento de la creación.
      </Property>
      <Property name="withdrawnAt" type="timestamp">
        Fecha de retiro, si corresponde.
      </Property>
      <Property name="externalStudentId" type="string">
        Identificador del estudiante en el sistema de origen.
      </Property>
      <Property name="metadata" type="object">
        Objeto libre con datos adicionales.
      </Property>
    </Properties>

  </Col>
  <Col sticky>

    <CodeGroup title="Request" tag="PUT" label="/v1/.../students/EST-2026-0142/enrollments/2026">

    ```bash {{ title: 'cURL' }}
    curl -X PUT https://app.edugoverna.com/api/partner/v1/organizations/org_2f7a/directory/students/EST-2026-0142/enrollments/2026 \
      -H "Authorization: Bearer {keyId}.{secret}" \
      -H "Content-Type: application/json" \
      -d '{ "gradeLevel": "5° Básico", "courseCode": "5B", "courseName": "5° Básico B" }'
    ```

    ```js
    const response = await fetch(
      'https://app.edugoverna.com/api/partner/v1/organizations/org_2f7a/directory/students/EST-2026-0142/enrollments/2026',
      {
        method: 'PUT',
        headers: {
          Authorization: `Bearer ${keyId}.${secret}`,
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          gradeLevel: '5° Básico',
          courseCode: '5B',
          courseName: '5° Básico B',
        }),
      },
    )
    ```

    </CodeGroup>

    ```json {{ title: 'Response' }}
    {
      "id": "7e5f3a1c-9b8d-4c2e-a6f0-1d2e3f4a5b6c",
      "organizationId": "org_2f7a",
      "studentSubjectId": "9c1f6d1e-1c9d-4f6a-9a44-1f2ab5c0d9e1",
      "schoolYear": 2026,
      "enrollmentStatus": "enrolled",
      "gradeLevel": "5° Básico",
      "courseCode": "5B",
      "courseName": "5° Básico B",
      "enrollmentSource": null,
      "admittedAt": "2026-03-01T12:00:00.000Z",
      "withdrawnAt": null,
      "externalStudentId": null,
      "createdAt": "2026-03-01T12:00:00.000Z",
      "updatedAt": "2026-08-25T12:30:00.000Z"
    }
    ```

  </Col>
</Row>
