Ir al contenido

POST /api/nomina/nomina/

POST /api/nomina/nomina/

Nómina electrónica y su nota de ajuste.

Comparte el ciclo de vida de los documentos electrónicos —borrador, firmado, enviado, aceptado o rechazado— pero no su pipeline: la nómina no es UBL y va por SendNominaSync.

Sin PUT ni PATCH, por lo mismo que en DocumentoViewSet: un documento fiscal es un hecho con fecha, número y firma, y editarlo en sitio abre la puerta a que lo que se emitió y lo que se guarda dejen de coincidir. Mientras es borrador, corregirlo es borrarlo y volver a crearlo; una vez emitido, lo que corrige una nómina es su nota de ajuste (tipo_xml 103), que la DIAN tiene prevista justamente para esto.

Lo que cambia el documento son las acciones, cada una con su regla. El estado no es un campo que se escriba.

operationId: nomina_nomina_create

Cualquiera de estas credenciales:

  • LlaveApi — Llave de API de una integración. El valor completo es Api-Key <prefijo>.<secreto>, tal como lo imprime manage.py crear_llave_api. La llave alcanza exactamente los mismos emisores que la persona a cuyo nombre se creó.

Tipo de contenido: application/json · obligatorio.

CampoTipoObligatorioDescripción
emisorinteger
empleadoEmpleadoAnidadoRequestEl empleado tal como viaja dentro de la nómina. Igual que el de su endpoint pero sin emisor —lo pone la nómina, que ya lo trae— y sin el validador de unicidad, porque aquí el par emisor + identificación no identifica un error sino al empleado que hay que crear o actualizar: la nómina hace ese upsert al guardarse. Estricto: una clave que no sea un campo escribible responde 400. Aquí importa más que en el endpoint del empleado, porque un campo mal escrito haría heredar a la nómina el valor viejo del maestro sin que nadie se enterara.
prefijostringnoLo elige el emisor: la nómina no se numera con resolución de la DIAN (regla NIE010).
consecutivointeger (int64)
tipo_xmlanyno
tipo_notaanynoVacío en la nómina; obligatorio en la nota de ajuste. * 1 - Reemplazar * 2 - Eliminar
nomina_predecesorastring (uuid)noAdmite null.
periodo_nominainteger
fecha_liquidacion_iniciostring (date)
fecha_liquidacion_finstring (date)
tiempo_laboradointegerDías laborados en el periodo (numeral 8.3.1).
fecha_generacionstring (date)
hora_generacionstring (time)
fecha_pagostring (date)
monedainteger
trmstring (decimal)noSolo cuando la moneda no es COP. Admite null.
notasstringno
novedadbooleanno
cune_novedadstringno
total_devengadosstring (decimal)no
total_deduccionesstring (decimal)no
redondeostring (decimal)no
total_comprobantestring (decimal)noDevengados menos deducciones, más el redondeo.
conceptosarray<NominaConceptoRequest>no
codigo_trabajadorstringnoVa en NumeroSecuenciaXML, que identifica el documento.
alto_riesgo_pensionbooleanno
salario_integralbooleanno
sueldostring (decimal)no
tipo_trabajadorintegerno
subtipo_trabajadorintegerno
tipo_contratointegerno
lugar_trabajo_paisintegerno
lugar_trabajo_departamentointegerno
lugar_trabajo_municipiointegerno
lugar_trabajo_direccionstringno
forma_pagointegerno
medio_pagointegerno
bancostringno
tipo_cuentaanyno
numero_cuentastringno
fecha_retirostring (date)noAdmite null.
Ventana de terminal
curl -X POST "https://api.rededoc.uk/api/nomina/nomina/" \
-H "Authorization: <llaveapi>" \
-H "Content-Type: application/json" \
-d '{
"emisor": 1,
"empleado": {
"tipo_identificacion": 1,
"numero_documento": "texto",
"primer_apellido": "texto",
"segundo_apellido": "texto",
"primer_nombre": "texto",
"otros_nombres": "texto",
"codigo_trabajador": "texto",
"tipo_trabajador": 1,
"subtipo_trabajador": 1,
"tipo_contrato": 1,
"alto_riesgo_pension": true,
"salario_integral": true,
"sueldo": "0.00",
"fecha_ingreso": "2026-01-31",
"pais": 1,
"departamento": 1,
"municipio": 1,
"direccion": "texto",
"forma_pago": 1,
"medio_pago": 1,
"banco": "texto",
"tipo_cuenta": null,
"numero_cuenta": "texto"
},
"prefijo": "texto",
"consecutivo": 0,
"tipo_xml": null,
"tipo_nota": null,
"nomina_predecesora": "00000000-0000-0000-0000-000000000000",
"periodo_nomina": 1,
"fecha_liquidacion_inicio": "2026-01-31",
"fecha_liquidacion_fin": "2026-01-31",
"tiempo_laborado": 0,
"fecha_generacion": "2026-01-31",
"hora_generacion": "texto",
"fecha_pago": "2026-01-31",
"moneda": 1,
"trm": "0.00",
"notas": "texto",
"novedad": true,
"cune_novedad": "texto",
"total_devengados": "0.00",
"total_deducciones": "0.00",
"redondeo": "0.00",
"total_comprobante": "0.00",
"conceptos": [
{
"grupo": "devengado",
"concepto": "basico",
"cantidad": "0.00",
"porcentaje": "0.00",
"valor": "0.00",
"valor_no_salarial": "0.00",
"fecha_inicio": "2026-01-31",
"fecha_fin": "2026-01-31",
"hora_inicio": "2026-01-31T10:00:00-05:00",
"hora_fin": "2026-01-31T10:00:00-05:00",
"descripcion": "texto",
"tipo_incapacidad": null
}
],
"codigo_trabajador": "texto",
"alto_riesgo_pension": true,
"salario_integral": true,
"sueldo": "0.00",
"tipo_trabajador": 1,
"subtipo_trabajador": 1,
"tipo_contrato": 1,
"lugar_trabajo_pais": 1,
"lugar_trabajo_departamento": 1,
"lugar_trabajo_municipio": 1,
"lugar_trabajo_direccion": "texto",
"forma_pago": 1,
"medio_pago": 1,
"banco": "texto",
"tipo_cuenta": null,
"numero_cuenta": "texto",
"fecha_retiro": "2026-01-31"
}'
CódigoDescripción
201
400Error
401Error
429Error
CampoTipoDescripción
idstring (uuid)Solo lectura.
emisorinteger
empleadoEmpleadoAnidadoEl empleado tal como viaja dentro de la nómina. Igual que el de su endpoint pero sin emisor —lo pone la nómina, que ya lo trae— y sin el validador de unicidad, porque aquí el par emisor + identificación no identifica un error sino al empleado que hay que crear o actualizar: la nómina hace ese upsert al guardarse. Estricto: una clave que no sea un campo escribible responde 400. Aquí importa más que en el endpoint del empleado, porque un campo mal escrito haría heredar a la nómina el valor viejo del maestro sin que nadie se enterara.
prefijostringLo elige el emisor: la nómina no se numera con resolución de la DIAN (regla NIE010).
consecutivointeger (int64)
numerostringNúmero del documento. Si se omite, se arma como prefijo + consecutivo. Solo lectura.
tipo_xmlany
tipo_notaanyVacío en la nómina; obligatorio en la nota de ajuste. * 1 - Reemplazar * 2 - Eliminar
nomina_predecesorastring (uuid)Admite null.
periodo_nominainteger
fecha_liquidacion_iniciostring (date)
fecha_liquidacion_finstring (date)
tiempo_laboradointegerDías laborados en el periodo (numeral 8.3.1).
fecha_generacionstring (date)
hora_generacionstring (time)
fecha_pagostring (date)
monedainteger
trmstring (decimal)Solo cuando la moneda no es COP. Admite null.
notasstring
novedadboolean
cune_novedadstring
total_devengadosstring (decimal)
total_deduccionesstring (decimal)
redondeostring (decimal)
total_comprobantestring (decimal)Devengados menos deducciones, más el redondeo.
conceptosarray<NominaConcepto>
codigo_trabajadorstringVa en NumeroSecuenciaXML, que identifica el documento.
alto_riesgo_pensionboolean
salario_integralboolean
sueldostring (decimal)
tipo_trabajadorinteger
subtipo_trabajadorinteger
tipo_contratointeger
lugar_trabajo_paisinteger
lugar_trabajo_departamentointeger
lugar_trabajo_municipiointeger
lugar_trabajo_direccionstring
forma_pagointeger
medio_pagointeger
bancostring
tipo_cuentaany
numero_cuentastring
fecha_retirostring (date)Admite null.
{
"id": "00000000-0000-0000-0000-000000000000",
"emisor": 1,
"empleado": {
"id": 1,
"tipo_identificacion": 1,
"tipo_identificacion_codigo": "texto",
"numero_documento": "texto",
"primer_apellido": "texto",
"segundo_apellido": "texto",
"primer_nombre": "texto",
"otros_nombres": "texto",
"nombre_completo": "texto",
"codigo_trabajador": "texto",
"tipo_trabajador": 1,
"subtipo_trabajador": 1,
"tipo_contrato": 1,
"alto_riesgo_pension": true,
"salario_integral": true,
"sueldo": "0.00",
"fecha_ingreso": "2026-01-31",
"pais": 1,
"departamento": 1,
"municipio": 1,
"direccion": "texto",
"forma_pago": 1,
"medio_pago": 1,
"banco": "texto",
"tipo_cuenta": null,
"numero_cuenta": "texto",
"activo": true,
"creado_en": "2026-01-31T10:00:00-05:00",
"actualizado_en": "2026-01-31T10:00:00-05:00"
},
"prefijo": "texto",
"consecutivo": 0,
"numero": "texto",
"tipo_xml": null,
"tipo_nota": null,
"nomina_predecesora": "00000000-0000-0000-0000-000000000000",
"periodo_nomina": 1,
"fecha_liquidacion_inicio": "2026-01-31",
"fecha_liquidacion_fin": "2026-01-31",
"tiempo_laborado": 0,
"fecha_generacion": "2026-01-31",
"hora_generacion": "texto",
"fecha_pago": "2026-01-31",
"moneda": 1,
"trm": "0.00",
"notas": "texto",
"novedad": true,
"cune_novedad": "texto",
"total_devengados": "0.00",
"total_deducciones": "0.00",
"redondeo": "0.00",
"total_comprobante": "0.00",
"conceptos": [
{
"id": 1,
"grupo": "devengado",
"concepto": "basico",
"concepto_nombre": "texto",
"cantidad": "0.00",
"porcentaje": "0.00",
"valor": "0.00",
"valor_no_salarial": "0.00",
"fecha_inicio": "2026-01-31",
"fecha_fin": "2026-01-31",
"hora_inicio": "2026-01-31T10:00:00-05:00",
"hora_fin": "2026-01-31T10:00:00-05:00",
"descripcion": "texto",
"tipo_incapacidad": null
}
],
"codigo_trabajador": "texto",
"alto_riesgo_pension": true,
"salario_integral": true,
"sueldo": "0.00",
"tipo_trabajador": 1,
"subtipo_trabajador": 1,
"tipo_contrato": 1,
"lugar_trabajo_pais": 1,
"lugar_trabajo_departamento": 1,
"lugar_trabajo_municipio": 1,
"lugar_trabajo_direccion": "texto",
"forma_pago": 1,
"medio_pago": 1,
"banco": "texto",
"tipo_cuenta": null,
"numero_cuenta": "texto",
"fecha_retiro": "2026-01-31"
}
CampoTipoDescripción
detailstringMensaje para mostrar a la persona.
erroresarray<object>Nunca vacía. Cada error trae codigo, que es lo que el cliente mapea —los de DRF tal cual (required, invalid, does_not_exist, not_found…) y los propios en español (campo_desconocido, solicitud_invalida…)—, y mensaje, para la persona. Si el error es de un campo, su ruta va delante del mensaje: detalles[0].impuestos[0].tributo: Este campo es obligatorio.
{
"detail": "texto",
"errores": [
{
"codigo": "texto",
"mensaje": "texto"
}
]
}
CampoTipoDescripción
detailstringMensaje para mostrar a la persona.
erroresarray<object>Nunca vacía. Cada error trae codigo, que es lo que el cliente mapea —los de DRF tal cual (required, invalid, does_not_exist, not_found…) y los propios en español (campo_desconocido, solicitud_invalida…)—, y mensaje, para la persona. Si el error es de un campo, su ruta va delante del mensaje: detalles[0].impuestos[0].tributo: Este campo es obligatorio.
{
"detail": "texto",
"errores": [
{
"codigo": "texto",
"mensaje": "texto"
}
]
}
CampoTipoDescripción
detailstringMensaje para mostrar a la persona.
erroresarray<object>Nunca vacía. Cada error trae codigo, que es lo que el cliente mapea —los de DRF tal cual (required, invalid, does_not_exist, not_found…) y los propios en español (campo_desconocido, solicitud_invalida…)—, y mensaje, para la persona. Si el error es de un campo, su ruta va delante del mensaje: detalles[0].impuestos[0].tributo: Este campo es obligatorio.
{
"detail": "texto",
"errores": [
{
"codigo": "texto",
"mensaje": "texto"
}
]
}

RedEDoc es un servicio de Semántica Digital S.A.S.