P4 Software
/
NominaHQ
Aplica a: NominaHQ Roles: Crear y revocar claves de API: Nivel de acceso Acceso total o cuenta Administrador (los demás usuarios ven la lista, sin los botones Nuevo ni Revocar). Cada clave otorga acceso solo a la empresa para la que se creó. Referencias regulatorias: ninguna directa. Las planillas que se calculen por la API aplican las reglas de Panamá (CSS, ISR, Código de Trabajo) del motor de nómina.
La API REST de NominaHQ permite leer y automatizar datos de nómina de Panamá desde sistemas externos: empresa, Empleados, planillas (payroll runs) y los lotes de diario contable. Está pensada principalmente para lectura e integración — por ejemplo, relojes de asistencia u otros sistemas externos que necesitan escribir o consultar datos de una empresa cliente específica. Cada llamada se autentica con una clave enviada en el encabezado X-Api-Key, y esa clave identifica una sola empresa — nunca todo el inquilino. La documentación interactiva se publica en /developers.
/settings/api-keys)./developers.https://{su-inquilino}.NominaHQ.cloud.X-Api-Key: encabezado HTTP donde se envía la clave de API en cada solicitud./developers, basada en el documento OpenAPI (/openapi/v1.json).Antes de empezar: seleccione en la barra superior la empresa para la que necesita la clave: la clave queda ligada a la empresa activa al crearla. Necesita el rol Acceso total.
En el menú lateral, dentro de Configuración, haga clic en Claves de API.

La lista muestra la Etiqueta, el inicio de la Clave, el Estado, el Último uso y la fecha de creación de cada clave de la empresa activa.
Haga clic en Nuevo.

Se abre el cuadro Nueva Clave de API.
En Etiqueta, escriba para qué es la clave (en el ejemplo, Documentación (demo); en la práctica, por ejemplo "Reloj de asistencia — bodega").

La etiqueta le ayuda a saber qué integración revocar si algún día hace falta.
Haga clic en Crear.

Crear se habilita cuando la Etiqueta tiene valor.
Copie la clave con Copiar y guárdela en un lugar seguro (el gestor de secretos de su integración).

La clave completa solo se muestra esta vez. En la captura aparece oculta a propósito.
Haga clic en Listo.

El recuadro se cierra y la clave ya no se puede volver a ver.
Resultado: aparece "Clave de API creada" y la clave se agrega a la lista como Activo. Para otra empresa, cambie la empresa activa y repita.
En la lista, haga clic en Revocar junto a la clave.

Revoque una clave cuando deje de usar la integración o sospeche que se filtró.
Confirme con Confirmar.

El cuadro muestra la etiqueta de la clave que va a revocar. Con Cancelar se cierra sin revocar.
Revise la lista: la clave queda en estado Revocada.

Las claves revocadas se quedan en la lista como historial; no se pueden reactivar ni borrar.
Resultado: la clave deja de funcionar de inmediato: cualquier llamada con ella recibe 401.
En el menú lateral, dentro de Configuración, haga clic en API para desarrolladores.

Se abre la documentación de la API en la ruta /developers.
Use la documentación: el panel izquierdo lista los endpoints; Server muestra la dirección de su cuenta; Download OpenAPI Document descarga la especificación.

