Qué es
Si tu sistema ya arma el CFDI 4.0 (por ejemplo tu ERP), no tienes por qué desarmarlo a JSON para que Ipsofactura lo vuelva a construir del otro lado.POST /cfdi/timbrar-xml recibe
tu XML sin sellar y hace exactamente lo que no puedes hacer tú: sellarlo con el CSD que
tenemos en custodia y timbrarlo, por el mismo pipeline que usa la ruta JSON.
Reparto de trabajo: tú armas el documento, nosotros lo sellamos y timbramos. No envíes
Sello, NoCertificado ni Certificado — el sellado es nuestro.El documento es la fuente de verdad
A diferencia dePOST /cfdi/timbrar (donde tú describes un comprobante y Ipsofactura
completa los defaults que falten), aquí el XML es un comprobante terminado. Un valor
que ya viene en el documento no se sobrescribe. Los únicos huecos que Ipsofactura llena son:
Folio, si el documento no lo trae: se asigna el siguiente consecutivo para ese emisor + serie (igual que en la ruta JSON).- Datos del emisor que el documento deje vacíos, cuando el XSD del SAT los permite
opcionales (en la práctica esto casi nunca aplica:
cfdv40.xsdya exigeNombreyRegimenFiscaldel emisor).
DomicilioFiscalReceptor de un receptor
extranjero— se conserva tal cual lo trae el documento. Si eso produce un rechazo del SAT, la
respuesta es honesta: es el documento que enviaste, no uno que reescribimos.
Request
cURL
La respuesta es la misma
TimbrarResponse de POST /cfdi/timbrar, sin importar si el
documento era un ingreso, egreso o complemento de pago.
Ruteo por tipo de comprobante
Ipsofactura leeTipoDeComprobante del propio XML para decidir el pipeline:
I(ingreso) /E(egreso) → se timbra directo, igual quePOST /cfdi/timbrar.P(pago) → se rutea al pipeline de complemento de pago: la parcialidad y el saldo se recalculan a partir del historial de pagos ya registrados contra los CFDI que el documento relaciona, no de lo que el XML declare. Si necesitas declarar tú los saldos —porque llevas tu propia contabilidad, o aplicaste un egreso antes del REP— usaPOST /cfdi/complemento-pago, que sí los acepta explícitos.
Fecha del documento, no sobre el
instante en que llega la request — si tu ERP despacha una cola con retraso, re-fecha el XML
antes de reenviarlo.
Tope de tamaño
El XML decodificado no puede exceder 2 MB (dos órdenes de magnitud por encima del CFDI más grande que hemos visto). Por encima del tope, la respuesta es413 REQUEST_TOO_LARGE.
Rechazos con 400
XSD_VALIDATION_ERROR
UNSUPPORTED_CFDI_CONTENT
Sandbox
En el sandbox, este endpoint devuelve un CFDI completo — construido con el mismo conversor que usa producción, concfdi:Conceptos, cfdi:Impuestos y su
TimbreFiscalDigital, no un stub recortado. La única diferencia es que el material de
sellado es obviamente falso:
SelloyCertificadollevan marcadoresSANDBOX_…(no son una firma real).NoCertificadoreutiliza el serial real del CSD que registraste, así que sigue teniendo forma de dato válido.- La validación criptográfica de ese sello falla a propósito — un CFDI de sandbox no tiene, ni debe tener, validez fiscal.
- El PDF que acompaña al CFDI de sandbox sigue siendo un placeholder de una página.
Ver también
- Idempotencia y recuperación tras timeout — cómo reintentar sin riesgo de timbrar dos veces.
GET /cfdi/{id}y los filtros deGET /cfdi— para recuperar un CFDI porserie,folio,rfc_emisorofolio_fiscal.