API Dialect

Integración de Santillana con Dialect: que un alumno rinda el diagnóstico desde una plataforma externa, cargar colegios y alumnos, y leer resultados.

Inicio rápido

URL base: https://dialect.click/api

Antes de que un alumno pueda rendir, su colegio crea el diagnóstico en Dialect, asigna al alumno y lo habilita. La API no crea colegios, alumnos ni diagnósticos.

Flujo

  1. Ingreso: con el RUT se obtiene el alumno y sus pruebas pendientes.
  2. Iniciar: con el código de una prueba se obtienen sus preguntas y las de todas las pruebas que podrían seguir.
  3. Responder: una llamada por pregunta, en orden. La respuesta indica si la prueba terminó.
  4. Cuando una prueba termina, el servidor asigna las siguientes según el puntaje. Se vuelve al paso 1 para verlas, o se sigue directo con la tabla siguientesPorCorrectas.
RUT ──► POST /public/dialect/alumno ──► pruebas[].codigo
                                             │
codigo ──► POST /public/dialect/{codigo}/iniciar/{alumnoId} ──► prueba + items
                                             │
cada item ──► POST /public/dialect/alumno/{alumnoId}/prueba/{pruebaDialectId}/responder
                                             │
                                completado: true ──► siguiente prueba

1. Ingreso del alumno

POST/api/public/dialect/alumno
CampoTipoDescripción
rutstringRUT chileno con dígito verificador. Acepta puntos y guion: 12.345.678-5 o 123456785.
curl -X POST https://dialect.click/api/public/dialect/alumno \
  -H "Content-Type: application/json" \
  -d '{"rut":"12.345.678-5"}'

Respuesta 200:

{
  "alumno": { "id": "6f1c2a9e-…", "nombre": "Martina R." },
  "pruebas": [
    { "codigo": "A3F09C", "nombre": "Comprensión lectora 1° Básico", "estado": "PENDIENTE" }
  ]
}
CampoDescripción
alumno.nombrePrimer nombre e iniciales, para mostrar en pantalla.
pruebasPruebas habilitadas y no terminadas, en el orden en que se deben rendir. Vacía si no tiene nada pendiente.
codigoCódigo del diagnóstico: 6 caracteres hexadecimales en mayúscula. Se usa para iniciar.
estadoPENDIENTE (no ha empezado) o EN_PROGRESO (tiene respuestas).

2. Iniciar una prueba

POST/api/public/dialect/{codigo}/iniciar/{alumnoId}

Sin cuerpo. Marca la prueba como iniciada y devuelve todo lo necesario para rendirla. Si el alumno ya había respondido preguntas, vienen en respondidas para continuar desde ahí.

curl -X POST https://dialect.click/api/public/dialect/A3F09C/iniciar/6f1c2a9e-…

Respuesta 201:

{
  "sesionId": "b2e4…",
  "prueba": {
    "id": "0d1f84bb-…",
    "tipo": "COMPRENSION",
    "subproceso": null,
    "nivel": "BASICO_1",
    "erroresParaCortar": 5,
    "ventanaParaCortar": 5
  },
  "items": [
    {
      "id": "5264b63a-…",
      "orden": 1,
      "pasaje": null,
      "stem": "",
      "imagen": "/items-dialect/d1-item1.jpg",
      "audio": null,
      "opcionA": "cantar",
      "opcionB": "ayudar",
      "opcionC": "ocultar",
      "opcionD": "dormir",
      "claveCorrecta": "B",
      "pruebaId": "0d1f84bb-…"
    }
  ],
  "respondidas": [
    { "itemId": "5264b63a-…", "orden": 1, "opcionSeleccionada": "B", "esCorrecta": true }
  ],
  "siguientesPorCorrectas": [["c129217b-…"], ["c129217b-…"], …, []],
  "siguientes": [
    { "prueba": { "id": "c129217b-…", "tipo": "SUBPROCESO", "subproceso": "RECONOCIMIENTO_PALABRAS", … },
      "items": [ … ],
      "siguientesPorCorrectas": [ … ] }
  ]
}

Prueba

CampoDescripción
idIdentificador de la prueba. Se usa al responder.
tipoCOMPRENSION (prueba principal) o SUBPROCESO (subprueba de diagnóstico fino).
subprocesoSolo subpruebas: COMPRENSION_AUDITIVA, CONOCIMIENTO_ALFABETO, RECONOCIMIENTO_PALABRAS, CONCIENCIA_FONOLOGICA, CONCEPTO_IMPRESO, VOCABULARIO.
nivelCurso del alumno: KINDER, BASICO_1 … BASICO_8, MEDIO_1 … MEDIO_4.
erroresParaCortar, ventanaParaCortarRegla de corte. Ver Corte. null si la prueba no se corta.

