Skip to content

Endpoints — API de Zelta Nómina

Base URL: https://api.zelta.dev/v1/nomina

Todos los endpoints requieren autenticación mediante token Bearer. Consulta la para obtener tu token.

Empleados

Listar empleados

http
GET /employees

Parámetros de consulta:

ParámetroTipoDescripción
pageintegerNúmero de página (default: 1)
per_pageintegerResultados por página (default: 25, max: 100)
statusstringactive, inactive, terminated
departmentstringFiltrar por departamento
searchstringBuscar por nombre, RFC o número de empleado
sort_bystringname, hire_date, department

Ejemplo:

bash
curl -X GET "https://api.zelta.dev/v1/nomina/employees?status=active&department=ventas" \
  -H "Authorization: Bearer {token}"

Respuesta:

json
{
  "data": [
    {
      "id": "emp_abc123",
      "employee_number": "EMP-001",
      "name": "Juan Pérez García",
      "rfc": "PEGJ900101XXX",
      "curp": "PEGJ900101HDFRRL09",
      "nss": "12345678901",
      "department": "Ventas",
      "position": "Ejecutivo de ventas",
      "hire_date": "2024-03-01",
      "daily_salary": 650.00,
      "integrated_daily_salary": 682.05,
      "status": "active",
      "created_at": "2024-03-01T08:00:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "total_pages": 2,
    "total_count": 25
  }
}

Crear empleado

http
POST /employees

Cuerpo de la petición:

json
{
  "name": "María López Hernández",
  "rfc": "LOHM950515XXX",
  "curp": "LOHM950515MDFRRL01",
  "nss": "98765432101",
  "hire_date": "2026-03-15",
  "contract_type": "indeterminate",
  "work_shift": "daytime",
  "department": "Tecnología",
  "position": "Desarrolladora",
  "daily_salary": 850.00,
  "bank": "BBVA",
  "clabe": "012345678901234567"
}

Scope requerido: nomina:write

Obtener empleado

http
GET /employees/{employee_id}

Actualizar empleado

http
PATCH /employees/{employee_id}

Dar de baja empleado

http
POST /employees/{employee_id}/terminate
json
{
  "termination_date": "2026-03-31",
  "reason": "voluntary_resignation",
  "notes": "Renuncia voluntaria por motivos personales"
}

Scope requerido: nomina:admin

Atención

Dar de baja un empleado genera automáticamente el movimiento de baja ante el IMSS y calcula el finiquito o liquidación correspondiente.


Nóminas (Payrolls)

Listar periodos de nómina

http
GET /payrolls

Parámetros de consulta:

ParámetroTipoDescripción
yearintegerFiltrar por año
monthintegerFiltrar por mes
statusstringdraft, calculated, approved, stamped
typestringordinary, aguinaldo, ptu, settlement

Respuesta:

json
{
  "data": [
    {
      "id": "pay_xyz789",
      "period_number": 5,
      "type": "ordinary",
      "frequency": "biweekly",
      "start_date": "2026-03-01",
      "end_date": "2026-03-15",
      "payment_date": "2026-03-15",
      "status": "stamped",
      "total_perceptions": 420000.00,
      "total_deductions": 112500.00,
      "total_net": 307500.00,
      "employees_count": 25
    }
  ]
}

Crear periodo de nómina

http
POST /payrolls

Calcular nómina

http
POST /payrolls/{payroll_id}/calculate

Aprobar nómina

http
POST /payrolls/{payroll_id}/approve

Scope requerido: nomina:admin

Timbrar recibos

http
POST /payrolls/{payroll_id}/stamp

Scope requerido: nomina:admin

Obtener recibos de un periodo

http
GET /payrolls/{payroll_id}/receipts

Deducciones

Listar deducciones de un empleado

http
GET /employees/{employee_id}/deductions

Respuesta:

json
{
  "data": [
    {
      "id": "ded_001",
      "type": "isr",
      "description": "ISR retenido",
      "amount": 1050.75,
      "period": "2026-03-Q1"
    },
    {
      "id": "ded_002",
      "type": "imss",
      "description": "Cuota obrera IMSS",
      "amount": 296.50,
      "period": "2026-03-Q1"
    },
    {
      "id": "ded_003",
      "type": "infonavit",
      "description": "Crédito Infonavit",
      "amount": 500.00,
      "period": "2026-03-Q1"
    }
  ]
}

Registrar deducción voluntaria

http
POST /employees/{employee_id}/deductions
json
{
  "type": "savings_fund",
  "description": "Caja de ahorro",
  "amount": 300.00,
  "frequency": "biweekly",
  "start_date": "2026-04-01",
  "end_date": null
}

Actualizar deducción

http
PATCH /deductions/{deduction_id}

Cancelar deducción

http
DELETE /deductions/{deduction_id}

Reportes

Obtener reporte de nómina

http
GET /reports/payroll

Parámetros de consulta:

ParámetroTipoDescripción
payroll_idstringID del periodo de nómina
formatstringjson, pdf, xlsx, csv
typestringsummary, detail, by_department

Obtener reporte de ISR

http
GET /reports/isr
ParámetroTipoDescripción
yearintegerEjercicio fiscal
monthintegerMes (opcional, si se omite retorna anual)
employee_idstringFiltrar por empleado (opcional)

Obtener reporte de IMSS

http
GET /reports/imss

Obtener acumulado anual

http
GET /reports/annual/{employee_id}
json
{
  "employee_id": "emp_abc123",
  "year": 2026,
  "total_perceptions": 195000.00,
  "total_taxable": 178500.00,
  "total_exempt": 16500.00,
  "total_isr_withheld": 26775.00,
  "total_imss_employee": 7119.00,
  "total_net_paid": 161106.00
}

Códigos de respuesta

CódigoDescripción
200Solicitud exitosa
201Recurso creado exitosamente
204Recurso eliminado exitosamente
400Solicitud mal formada
401No autenticado
403Sin permisos suficientes
404Recurso no encontrado
409Conflicto (ej. nómina ya timbrada)
422Error de validación
429Límite de tasa excedido
500Error interno del servidor

Nota sobre operaciones fiscales

Las operaciones de timbrado (/stamp) y cancelación de CFDI son irreversibles y se comunican directamente con el SAT. Asegúrate de que los datos sean correctos antes de ejecutar estas operaciones.

Documentación oficial de Zelta