Base URL https://api.afer.pro Referencia aferapp.com Reservar demo

Horas fichadas vs planificadas

GET https://api.afer.pro/api/v1/employees/times/summary
Alias en castellano (v0, sigue operativo): 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.

Autenticación

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_iniciodate
obligatorio
Inicio del período, incluido. Formato YYYY-MM-DD.
fecha_findate
obligatorio
Fin del período, incluido.
empleadoIdstring
opcional
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

200 · application/json
{
    "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
            }
        ]
    }
}
Notas
  • Si en el período no hay ni fichajes ni planificación, la respuesta llega con total_empleados: 0 y los totales a cero, no con error.