> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developer.crehana.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.crehana.com/_mcp/server.

## Nuevo endpoint para crear turnos

`POST /org/{slug}/time/attendance/shifts/` crea un turno de Asistencia, fijo o
rotativo, con sus descansos y tolerancias, igual que un administrador desde
Crehana. Está pensado para sistemas de RR. HH. o de planificación que son
dueños de los horarios.

```json
{
  "shift_type": "NON_ROTATING",
  "name": "Mañana 09-18",
  "weekly_schedule": [
    { "day": "MONDAY", "entry_time": "09:00", "exit_time": "18:00" },
    { "day": "TUESDAY", "entry_time": "09:00", "exit_time": "18:00" },
    { "day": "WEDNESDAY", "entry_time": "09:00", "exit_time": "18:00" },
    { "day": "THURSDAY", "entry_time": "09:00", "exit_time": "18:00" },
    { "day": "FRIDAY", "entry_time": "09:00", "exit_time": "18:00" }
  ]
}
```

La respuesta trae el `id` del turno y, en un rotativo, el `id` de cada ciclo:
son el `shift_id` y el `start_cycle_id` que pide
[Asignar turnos](/documentacion/casos-de-uso/asignar-turnos). Los días que no
se mandan son de descanso, las horas van en `HH:MM` y una salida menor que la
entrada es un turno nocturno.

El nombre es único entre los turnos activos de la organización: reenviar la
misma creación responde `409` con el id del turno que ya existe, así que un
reintento nunca duplica. Requiere credenciales de un administrador de la
organización.

Guía completa en [Crear turnos](/documentacion/casos-de-uso/crear-turnos).

## Nuevo reporte: resultados de evaluaciones por clase

`GET /api/v5/rest/org/{organization_slug}/reports/learning/quiz-results/`
devuelve los resultados de los **quizzes de clase** (las evaluaciones de cada
video, no la evaluación final del curso, que ya está en
`reports/learning/quizzes`) con una fila por usuario, curso y quiz. Es la misma
información del Excel "Resultados de Evaluaciones por Clase" del panel de
administración, lista para integrar.

Cada fila consolida los intentos: `attempts_count`, las fechas del primero,
el último y el mejor intento (`first_attempt_at`, `last_attempt_at`,
`best_attempt_at`, en UTC), el puntaje del último intento (`score`) y el más
alto (`best_score`), el mínimo para aprobar (`passing_percentage`), respuestas
correctas e incorrectas, total de preguntas, duración y límite de tiempo en
segundos (`time_limit_seconds`, `null` cuando no hay límite) y el estado del
último intento (`status`: `approved`, `failed`, `incomplete` o `not_started`).
También viene el curso (`course_id`, `course_title`), el quiz (`quiz_id`,
`quiz_name`, `quiz_type` `summative` o `formative`) y la persona (`user_id`,
`user_full_name`, `user_email`, `user_document`).

Filtros: `course_id` (repetible, hasta 100), `user_email`, `document`, `status`
y el rango `from_date` / `to_date` sobre `last_attempt_at`. Las filas llegan
ordenadas por `last_attempt_at`, de la más reciente a la más antigua, y se
recorren con `cursor` / `next_cursor` (`limit` hasta 500). Este reporte no
acepta `offset`.

```json
{
  "total": 45,
  "next_cursor": "cXVpel9yZXN1bHRzOlsiMjAyNi0wMy0xMFQxOTozNDoxNSIsMjQ4Nzg4XQ==",
  "has_next_page": true,
  "results": [
    {
      "course_id": 47847,
      "course_title": "Curso con quiz",
      "user_id": 6816375,
      "user_full_name": "Ana Pérez",
      "user_email": "ana@empresa.com",
      "user_document": "0000000002",
      "quiz_id": 20461,
      "quiz_name": "Evaluación como clase 1",
      "quiz_type": "summative",
      "evaluation_type": "class",
      "attempts_count": 2,
      "first_attempt_at": "2026-03-10T19:30:00+00:00",
      "last_attempt_at": "2026-03-10T19:34:15+00:00",
      "best_attempt_at": "2026-03-10T19:34:15+00:00",
      "correct_answers": 8,
      "incorrect_answers": 1,
      "total_questions": 9,
      "passing_percentage": 80,
      "score": 88.89,
      "best_score": 88.89,
      "status": "approved",
      "duration_seconds": 60,
      "time_limit_seconds": null
    }
  ]
}
```