Skip to Content
Guías por caso de usoNómina y asesoría laboral

Nómina y asesoría laboral

Objetivo: alimentar tu software de nómina con horas efectivas, ausencias y saldos de vacaciones de un período, sin exportar manualmente.

Scopes necesarios: org:fichajes:read, org:ausencias:read, org:saldos:read.

Los tres recursos clave:

Work summaries: horas del período

work-summaries devuelve una fila por empleado × período con los agregados ya calculados (no eventos de fichaje). Filtra por period=day|month y un rango from/to (≤ 1 año).

curl -s "$KINMU_BASE_URL/work-summaries?period=month&from=2026-06-01&to=2026-06-30" \ -H "Authorization: Bearer $KINMU_API_KEY"
{ "data": [ { "employee_id": "a1b2…", "period_start": "2026-06-01", "period_end": "2026-06-30", "worked_minutes": 9600, "break_minutes": 1200, "night_minutes": 300, "overtime_minutes": 240, "expected_minutes": 9600, "balance_minutes": 0, "banked_hours_balance_minutes": 120, "absences_minutes": 480, "source_days": 21 } ], "meta": { "next_cursor": null, "has_more": false } }

Campos relevantes para nómina:

CampoUso
worked_minutesTiempo efectivo trabajado.
night_minutesMinutos en horario nocturno (pluses).
overtime_minutesHoras extra del período.
expected_minutesJornada teórica según contrato.
balance_minutesDiferencia trabajado − esperado.
banked_hours_balance_minutesSaldo de la bolsa de horas.
absences_minutesMinutos de ausencia en el período.

work-summaries y vacation-balances ignoran updated_since (se acepta por compatibilidad, obsoleto, retirada el 27-08-2027): para refrescar un cierre, vuelve a pedir el rango (from/to, year) en lugar de intentar un delta.

Los agregados mensuales pueden servirse desde snapshots consolidados. Si tu cierre depende de datos del día en curso, ten en cuenta una posible latencia de consolidación y cierra sobre períodos ya completos.

Ausencias del período

Cruza las ausencias aprobadas que solapan el período de nómina para aplicar bajas y deducciones:

curl -s "$KINMU_BASE_URL/absences?status=approved&from=2026-06-01&to=2026-06-30" \ -H "Authorization: Bearer $KINMU_API_KEY"

Cada ausencia trae type como { key, label } (la key es estable: holidays, sick-leave, o tipos custom de tu empresa) y days_count. Usa siempre la key en tu lógica.

Las claves disponibles en tu empresa salen de GET /v1/absence-types (scope org:ausencias:read). Mapea tus conceptos de nómina contra esa lista una vez y vuelve a consultarla si tu empresa crea tipos nuevos. vacation y sick_leave se aceptan como alias de holidays y sick-leave. Al crear una ausencia con un tipo que no está en el catálogo recibirás 422 validation_failed con las claves válidas.

curl -s "$KINMU_BASE_URL/absence-types?limit=100" \ -H "Authorization: Bearer $KINMU_API_KEY"

Si importas ausencias que ya están aprobadas en tu sistema, usa status_on_create=approved: Kinmu descuenta el saldo y retira los turnos afectados igual que si las aprobara un responsable. Para empleados dados de baja puedes importar el histórico hasta su termination_date; lo posterior devuelve 422 validation_failed.

Saldos de vacaciones

Para el cierre anual o para provisiones, consulta los saldos por empleado y año:

curl -s "$KINMU_BASE_URL/vacation-balances?year=2026" \ -H "Authorization: Bearer $KINMU_API_KEY"
{ "data": [ { "employee_id": "a1b2…", "year": 2026, "entitled_days": 23, "used_days": 10.5, "pending_days": 2, "remaining_days": 10.5, "carry_over_days": 0, "carry_over_expires_at": null } ] }

Los días admiten medias jornadas (10.5); trátalos como número decimal aunque muchos valores sean enteros. carry_over_expires_at es el último día para disfrutar los días arrastrados del año anterior, o null si tu empresa no tiene arrastre o no le ha puesto plazo.

Flujo de cierre mensual

Lista los empleados activos del período

GET /v1/employees?status=active (pagina con cursor si tienes más de 100).

Si tu integración también da de alta empleados, POST /v1/employees puede responder 402 billing_required: la suscripción está activa pero el plan se ha quedado sin asientos. Amplía el plan en el panel; reintentar sin cambiar nada devuelve el mismo 402. El email del empleado es único por empresa, no global.

Descarga los work-summaries del mes

GET /v1/work-summaries?period=month&from=…&to=….

Cruza las ausencias aprobadas

GET /v1/absences?status=approved&from=…&to=….

Para la inspección de trabajo, pide el informe time_registry_monthly (RD-ley 8/2019):

curl -s -X POST "$KINMU_BASE_URL/reports" \ -H "Authorization: Bearer $KINMU_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{ "type": "time_registry_monthly", "format": "csv", "params": { "month": "2026-06" } }'

Formatos: csv o xlsx (xlsx solo para check_ins_export). Recibirás 202 { "id": "…", "status": "processing" }. Haz polling a GET /v1/reports/{id} hasta status=completed; entonces la respuesta incluye download_url, una URL firmada temporal (TTL 5 min, un solo uso). La firma es la credencial: descarga el fichero desde esa URL sin cabecera Authorization:

# 1) obtener la download_url (solo aparece cuando status=completed) DL=$(curl -s "$KINMU_BASE_URL/reports/<id>" \ -H "Authorization: Bearer $KINMU_API_KEY" | jq -r '.download_url') # 2) descargar el fichero desde la URL firmada (sin Bearer; un solo uso, 5 min) curl -s -L "$DL" -o registro-horario-2026-06.csv

El scope org:informes:read es obligatorio para solicitar el informe. La download_url es de un solo uso y caduca en 5 minutos: pídela y descárgala en el momento.

En los CSV, las celdas de texto que empiezan por =, +, - o @ llevan un apóstrofo delante para que la hoja de cálculo no las ejecute como fórmula; los números salen tal cual. La URL de descarga deja de valer si se revoca la key que pidió el informe o la cuenta pierde el servicio: pide el informe de nuevo con una key válida.

Last updated on