Error 3224 SUNAT: Si existe 'Valor referencial unitario en operac. no onerosas' con monto mayor a cero, la operacion debe ser gratuita (codigo de tributo 9996)

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 3224 con el mensaje «Si existe 'Valor referencial unitario en operac. no onerosas' con monto mayor a cero, la operacion debe ser gratuita (codigo de tributo 9996)».

Es un error: SUNAT rechaza el comprobante y no tiene validez tributaria.

Aparece en: Factura, Boleta de venta, Nota de crédito, Nota de débito, Liquidación de compra.

Cuándo aparece

Estas son las reglas de validación de SUNAT que devuelven el código 3224, con su texto oficial:

  • FacturaError

    Dato: Valor referencial unitario por ítem en operaciones gratuitas (no onerosas)

    Tag UBL: /Invoice/cac:InvoiceLine/cac:PricingReference/cac:AlternativeConditionPrice/cbc:PriceAmount (Valor)

    Condición: Si no existe en la misma línea un cac:TaxSubtotal con 'Código de tributo por línea' igual a '9996' cuyo 'Monto base' es mayor a cero (cbc:TaxableAmount > 0) (Operaciones gratuitas), y 'Código de precio' es '02' (Valor referencial en operaciones no onerosa), el Tag UBL es mayor a 0 (cero).

  • Boleta de ventaError

    Dato: Valor referencial unitario por ítem en operaciones gratuitas (no onerosas)

    Tag UBL: /Invoice/cac:InvoiceLine/cac:PricingReference/cac:AlternativeConditionPrice/cbc:PriceAmount (Valor)

    Condición: Si no existe en misma la línea un cac:TaxSubtotal con 'Código de tributo por línea' igual a '9996' cuyo 'Monto base' es mayor a cero (cbc:TaxableAmount > 0) (Operaciones gratuitas), y 'Código de precio' es '02' (Valor referencial en operaciones no onerosa), el Tag UBL es mayor a 0 (cero).

  • Nota de créditoError

    Dato: Precio de venta unitario por item que modifica Valor referencial unitario por ítem en operaciones gratuitas (no onerosas)

    Tag UBL: /CreditNote/cac:CreditNoteLine/cac:PricingReference/cac:AlternativeConditionPrice/cbc:PriceAmount (Valor)

    Condición: Si no existe en misma la línea un cac:TaxSubtotal con 'Código de tributo por línea' igual a '9996' cuyo 'Monto base' es mayor a cero (cbc:TaxableAmount > 0) (Operaciones gratuitas), y 'Código de precio' es '02' (Valor referencial en operaciones no onerosa), el Tag UBL es mayor a 0 (cero).

  • Nota de débitoError

    Dato: Precio de venta unitario por item que modifica Valor referencial unitario por ítem en operaciones gratuitas (no onerosas)

    Tag UBL: /DebitNote/cac:DebitNoteLine/cac:PricingReference/cac:AlternativeConditionPrice/cbc:PriceAmount (Precio de venta unitario)

    Condición: Si no existe en misma la línea un cac:TaxSubtotal con 'Código de tributo por línea' igual a '9996' cuyo 'Monto base' es mayor a cero (cbc:TaxableAmount > 0) (Operaciones gratuitas), y 'Código de precio' es '02' (Valor referencial en operaciones no onerosa), el Tag UBL es mayor a 0 (cero).

  • Liquidación de compraError

    Dato: Precio de venta unitario por Item Valor referencial unitario por ítem en operaciones gratuitas (no onerosas)

    Tag UBL: /SelfBilledInvoice/cac:InvoiceLine/cac:PricingReference/cac:AlternativeConditionPrice/cbc:PriceAmount (Monto de precio de compra)

    Condición: Si no existe en la misma línea un cac:TaxSubtotal con 'Código de tributo por línea' igual a '9996' cuyo 'Monto base' es mayor a cero (cbc:TaxableAmount > 0) (Operaciones gratuitas), y 'Código de precio' es '02' (Valor referencial en operaciones no onerosas), el Tag UBL es mayor 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 SUNAT ya rechazó el comprobante, su número queda usado: no lo reenvíes igual. Corrige los datos y emite un comprobante nuevo.

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.