Ir al contenido

XML, PDF y cancelaciones

Usa el id de FactuCat en las rutas de documentos. El satUuid es el UUID fiscal del comprobante, y no sustituye al ID de la ruta.

Con invoice:read, consulta:

  • GET /invoices/{id}/xml
  • GET /invoices/{id}/pdf

La respuesta es JSON. Dentro de data encontrarás fileName, mimeType y base64. Decodifica base64 para recuperar los bytes del archivo; no guardes la respuesta JSON como si fuera el PDF o el XML.

Guardar el XML con el SDK, desde Node.js
import { writeFile } from 'node:fs/promises'
const archivo = await factucat.downloadInvoiceXml(invoiceId)
await writeFile('factura.xml', Buffer.from(archivo.base64, 'base64'))

Este fragmento usa el cliente factucat de la guía del SDK y el ID de una factura emitida.

El XML timbrado y su UUID representan el comprobante fiscal. El PDF es una representación que puedes personalizar desde Configuración.

Con invoice:cancel, utiliza POST /invoices/{id}/cancel. Proporciona el motivo aplicable y, cuando corresponda, la referencia de sustitución indicada por el contrato.

La respuesta distingue entre cancelled y not_confirmed. No presentes una factura como cancelada si recibiste not_confirmed: conserva la evidencia y verifica el resultado. Un HTTP 200 por sí solo no significa que la cancelación esté confirmada.

La API también dispone de POST /external-invoice-cancellations para el flujo de cancelación externa ya soportado. Consulta sus campos en la referencia.

DELETE /invoice-drafts/{id} elimina un borrador. No cancela un CFDI emitido.

Cancelar un CFDI no devuelve el timbre consumido. Una sustitución que se timbra con otro UUID genera un nuevo consumo.