Item (pregunta)

CampoDescripción
ordenPosición. Las preguntas se presentan en orden ascendente.
pasajeTexto de lectura asociado, o null.
stemEnunciado. [[]] marca el espacio a completar.
imagen, audioRuta relativa al medio, o null. Ver Medios.
opcionA … opcionDAlternativas. opcionC y opcionD pueden ser null. En subpruebas con imágenes, la alternativa es una ruta de imagen.
claveCorrectaLetra correcta. Permite calificar y aplicar el corte sin conexión; el servidor vuelve a calificar al recibir la respuesta.

3. Responder una pregunta

POST/api/public/dialect/alumno/{alumnoId}/prueba/{pruebaDialectId}/responder
CampoTipoDescripción
itemIdstringPregunta respondida.
opcionSeleccionadastringA, B, C, D o SIN_RESPUESTA (se acabó el tiempo de la pregunta).
curl -X POST https://dialect.click/api/public/dialect/alumno/6f1c2a9e-…/prueba/0d1f84bb-…/responder \
  -H "Content-Type: application/json" \
  -d '{"itemId":"5264b63a-…","opcionSeleccionada":"B"}'

Respuesta 201:

{ "esCorrecta": true, "completado": false, "totalRespondidas": 1 }

Al terminar la prueba (última pregunta o corte):

{ "esCorrecta": false, "completado": true, "totalRespondidas": 24, "hasPruebasPendientes": true }
CampoDescripción
completadotrue cuando la prueba terminó. No enviar más respuestas de esa prueba.
hasPruebasPendientesSolo al terminar: el alumno tiene otra prueba por rendir (por ejemplo, una subprueba recién asignada).

Corte y siguientes pruebas

Corte

La prueba termina antes de la última pregunta si, entre las últimas ventanaParaCortar respuestas, hay erroresParaCortar o más incorrectas. Ejemplo con 5 y 5: termina al quinto error seguido. SIN_RESPUESTA cuenta como incorrecta.

Siguientes pruebas

Según las correctas obtenidas, el servidor asigna subpruebas al terminar. Para seguir sin volver al ingreso (o sin conexión), siguientesPorCorrectas[n] lista los id de las pruebas que siguen si el alumno terminó con n correctas. Cada una viene completa en siguientes, con su propia tabla. Lista vacía: no sigue ninguna.

correctas = respuestas correctas de la prueba terminada
proximas  = siguientesPorCorrectas[correctas]

Las respuestas de esas pruebas se envían al mismo endpoint de responder, con el pruebaDialectId de cada una, después de que la prueba anterior quedó completado: true.

Audios e imágenes

Las rutas de imagen, audio y alternativas con imagen son relativas a https://dialect.click:

"/items-dialect/d1-item1.jpg"  →  https://dialect.click/items-dialect/d1-item1.jpg

Si audio es null en una prueba de dictado, el enunciado se lee con síntesis de voz en español.

Errores

Los errores responden { "statusCode", "message", "error" } con un mensaje que indica qué falló.

CódigoCuándo
400Datos inválidos: RUT mal formado, opcionSeleccionada fuera de las permitidas, o pregunta que no pertenece a la prueba.
403El profesor aún no habilitó al alumno.
404RUT sin alumno activo, código inexistente, alumno no asignado, pregunta inexistente, o alumno sin la prueba asignada.
409Diagnóstico cerrado por el colegio, o prueba ya completada.
429Demasiadas solicitudes. Esperar y reintentar.
5xxFalla del servidor. Reintentar; las respuestas no se duplican.

Límites

Integración de sistemas

Para que los sistemas de Santillana carguen colegios y alumnos y lean resultados, sin intervención de una persona.

curl https://dialect.click/api/integracion/santillana/colegios/00000000-0000-1000-0000-000000001135/resultados?anioEscolar=2026 \
  -H "X-API-Key: $DIALECT_API_KEY"

Crear o actualizar colegio

PUT/api/integracion/santillana/colegios/{santillanaId}
CampoTipoDescripción
nombrestringObligatorio.
direccionstringOpcional. Si no se envía, se mantiene la actual.

Si el colegio no existe en Dialect se crea; si existe se actualiza. Se puede llamar las veces que sea necesario.

