Ksiopea·
OpenAPI
Ksiopea · Integración

API de horarios

Lectura del horario que genera Ksiopea, para que el gestor del centro y otros sistemas lo consuman sin credenciales de persona. Solo lectura, por centro, versionada. El contrato es OpenAPI 3.1: se importa en Postman, Insomnia o un generador de clientes, y el backend se construye contra ese mismo documento.

Especificación · borrador para integración

AutenticaciónClave de API por centro

Cada centro genera su clave desde el panel de administración. Se muestra una sola vez y se guarda hasheada; ámbito solo lectura, revocable en cualquier momento. Se envía en la cabecera:

Authorization: Bearer ksio_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxx

Para pruebas de integración se emiten claves de sandbox (ksio_test_...) sobre un centro de ejemplo.

Base y versionadoRutas estables

Un cambio incompatible sube la versión de la ruta (/v2); nunca se rompe /v1 en silencio.

RecursosEndpoints

MétodoRutaDevuelve
GET/centerMetadatos del centro (nombre, etapas, curso activo).
GET/schedulesHorarios publicados.
GET/schedules/{sid}Cabecera + marcos horarios (campanas por día).
GET/schedules/{sid}/groupsGrupos con su código.
GET/schedules/{sid}/teachersDocentes con su código (idnumber/nick).
GET/schedules/{sid}/roomsAulas con su código.
GET/schedules/{sid}/subjectsMaterias con su código.
GET/schedules/{sid}/timetableSin filtro, el horario completo; con group, teacher o room, esa entidad. format=cifra devuelve los códigos Cifra.
GET/schedules/{sid}/icsFeed ICS suscribible (Google/Microsoft).

Usa current como sid para el horario publicado vigente, sin listar.

EjemploEl horario de un grupo

curl "https://api.ksiopea.com/v1/schedules/sched_2526_def/timetable?group=3esoA" \
  -H "Authorization: Bearer ksio_live_xxxx"
{
  "schedule_id": "sched_2526_def",
  "entity": { "id": "3esoA", "code": "3ESOA", "name": "3º ESO A" },
  "sessions": [
    {
      "day": 2, "slot": 2, "start": "09:55", "end": "10:50",
      "subject": { "id": "MAT", "name": "Matemáticas" },
      "teacher": { "id": "a1b2", "code": "P034", "name": "Docente 34" },
      "room":    { "id": "r12",  "code": "12",   "name": "Aula 12" },
      "kind": "class"
    }
  ]
}

Los tramos siguen el marco del grupo (campanas desfasadas entre etapas ya resueltas). No se expone dato alguno de alumnado.

FormatosCualquier SIS · Cifra e ICS

El formato nativo es el general y sirve a cualquier gestor. format=cifra es solo una comodidad para reconciliar con ese SIS, no una integración exclusiva.

ErroresRespuestas

Los errores llegan como { "error": { "code", "message" } } con el HTTP coherente:

HTTPcodeCuándo
401unauthorizedClave ausente o inválida.
403forbiddenClave revocada o fuera de ámbito.
404not_foundRecurso inexistente.
400bad_requestParámetros incorrectos.
429rate_limitedLímite por clave; reintenta según Retry-After.

IntegrarPrimeros pasos

Hablemos de integración

Cuéntanos de tu sistema y lo vemos con tu equipo.