La documentación está en inglés. Con Open API Client puede probar llamadas escribiendo su clave en Authentication.
https://{su-inquilino}.NominaHQ.cloud/api/v1/companies.X-Api-Key con su clave. Sin clave válida o revocada, la respuesta es 401 Unauthorized.Ejemplo:
curl https://{su-inquilino}.NominaHQ.cloud/api/v1/companies -H "X-Api-Key: YOUR_API_KEY"
GET /api/v1/journal-batches. Devuelve los 100 más recientes de la empresa de la clave, del más nuevo al más antiguo, sin las líneas.?status=Pending. Los valores admitidos son Pending, Sent, Confirmed y Failed; cualquier otro devuelve 400.?skip=100, ?skip=200, etc., o acote por fecha de contabilización con ?from=2026-01-01&to=2026-06-30. Cuando una página devuelve menos de 100 lotes, ya no hay más.GET /api/v1/journal-batches/{id}. La respuesta agrega el arreglo lines con las líneas de débito y crédito.id de los lotes ya procesados en su ERP: es lo que evita importar dos veces el mismo asiento.curl "https://{su-inquilino}.NominaHQ.cloud/api/v1/journal-batches?status=Pending" -H "X-Api-Key: YOUR_API_KEY"
curl https://{su-inquilino}.NominaHQ.cloud/api/v1/journal-batches/{id} -H "X-Api-Key: YOUR_API_KEY"
| Método | Ruta | Descripción |
|---|---|---|
| GET | /api/v1/companies |
Devuelve la única empresa a la que está ligada la clave presentada. |
| GET | /api/v1/employees |
Lista los Empleados de la empresa de la clave, ordenados por código. |
| GET | /api/v1/payroll-runs |
Lista las planillas de la empresa de la clave, de la más reciente a la más antigua. |
| POST | /api/v1/payroll-runs |
Calcula una planilla (quincenal/mensual/semanal) para la empresa de la clave, en el período indicado; puede aprobarla en la misma llamada. |
| GET | /api/v1/journal-batches |
Lista hasta 100 lotes de diario de la empresa de la clave, del más reciente al más antiguo, sin las líneas. Filtros opcionales: ?status=Pending|Sent|Confirmed|Failed, ventana de fechas ?from=/?to= (fecha de contabilización, formato ISO) y paginación con ?skip=. |
| GET | /api/v1/journal-batches/{id} |
Devuelve un lote de diario de la empresa de la clave, con sus líneas de débito y crédito. |
| POST | /api/v1/time-clock-entries |
Crea marcaciones del reloj (entrada/salida por empleado y fecha) en lote; aplica la misma detección de tardanzas que la captura manual. |
| GET | /api/v1/payroll-runs/{id} |
Devuelve una planilla con todos sus recibos (bruto, deducciones, aportes patronales, neto). Agregue ?lines=true para incluir las líneas de concepto de cada recibo. |
| GET | /api/v1/payslips/{id} |
Devuelve un recibo con sus líneas de concepto. |
| GET | /api/v1/payslips/{id}/pdf |
Descarga el recibo en PDF, igual al que ven operadores y Empleados. |
| GET | /api/v1/payroll-runs/{id}/planilla |
Descarga el resumen de la planilla en Excel. |
| GET | /api/v1/payroll-runs/{id}/sipe |
Descarga el archivo SIPE «Carga Masiva de Planilla» de la CSS (plan Business o superior; si no, responde 402). |
| GET | /api/v1/payroll-runs/{id}/planilla03 |
Descarga el Informe 03 V5 de la DGI. Opcional ?receipt= con el número de recibo SIPE. |
| GET | /api/v1/payroll-runs/{id}/ach |
Descarga el archivo de dispersión bancaria (ACH) del neto en el formato bancario configurado para la empresa (plan Business o superior). Si algún pago sería rechazado por la red ACH, responde 422 con la lista de Empleados a corregir. |
Nota: la API no pagina, con una excepción:
/journal-batchesdevuelve páginas de hasta 100 lotes y admite?skip=y la ventana?from=/?to=para recorrer el resto. La versión va en la ruta (/api/v1); los cambios incompatibles se publican bajo una versión nueva.
/api/v1/companies)| Campo | Tipo | Descripción |
|---|---|---|
id |
GUID | Identificador de la empresa. |
code |
Texto | Código de la empresa. |
name |
Texto | Nombre de la empresa. |
baseCurrency |
Texto | Moneda base. |
isActive |
Booleano | Indica si la empresa está activa. |
/api/v1/employees)| Campo | Tipo | Descripción |
|---|---|---|
id |
GUID | Identificador del empleado. |
code |
Texto | Código/ficha del empleado. |
firstName |
Texto | Nombre. |
lastName |
Texto | Apellido. |
nationalId |
Texto | Cédula (puede venir vacío). |
cssNumber |
Texto | Número de Seguro Social/CSS (puede venir vacío). |
monthlySalary |
Decimal (USD) | Salario mensual. |
payFrequency |
Texto | Frecuencia de pago del empleado. |
status |
Texto | Estado del empleado. |
isActive |
Booleano | Indica si el empleado está activo. |
/api/v1/payroll-runs)| Campo | Tipo | Descripción |
|---|---|---|
id |
GUID | Identificador de la planilla. |
runType |
Texto | Tipo de corrida. |
frequency |
Texto | Frecuencia (Quincenal/Mensual/Semanal/Bisemanal). |
periodStart |
Fecha | Inicio del período. |
periodEnd |
Fecha | Fin del período. |
payDate |
Fecha | Fecha de pago. |
status |
Texto | Estado de la planilla. |
entryCount |
Entero | Cantidad de líneas (Empleados). |
totalGross |
Decimal (USD) | Total devengado. |
totalDeductions |
Decimal (USD) | Total de deducciones. |
totalEmployerCost |
Decimal (USD) | Costo patronal total. |
totalNet |
Decimal (USD) | Neto a pagar. |
/api/v1/journal-batches y `/api/v1/journal-batches/| Campo | Tipo | Descripción |
|---|---|---|
id |
GUID | Identificador del lote. Es el valor que se usa en /journal-batches/{id} y el que conviene guardar en el ERP para no importar dos veces el mismo asiento. |
eventType |
Texto | Evento que originó el lote: Payroll, Decimo, PayrollDisbursement, Provisions o CesantiaDeposit. |
sourceId |
GUID | Identificador del documento de origen (la planilla o la corrida de Décimo que se contabilizó). |
postedDate |
Fecha | Fecha de contabilización del asiento. |
status |
Texto | Pending, Sent, Confirmed o Failed. |
totalDebit |
Decimal (USD) | Total al débito. |
totalCredit |
Decimal (USD) | Total al crédito. Siempre igual a totalDebit. |
lines |
Arreglo | Líneas del asiento. Viene vacío (null) en la lista y solo se llena al pedir un lote por su id. |
Cada elemento de lines:
| Campo | Tipo | Descripción |
|---|---|---|
accountCode |
Texto | Código de la cuenta contable. |
debit |
Decimal (USD) | Monto al débito de la línea. |
credit |
Decimal (USD) | Monto al crédito de la línea. |
description |
Texto | Descripción de la línea (puede venir vacía). |
/api/v1/payroll-runs)| Campo | Tipo | Obligatorio | Descripción | Validación |
|---|---|---|---|---|
periodStart |
Fecha (ISO-8601) | Sí | Inicio del período. | — |
periodEnd |
Fecha (ISO-8601) | Sí | Fin del período. | — |
payDate |
Fecha (ISO-8601) | Sí | Fecha de pago. | — |
frequency |
Entero | Sí | Frecuencia: 0 = Quincenal, 1 = Mensual, 2 = Semanal, 3 = Bisemanal (cada 14 días). | Debe ser un valor válido. |
description |
Texto | Opcional | Descripción de la planilla. | — |
approve |
Booleano | Sí | Si es true, aprueba la planilla además de calcularla. |
— |
Respuesta correcta: { "runId": "<GUID>" }. Si el motor rechaza el cálculo (regla de negocio), la respuesta es 400 con { "error": "mensaje" }.
Todas las respuestas de error usan la forma { "error": "mensaje" } con el estado HTTP correspondiente: 400 (solicitud inválida, filtro status no reconocido o rechazo de regla de negocio), 401 (clave faltante, inválida o revocada), 404 (empresa no encontrada —solo posible si la empresa de la clave fue eliminada— o lote de diario inexistente).
| Rol | Crear/revocar claves (en la app) | Llamar a la API (con una clave) |
|---|---|---|
| Administrador | Sí | Sí |
| Acceso total | Sí | Sí |
| Captura de datos | No (solo ve la lista) | Sí |
| Aprobador | No (solo ve la lista) | Sí |
| Solo lectura | No (solo ve la lista) | Sí |
La API no usa el rol de la persona: quien tenga una clave activa accede a los datos de su empresa.
Notas:
/api/v1/payroll-runs se calculan con el motor de nómina, que aplica CSS (empleado 9.75% / empleador 13.25%), Seguro Educativo, ISR por tramos y el resto de las reglas del Código de Trabajo de Panamá.X-Api-Key otorga acceso a datos personales (Cédula, CSS) y a la creación de planillas para su empresa. Manténgala del lado del servidor y nunca la incruste en aplicaciones de cliente.| Síntoma | Causa probable | Solución |
|---|---|---|
401 con {"error":"Missing or invalid X-Api-Key."} |
Falta el encabezado X-Api-Key, la clave es incorrecta, o fue revocada. |
Cree una nueva clave en Configuración → Claves de API y envíela en el encabezado X-Api-Key. |
404 con {"error":"Company not found."} (solo en POST /payroll-runs) |
La empresa a la que estaba ligada la clave fue eliminada. | Cree una nueva clave para una empresa activa. |
400 al crear una planilla |
El motor rechazó el cálculo por una regla de negocio. | Lea el mensaje de error, corrija fechas/frecuencia/datos y reintente. |
400 con {"error":"Invalid status. Use Pending, Sent, Confirmed or Failed."} |
El filtro ?status= trae un valor que no existe (por ejemplo, en español). |
Use exactamente Pending, Sent, Confirmed o Failed. |
404 con {"error":"Journal batch not found."} |
El id no corresponde a ningún lote, o el lote pertenece a otra empresa. |
Tome el id de la respuesta de GET /api/v1/journal-batches y confirme que usa la clave de la empresa dueña del lote. |
GET /journal-batches responde con la lista vacía |
Ninguna corrida de esa empresa se ha contabilizado todavía. | Contabilice una corrida con Post to GL en Nómina → Planillas. |
Los lotes traen lines vacío |
La lista nunca incluye las líneas. | Pida cada lote por separado con GET /api/v1/journal-batches/{id}. |
El servidor mostrado en /developers no es su subdominio |
El host se resuelve de la solicitud actual. | Abra /developers desde la URL de su propio inquilino (https://{su-inquilino}.NominaHQ.cloud). |
payroll.run.posted, payroll.run.approved, payroll.run.paid y decimo.posted, con firma HMAC X-NominaHQ-Signature. También puede recibir Webhooks entrantes con POST /api/v1/Webhooks/{source}.¿Te resultó útil esta página?