Ir al contenido

Comunicación de Baja

La Comunicación de Baja (tipo RA) informa a SUNAT la anulación de facturas o boletas antes de que sean declaradas. Solo aplica para comprobantes que aún no han sido comunicados en un resumen diario.

CampoTipoDescripciónValidación
numerointegerCorrelativo del documento de bajaEj: 1 genera RA-YYYYMMDD-001. Mayor a 0.
fechaEmisionComprobantesdateFecha de emisión de los comprobantes que se dan de bajaYYYY-MM-DD.
proveedorProveedorDatos del emisorruc de 11 dígitos y razonSocial obligatorios.
comprobantesVoidedDocumentsItem[]Lista de comprobantes a dar de bajaAl menos un ítem.
CampoTipoDefaultDescripción
fechaEmisiondatehoyFecha de emisión del documento de baja. ContentEnricher la asigna automáticamente si no se indica.
CampoTipoDescripciónValidación
seriestringSerie del comprobanteEj: F001, B001.
numerointegerNúmero del comprobanteMayor a 0.
tipoComprobantestringTipo de comprobanteCatálogo N.° 01: 01 Factura, 03 Boleta.
descripcionSustentostringMotivo de la bajaTexto libre.
Código / ReglaDescripción
2074 (Voided)UBLVersionID debe ser 2.0.
2072 (Voided)CustomizationID debe ser 1.0.
IdentificadorRA-YYYYMMDD-NNNN.
PlazoSe debe enviar dentro de los 7 días calendario siguientes a la fecha de emisión del comprobante.
RestricciónNo se puede dar de baja un comprobante ya incluido en un Resumen Diario aceptado.
Tipos permitidos01 Factura y 03 Boleta.
from openubl.models import (
VoidedDocuments, VoidedDocumentsItem, Proveedor,
)
from openubl.renderer import render_voided_documents
from openubl.validator import SunatValidator
from datetime import date
voided = VoidedDocuments(
numero=1,
fechaEmisionComprobantes=date(2025, 6, 10),
proveedor=Proveedor(
ruc="20100100100",
razonSocial="Mi Empresa S.A.C.",
),
comprobantes=[
VoidedDocumentsItem(
serie="F001",
numero=45,
tipoComprobante="01",
descripcionSustento="Error en datos del cliente",
),
],
)
xml = render_voided_documents(voided)
errors = SunatValidator().validate_voided_documents(xml)
assert errors == []
print(xml)
from openubl.enricher import ContentEnricher
from openubl.models import VoidedDocuments, VoidedDocumentsItem, Proveedor
from openubl.renderer import render_voided_documents
from openubl.validator import SunatValidator
from datetime import date
voided = VoidedDocuments(
numero=1,
fechaEmisionComprobantes=date(2025, 6, 10),
proveedor=Proveedor(
ruc="20100100100",
razonSocial="Mi Empresa S.A.C.",
),
comprobantes=[
VoidedDocumentsItem(
serie="F001",
numero=45,
tipoComprobante="01",
descripcionSustento="Error en datos del cliente",
),
],
)
ContentEnricher().enrich(voided) # Asigna fechaEmision si falta
xml = render_voided_documents(voided)
errors = SunatValidator().validate_voided_documents(xml)
assert errors == [], errors
print(xml)
from openubl.models import (
VoidedDocuments, VoidedDocumentsItem, Proveedor,
)
from openubl.renderer import render_voided_documents
from datetime import date
voided = VoidedDocuments(
numero=1,
fechaEmisionComprobantes=date(2025, 6, 10),
proveedor=Proveedor(
ruc="20100100100",
razonSocial="Mi Empresa S.A.C.",
),
comprobantes=[
VoidedDocumentsItem(
serie="F001",
numero=45,
tipoComprobante="01",
descripcionSustento="Error en datos del cliente",
),
],
)
xml = render_voided_documents(voided)
print(xml)

Una misma comunicación de baja puede anular varios comprobantes emitidos el mismo día.

from openubl.models import (
VoidedDocuments, VoidedDocumentsItem, Proveedor,
)
from openubl.renderer import render_voided_documents
from openubl.validator import SunatValidator
from datetime import date
voided = VoidedDocuments(
numero=2,
fechaEmisionComprobantes=date(2025, 6, 10),
proveedor=Proveedor(ruc="20100100100", razonSocial="Mi Empresa S.A.C."),
comprobantes=[
VoidedDocumentsItem(
serie="F001",
numero=10,
tipoComprobante="01",
descripcionSustento="Error en datos del cliente",
),
VoidedDocumentsItem(
serie="B001",
numero=20,
tipoComprobante="03",
descripcionSustento="Duplicidad de emisión",
),
],
)
xml = render_voided_documents(voided)
errors = SunatValidator().validate_voided_documents(xml)
assert errors == [], errors
print(xml)
{
"xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>..."
}

Si validate=true y el cuerpo no cumple las reglas, la API devuelve un error 422 con el detalle de la validación.