Cambios en la API pública de Crehana.
Sesiones en vivo: listar, crear, invitar y marcar asistencia
Nueva sección Live Sessions con los cuatro endpoints del ciclo completo de una sesión en vivo, para que una integración haga por API lo que hoy solo se puede hacer desde el panel de administración.
Listar las sesiones
GET .../live-sessions/ devuelve las sesiones de la organización, de la más
reciente a la más antigua. status elige el tramo: NEXT (por defecto) las que
todavía no terminaron y PAST las que ya terminaron — para recorrer todo el
calendario hay que pedir los dos. La paginación es por página: first (de 1 a
100, por defecto 10) y page (desde 1). ids acota el listado a las sesiones
que le pases.
Los contadores miran todo el calendario, no la página: total son todas las
sesiones de la organización, y next_sessions_count y past_sessions_count
dicen cuántas hay en cada tramo. results trae solo la página pedida del
status pedido.
Cada sesión trae las fechas dos veces: start_date y end_date son la hora de
reloj en la zona horaria de la sesión (time_zone) y van sin marca de zona, y
start_date_utc / end_date_utc son el mismo instante en UTC. Usá el par UTC
para ordenar o comparar sesiones de zonas distintas.
En la respuesta del POST de creación el par UTC viene en null: el servicio
devuelve ahí la misma hora de reloj que le mandaste, sin convertir. Leé la
sesión con el GET para obtener los instantes en UTC.
Crear una sesión
POST .../live-sessions/ crea la sesión y responde 201 con la sesión creada.
Obligatorios: session_title, description, start_date, end_date,
time_zone y type_session (ONLINE o PRESENCE). Opcionales:
instructor_name, location (el link de la reunión si es ONLINE, la
dirección si es PRESENCE), cover_file_id, resource_file_ids,
participant_user_ids, has_qr_available e issues_certificate.
Las fechas son hora de reloj en time_zone y van sin offset
(2026-10-01T10:00:00). Mandar un offset responde 422: el offset se
descartaría y la sesión quedaría a otra hora que la pedida. end_date tiene que
ser posterior a start_date.
Si la organización ya tiene una sesión con ese título, el título se guarda con
un sufijo numérico — por eso conviene leer el session_title de la respuesta en
vez de asumir el que mandaste.
Invitar participantes
POST .../live-sessions/{id}/participants/ invita usuarios a la sesión. Los
user_ids son los ids de usuario de learning, los que devuelve
GET /org/{slug}/learning/users/ en user.id. Con send_notification: true se
manda el correo de invitación, si la organización tiene esa notificación
activa.
La asignación se procesa en segundo plano: la respuesta es 202 y confirma qué
se aceptó, no qué ya está aplicado. Los usuarios que no pertenecen a la
organización vuelven en invalid_user_ids y no se asignan; si ninguno de los
pedidos pertenece, la respuesta es 422.
Marcar asistencia
POST .../live-sessions/{id}/attendance/ registra la asistencia. Mandá
user_ids con los usuarios a marcar, o all_participants: true para marcar a
todos los participantes de la sesión — uno u otro, no los dos: mandar ambos
responde 422, igual que no mandar ninguno.
También se procesa en segundo plano (202). errors explica cada usuario que
quedó afuera: ya estaba registrado, no se encontró en la organización, o está
inactivo. Si no se pudo registrar a nadie, la respuesta es 422 con esos
mismos motivos.
Una sola organización
Los cuatro endpoints trabajan sobre la organización de la api-key: pedir el
slug de otra organización responde 403, no datos. Un 401 significa que
las credenciales no llegaron o no son válidas, y un 400 que el pedido tiene
un problema de validación — así el motivo del rechazo se distingue sin leer el
detalle.
Listar las politicas de tiempo libre de la organizacion
GET /org/{slug}/timeoff/policies/ devuelve el catálogo de políticas de
ausencia configuradas por la organización: vacaciones, licencias y permisos.
Es la configuración de cada política, no las solicitudes ni los datos de los
colaboradores — para eso sigue estando
GET /org/{slug}/timeoff/requests/.
Cada política trae id, name, description, policy_type (la categoría,
con su id y su name), is_paid, is_unlimited, quantification (DAYS
u HOURS), needs_approvals y status (enabled o disabled).
El id de cada política es el mismo que devuelve policy_id en el listado de
solicitudes, así que podés cruzar ambos recursos sin repetir la configuración
en cada fila.
La paginación es la misma del resto de la sección: limit (de 1 a 50) y
offset. Filtros opcionales: search (por nombre, sin distinguir
mayúsculas), name (nombre exacto), policy_type_ids (repetible) e is_paid.
Un order_by desconocido responde 422.
Sólo se listan políticas de la organización de la api-key: pedir el slug de
otra organización responde 403, no datos.
