# Calcular (/docs/developers/api-reference/payroll-calculation/calculate)

## Descripcion general [#descripcion-general]

Este endpoint **corre la nómina** de un periodo. Si el periodo todavía no está abierto, lo abre, creando la corrida y **congelando** los empleados, sus salarios y las prestaciones de sus contratos, y a continuación lo calcula. Si el periodo ya estaba abierto, simplemente lo (re)calcula.

Abrir y calcular son **un solo paso**: el campo `opened` de la respuesta te dice si esta llamada abrió el periodo (`true`) o si ya estaba abierto (`false`).

La llamada es **idempotente en el resultado** mientras no cambien sus insumos: repetirla sobre un periodo ya calculado lo vuelve a calcular con los mismos empleados congelados y deja los mismos resultados. Los conceptos y los catálogos fiscales se leen como están en cada cálculo, así que un cambio en un concepto se refleja al volver a calcular. Para incorporar cambios de empleados o de asistencia posteriores a la apertura, utiliza [recalcular](/docs/developers/api-reference/payroll-calculation/recalculate).

No lleva cuerpo. Requiere que la API key tenga el permiso **Calcular nómina**.

## Endpoint [#endpoint]

`POST https://app.integranom.com/api/v1/payroll-calendars/{payroll_calendar_number}/periods/{period_number}/calculate`

**Path params:**

* `payroll_calendar_number` — entero positivo, el número del calendario.
* `period_number` — el periodo, con el formato `{fiscal_year}-{sequence_number}` (por ejemplo `2026-14`).

## Corre un periodo [#corre-un-periodo]

***

Abre el periodo (si hacía falta) y lo calcula. `entries_count` es el número de empleados calculados.

## Campos de la respuesta [#campos-de-la-respuesta]

| Campo                | Tipo    | Descripcion                                                            |
| -------------------- | ------- | ---------------------------------------------------------------------- |
| `period_number`      | string  | El periodo calculado.                                                  |
| `payroll_run_number` | integer | Número de la corrida creada o recalculada.                             |
| `status`             | string  | Siempre `calculated` cuando la llamada tiene éxito.                    |
| `entries_count`      | integer | Empleados calculados en la corrida.                                    |
| `opened`             | boolean | `true` si esta llamada abrió el periodo; `false` si ya estaba abierto. |

**cURL**

```bash
curl -X POST "https://app.integranom.com/api/v1/payroll-calendars/1/periods/2026-14/calculate" \
-H "Authorization: Bearer TU_API_KEY" \
-H "Content-Type: application/json"
```

**Respuesta**

```json
{
"period_number": "2026-14",
"payroll_run_number": 14,
"status": "calculated",
"entries_count": 277,
"opened": true
}
```

## Comportamiento [#comportamiento]

1. Si el periodo no tiene corrida, la **abre**: valida el calendario y la plantilla, y congela los datos de los empleados (empleados activos del calendario, salario diario, prestaciones del contrato de cada empleado). Los conceptos y los catálogos fiscales se leen en cada cálculo.
2. En el **primer** cálculo, aplica a la corrida la asistencia capturada en el registro global para las fechas del periodo. En los cálculos posteriores respeta la asistencia ya aplicada (para volver a sincronizarla, usa [recalcular](/docs/developers/api-reference/payroll-calculation/recalculate)).
3. Ejecuta el motor de cálculo: percepciones, deducciones, ISR, IMSS, INFONAVIT, ISN y costo patronal.
4. Deja la corrida y el periodo en estado `calculated`.

Al cerrar, la corrida conserva los datos con los que se calculó por última vez, así que una corrida cerrada se puede reproducir idénticamente aunque después cambien salarios, contratos, conceptos o catálogos.

## Errores [#errores]

| Status | Código                            | Causa                                                                                                                                                                                                                                       |
| ------ | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `400`  | —                                 | `payroll_calendar_number` o `period_number` inválidos en la URL.                                                                                                                                                                            |
| `401`  | —                                 | API key ausente o inválida.                                                                                                                                                                                                                 |
| `403`  | —                                 | La API key no tiene el permiso **Calcular nómina**.                                                                                                                                                                                         |
| `404`  | —                                 | El calendario o el periodo no existen en esta organización.                                                                                                                                                                                 |
| `409`  | `INACTIVE_CALENDAR`               | El calendario está desactivado. No se pueden abrir periodos en él.                                                                                                                                                                          |
| `409`  | `NO_EMPLOYEES`                    | El calendario no tiene empleados activos que calcular.                                                                                                                                                                                      |
| `409`  | `MISSING_REQUIRED_FIELDS`         | Algún empleado no tiene los datos requeridos para nómina (RFC, CURP, código postal, salario, contrato).                                                                                                                                     |
| `409`  | `OUT_OF_NORM`                     | Las prestaciones del contrato de algún empleado están **por debajo del mínimo de ley**. La respuesta incluye `norm_violations`.                                                                                                             |
| `409`  | `CLOSED`                          | El periodo está cerrado y no admite nuevos cálculos.                                                                                                                                                                                        |
| `409`  | `CANCELLED`                       | La corrida del periodo fue cancelada; no se puede calcular.                                                                                                                                                                                 |
| `409`  | `CATALOG_MISSING`                 | Falta configurar un catálogo fiscal requerido para el periodo.                                                                                                                                                                              |
| `409`  | `RETRO_STATE_CHANGED`             | Un ajuste retroactivo cambió durante el cálculo. Vuelve a intentar.                                                                                                                                                                         |
| `409`  | `HOUSING_INSURANCE_STATE_CHANGED` | Otra nómina del bimestre cambió el seguro de vivienda INFONAVIT durante el cálculo. Vuelve a intentar.                                                                                                                                      |
| `409`  | `NO_SNAPSHOT`                     | La corrida no tiene una configuración congelada completa para el periodo.                                                                                                                                                                   |
| `409`  | `CONCURRENT_CALCULATION`          | Otro cálculo de nómina de los mismos empleados está en curso. Vuelve a intentar en un momento.                                                                                                                                              |
| `409`  | `NOT_ONE_EMPLOYMENT`              | La corrida es un finiquito con más de un empleado; un finiquito cubre a uno solo.                                                                                                                                                           |
| `409`  | `NOT_CLOSING_PERIOD`              | La corrida tiene activado el ajuste anual de ISR, pero no es el último periodo ordinario del ejercicio. Desactívalo en las opciones de la corrida.                                                                                          |
| `409`  | `NO_ANNUAL_ISR_TARIFF`            | La corrida aplica el ajuste anual de ISR, no está configurada la tarifa anual de ISR del ejercicio y al menos un empleado no está excluido por tipo de trabajador, no estar marcado para el ajuste, año incompleto o solicitud por escrito. |