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
emisorintegersí
empleadoEmpleadoAnidadoRequestsíEl 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)sí
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 (int64)síValor del catálogo periodo-nomina: se envía el id.
fecha_liquidacion_iniciostring (date)sí
fecha_liquidacion_finstring (date)sí
tiempo_laboradointegersíDías laborados en el periodo (numeral 8.3.1).
fecha_generacionstring (date)sí
hora_generacionstring (time)sí
fecha_pagostring (date)sí
monedainteger (int64)síValor del catálogo moneda: se envía el id.
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_trabajadorinteger (int64)noValor del catálogo tipo-trabajador: se envía el id.
subtipo_trabajadorinteger (int64)noValor del catálogo subtipo-trabajador: se envía el id.
tipo_contratointeger (int64)noValor del catálogo tipo-contrato: se envía el id.
lugar_trabajo_paisinteger (int64)noValor del catálogo pais: se envía el id.
lugar_trabajo_departamentointeger (int64)noValor del catálogo departamento: se envía el id.
lugar_trabajo_municipiointeger (int64)noValor del catálogo municipio: se envía el id.
lugar_trabajo_direccionstringno
forma_pagointeger (int64)noValor del catálogo forma-pago: se envía el id.
medio_pagointeger (int64)noValor del catálogo medio-pago: se envía el id.
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": -9223372036854776000,
"numero_documento": "texto",
"primer_apellido": "texto",
"segundo_apellido": "texto",
"primer_nombre": "texto",
"otros_nombres": "texto",
"codigo_trabajador": "texto",
"tipo_trabajador": -9223372036854776000,
"subtipo_trabajador": -9223372036854776000,
"tipo_contrato": -9223372036854776000,
"alto_riesgo_pension": true,
"salario_integral": true,
"sueldo": "0.00",
"fecha_ingreso": "2026-01-31",
"pais": -9223372036854776000,
"departamento": -9223372036854776000,
"municipio": -9223372036854776000,
"direccion": "texto",
"forma_pago": -9223372036854776000,
"medio_pago": -9223372036854776000,
"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": -9223372036854776000,
"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": -9223372036854776000,
"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": -9223372036854776000,
"subtipo_trabajador": -9223372036854776000,
"tipo_contrato": -9223372036854776000,
"lugar_trabajo_pais": -9223372036854776000,
"lugar_trabajo_departamento": -9223372036854776000,
"lugar_trabajo_municipio": -9223372036854776000,
"lugar_trabajo_direccion": "texto",
"forma_pago": -9223372036854776000,
"medio_pago": -9223372036854776000,
"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 (int64)Valor del catálogo periodo-nomina: se envía el id.
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 (int64)Valor del catálogo moneda: se envía el id.
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 (int64)Valor del catálogo tipo-trabajador: se envía el id.
subtipo_trabajadorinteger (int64)Valor del catálogo subtipo-trabajador: se envía el id.
tipo_contratointeger (int64)Valor del catálogo tipo-contrato: se envía el id.
lugar_trabajo_paisinteger (int64)Valor del catálogo pais: se envía el id.
lugar_trabajo_departamentointeger (int64)Valor del catálogo departamento: se envía el id.
lugar_trabajo_municipiointeger (int64)Valor del catálogo municipio: se envía el id.
lugar_trabajo_direccionstring
forma_pagointeger (int64)Valor del catálogo forma-pago: se envía el id.
medio_pagointeger (int64)Valor del catálogo medio-pago: se envía el id.
bancostring
tipo_cuentaany
numero_cuentastring
fecha_retirostring (date)Admite null.
{
"id": "00000000-0000-0000-0000-000000000000",
"emisor": 1,
"empleado": {
"id": 1,
"tipo_identificacion": -9223372036854776000,
"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": -9223372036854776000,
"subtipo_trabajador": -9223372036854776000,
"tipo_contrato": -9223372036854776000,
"alto_riesgo_pension": true,
"salario_integral": true,
"sueldo": "0.00",
"fecha_ingreso": "2026-01-31",
"pais": -9223372036854776000,
"departamento": -9223372036854776000,
"municipio": -9223372036854776000,
"direccion": "texto",
"forma_pago": -9223372036854776000,
"medio_pago": -9223372036854776000,
"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": -9223372036854776000,
"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": -9223372036854776000,
"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": -9223372036854776000,
"subtipo_trabajador": -9223372036854776000,
"tipo_contrato": -9223372036854776000,
"lugar_trabajo_pais": -9223372036854776000,
"lugar_trabajo_departamento": -9223372036854776000,
"lugar_trabajo_municipio": -9223372036854776000,
"lugar_trabajo_direccion": "texto",
"forma_pago": -9223372036854776000,
"medio_pago": -9223372036854776000,
"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.