Horas fichadas vs planificadas
https://api.afer.pro/api/v1/employees/times/summary
POST https://api.afer.pro/consultarResumenHorario
Por persona y período: horas fichadas, horas planificadas y su desviación.
La llamada para detectar exceso o defecto de jornada sin bajar al apunte. Una fila por persona con actividad en el período, más un bloque totales con la suma de toda la plantilla.
Las horas fichadas cuentan solo apuntes cerrados. Las horas planificadas se calculan desde los tramos del turno de cada día, sumando mañana y tarde y recolocando los que cruzan medianoche — no desde la columna de total de horas de la planificación, que en cuentas antiguas está corrupta y daría jornadas imposibles.
desviacion es horas_fichadas − horas_planificadas: positiva es exceso de jornada, negativa es defecto. ausencias_en_periodo cuenta las ausencias que solapan el rango, que suelen explicar buena parte de las desviaciones negativas.
Envía tus claves API en las cabeceras X-API-KEY y X-API-SECRET. La cuenta sobre la que se opera se resuelve automáticamente a partir de la clave. Cómo obtener tus claves →
Este endpoint requiere autenticación con API key: sin credenciales responde 401.
Solo lectura. Igual que el resto del área de control horario, la API no escribe registros de jornada.
Parámetros del cuerpo
El cuerpo de la petición es un objeto JSON con Content-Type: application/json.
fecha_iniciodateobligatorio | Inicio del período, incluido. Formato YYYY-MM-DD. |
fecha_findateobligatorio | Fin del período, incluido. |
empleadoIdstringopcional | Solo esta persona. |
Ejemplo de petición
curl -X GET 'https://api.afer.pro/api/v1/employees/times/summary?fecha_inicio=2026-05-01&fecha_fin=2026-05-31' \
-H 'X-API-KEY: afer_tk_TU_TOKEN' \
-H 'X-API-SECRET: afer_sk_TU_SECRET'
<?php
$ch = curl_init('https://api.afer.pro/api/v1/employees/times/summary?fecha_inicio=2026-05-01&fecha_fin=2026-05-31');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-KEY: afer_tk_TU_TOKEN',
'X-API-SECRET: afer_sk_TU_SECRET',
]);
$respuesta = json_decode(curl_exec($ch), true);
curl_close($ch);
const respuesta = await fetch('https://api.afer.pro/api/v1/employees/times/summary?fecha_inicio=2026-05-01&fecha_fin=2026-05-31', {
method: 'GET',
headers: {
'X-API-KEY': 'afer_tk_TU_TOKEN',
'X-API-SECRET': 'afer_sk_TU_SECRET'
}
});
const resultado = await respuesta.json();
Respuesta
{
"errorCode": 200,
"errorMsg": "",
"data": {
"periodo": {
"desde": "2026-05-01",
"hasta": "2026-05-31"
},
"total_empleados": 1,
"totales": {
"horas_fichadas": 160,
"horas_planificadas": 168,
"desviacion": -8
},
"empleados": [
{
"empleado": {
"empleadoId": "eMp001…",
"nombre": "Ana",
"apellidos": "Pons Ferrer"
},
"horas_fichadas": 160,
"horas_planificadas": 168,
"desviacion": -8,
"dias_fichados": 20,
"dias_planificados": 21,
"num_fichajes": 22,
"ausencias_en_periodo": 1
}
]
}
}
- Si en el período no hay ni fichajes ni planificación, la respuesta llega con
total_empleados: 0y los totales a cero, no con error.