Factuarea API
Saldos de horas

Obtener la hoja horaria mensual de un empleado

Devuelve la hoja horaria mensual en vivo de un empleado para el periodo abierto (en curso): minutos esperados vs trabajados, el saldo y las horas extra por día, y los totales mensuales. employee_id (UUID v7) es obligatorio; month (YYYY-MM) toma por defecto el mes actual. La hoja se recomputa en cada petición desde el registro inalterable, así que un fichaje recién registrado se refleja sin cerrar el mes. Los minutos esperados descuentan festivos y ausencias aprobadas. Los totales están en minutos. Un recurso computado: expone employee_id, nunca un id.

GET
/time-balances/monthly-sheet
AuthorizationBearer <token>

En: header

Parámetros de consulta

employee_id*string

ID del empleado (UUID v7) cuya hoja mensual se consulta.

Formatouuid
month?|

Mes de la hoja en formato AAAA-MM; por defecto, el mes actual.

Coincidencia^\d{4}-(0[1-9]|1[0-2])$

Parámetros de cabecera

Factuarea-Version?string

Fija la versión de la API (YYYY-MM-DD, versionado por fecha estilo Stripe) para esta petición; omítelo para usar la versión fijada de la clave, o la última si no hay ninguna. Versión no soportada → 400 unsupported_api_version; malformada → 400 parameter_invalid_format. La versión efectiva se refleja en la cabecera de respuesta Factuarea-Version. Consulta la guía de Versioning.

Formatodate
X-Active-Profile?string

Opera en nombre de una empresa hija (API key maestra de gestoría): pasa su id público (UUID v7) y la petición se ejecuta contra los datos de esa hija sin cambiar el scope, el tier ni el environment de la clave (omítelo para usar la propia empresa de la clave). UUID inválido → 400 parameter_invalid_uuid; id desconocido o no propio → 404 profile_not_found. Consulta la guía de Acting on behalf.

Formatouuid

Cuerpo de la respuesta

application/json

application/json

application/json

application/json

application/json

application/json

application/json

import { Factuarea } from "@factuarea/sdk";const factuarea = new Factuarea({ apiKey: process.env.FACTUAREA_API_KEY! });const result = await factuarea.timeBalances.monthlySheet();
{
  "data": {
    "object": "time_sheet",
    "employee_id": "01933a1f-8c21-7b3d-9e4f-1a2b3c4d5e01",
    "month": "2026-05",
    "total_expected_minutes": 9600,
    "total_worked_minutes": 9720,
    "total_balance_minutes": 120,
    "total_overtime_minutes": 90,
    "days": [
      {
        "date": "2026-05-04",
        "expected_minutes": 480,
        "worked_minutes": 510,
        "balance_minutes": 30,
        "overtime_minutes": 15,
        "is_holiday": false,
        "is_approved_absence": false,
        "is_rest_day": false
      }
    ]
  }
}

{
  "error": {
    "type": "authentication_error",
    "code": "missing_api_key",
    "message": "No se ha proporcionado una API key válida en el header Authorization.",
    "param": null,
    "doc_url": "https://docs.factuarea.com/guides/errors#missing_api_key",
    "request_id": "req_01HKQS5N8VR7QXJ9K3T6BWPMZA"
  }
}

{
  "error": {
    "type": "authorization_error",
    "code": "insufficient_scope",
    "message": "Esta API key no tiene el scope requerido para esta operación.",
    "param": null,
    "doc_url": "https://docs.factuarea.com/guides/errors#insufficient_scope",
    "request_id": "req_01HKQS5NBC3P8M1KX4V7SLNHQD"
  }
}

{
  "message": "string"
}

{
  "error": {
    "type": "invalid_request_error",
    "code": "parameter_invalid",
    "message": "El campo `name` es obligatorio y no puede estar vacío.",
    "param": "name",
    "doc_url": "https://docs.factuarea.com/guides/errors#parameter_invalid",
    "request_id": "req_01HKQS5NGS8Z3T6Q1D2E7FYVSI"
  }
}

{
  "error": {
    "type": "rate_limit_error",
    "code": "rate_limit_exceeded",
    "message": "Has excedido el rate limit de 60 peticiones por minuto. Reintenta tras 30 segundos.",
    "param": null,
    "doc_url": "https://docs.factuarea.com/guides/errors#rate_limit_exceeded",
    "request_id": "req_01HKQS5NKW1C6W9T4G5H0JBZVL"
  }
}

{
  "error": {
    "type": "api_error",
    "code": "internal_error",
    "message": "Ha ocurrido un error inesperado. Si persiste, contacta con soporte adjuntando el request_id.",
    "param": null,
    "doc_url": "https://docs.factuarea.com/guides/errors#internal_error",
    "request_id": "req_01HKQS5NLX2D7X0U5H6J1KCAWM"
  }
}