Observación 4023 SUNAT: Si se utiliza la leyenda con código 2002, el total de operaciones exoneradas debe ser mayor a 0.00
Fuente: Reglas de validación de SUNAT, actualizado al 26.08.2026. Los mensajes y las condiciones son textos oficiales de SUNAT.
Qué significa
SUNAT devuelve el código 4023 con el mensaje «Si se utiliza la leyenda con código 2002, el total de operaciones exoneradas debe ser mayor a 0.00».
Es una observación: SUNAT acepta el comprobante y es válido, pero te avisa de un dato que debes corregir en los próximos.
Aparece en: Boleta de venta, Liquidación de compra.
Cuándo aparece
Estas son las reglas de validación de SUNAT que devuelven el código 4023, con su texto oficial:
Boleta de ventaObservación
Dato: Total valor de venta - exportación Total valor de venta - operaciones inafectas Total valor de venta - operaciones exoneradas
Tag UBL:
/Invoice/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount (Total valor de venta)Condición: Si existe 'Código de leyenda' igual a '2002', no existe el ‘Total valor de venta de operaciones exoneradas’ (cbc:TaxableAmount con 'Código de tributo' igual a '9997') o existe con valor igual a 0 (cero)
Liquidación de compraObservación
Dato: Total valor de venta - operaciones inafectas Total valor de venta - operaciones exoneradas
Tag UBL:
/SelfBilledInvoice/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount (Total valor de venta - operaciones inafectas / Total valor de venta - operaciones exoneradas)Condición: Si 'Código de tributo' igual a '9997' (Exonerada) y existe 'Código de leyenda' igual a '2002', el valor del Tag UBL es igual a 0 (cero)
Cómo resolverlo
Revisa el dato y el tag UBL que indica la regla y corrígelo para que no se cumpla la condición de SUNAT.
Si es una observación, no tienes que reemitir: el comprobante es válido. Corrige el dato en los siguientes.
Cómo lo ves en API SUNAT
Con API SUNAT no armas el XML: envías la venta en JSON y la API lo genera, lo firma y lo envía a SUNAT. Si SUNAT rechaza el comprobante, la emisión responde con status "rejected" y el código en sunat.errorCode y sunat.errorMessage; las observaciones llegan con status "accepted_with_observations".
También puedes recibirlo por webhook (document.rejected o document.observed). Ver los estados en la documentación.