curl -X PUT https://dialect.click/api/integracion/santillana/colegios/00000000-0000-1000-0000-000000001135 \
  -H "X-API-Key: $DIALECT_API_KEY" -H "Content-Type: application/json" \
  -d '{"nombre":"Colegio San Andrés","direccion":"Av. Principal 123, Santiago"}'

Respuesta 200:

{ "santillanaId": "00000000-0000-1000-0000-000000001135", "nombre": "Colegio San Andrés", "direccion": "Av. Principal 123, Santiago", "activo": true }

Cargar alumnos

PUT/api/integracion/santillana/colegios/{santillanaId}/alumnos
CampoTipoDescripción
alumnosarrayEntre 1 y 5.000 alumnos.
alumnos[].rutstringRUT con dígito verificador.
alumnos[].nombrestringNombre completo.
alumnos[].cursostringCurso y letra: Kinder A, 1° Básico A, III° Medio B. Se aceptan variantes como 1 basico a.
curl -X PUT https://dialect.click/api/integracion/santillana/colegios/00000000-0000-1000-0000-000000001135/alumnos \
  -H "X-API-Key: $DIALECT_API_KEY" -H "Content-Type: application/json" \
  -d '{"alumnos":[{"rut":"12.345.678-5","nombre":"Ana Pérez Soto","curso":"1° Básico A"}]}'

Respuesta 200:

{ "creados": 1, "actualizados": 0, "omitidosPreKinder": 0, "cursos": [{ "curso": "1° Básico A", "alumnos": 1 }] }

Respuesta 400 con errores:

{
  "message": "El archivo tiene 2 errores; no se cargó ningún alumno",
  "errores": [
    { "ubicacion": "alumnos[1]", "motivo": "RUT \"1-1\" inválido" },
    { "ubicacion": "alumnos[1]", "motivo": "falta el nombre" }
  ]
}

Cargar alumnos no les asigna pruebas: el colegio crea los diagnósticos y habilita a los alumnos desde Dialect.

Leer resultados

GET/api/integracion/santillana/colegios/{santillanaId}/resultados?anioEscolar={año}

Todos los alumnos del colegio con pruebas asignadas en ese año escolar, cada uno con sus pruebas en el orden en que se asignaron. Los alumnos sin RUT no se incluyen.

{
  "colegio": { "santillanaId": "00000000-0000-1000-0000-000000001135", "nombre": "Colegio San Andrés" },
  "anioEscolar": 2026,
  "alumnos": [
    {
      "rut": "12345678-5",
      "nombre": "Ana Pérez Soto",
      "curso": "1° Básico A",
      "pruebas": [
        { "nombre": "Dialect 1° Básico", "tipo": "COMPRENSION", "subproceso": null, "nivel": "BASICO_1",
          "estado": "COMPLETADO", "fechaInicio": "2026-11-02T12:51:37.533Z", "fechaFin": "2026-11-02T13:10:02.101Z",
          "correctas": 5, "totalRespondidas": 24, "nivelLexile": null, "derivarSubprocesos": true, "nivelSubtest": null },
        { "nombre": "Reconocimiento de palabras 1° Básico", "tipo": "SUBPROCESO", "subproceso": "RECONOCIMIENTO_PALABRAS", "nivel": "BASICO_1",
          "estado": "PENDIENTE", "fechaInicio": null, "fechaFin": null,
          "correctas": null, "totalRespondidas": null, "nivelLexile": null, "derivarSubprocesos": null, "nivelSubtest": null }
      ]
    }
  ]
}
CampoDescripción
estadoPENDIENTE, EN_PROGRESO o COMPLETADO. Los campos de resultado son null hasta completar.
correctas, totalRespondidasPuntaje bruto. totalRespondidas es menor al total de preguntas si la prueba se cortó.
nivelLexileComprensión: DEFICIENTE, BASICO, SATISFACTORIO o AVANZADO, en los cursos donde aplica; si no, null.
derivarSubprocesosComprensión: true si el alumno debe rendir subpruebas de diagnóstico fino.
nivelSubtestSubpruebas: nivel alcanzado en la subprueba, en los cursos donde aplica; si no, null.

Errores de integración

CódigoCuándo
400santillanaId mal formado, campos inválidos, o filas de alumnos con error.
401Header X-API-Key ausente o incorrecto.
404No hay colegio vinculado a ese santillanaId: crearlo primero con PUT /colegios/{santillanaId}.
409Otra carga simultánea tomó alguno de los mismos RUT. Reintentar.