FiscalAPI
Descarga masiva de CFDI: guía técnica completa

Descarga masiva de CFDI: guía técnica completa

4 de abril de 2026

Descargar facturas del SAT en volumen es una de esas tareas que parece simple hasta que la intentas. El servicio web de descarga masiva de CFDI usa SOAP, requiere firma electrónica para autenticarse, tiene timeouts impredecibles, y a veces simplemente no responde. He construido integraciones con este servicio en más de una ocasión, y cada vez termino preguntándome por qué el SAT eligió la arquitectura más hostil posible para desarrolladores.

Pero el servicio existe, funciona (la mayor parte del tiempo), y si necesitas obtener cientos o miles de facturas emitidas o recibidas, es la única opción oficial.

Qué es la descarga masiva de CFDI

La descarga masiva es un servicio web del SAT que permite obtener los XML de todos los CFDI emitidos o recibidos por un RFC en un rango de fechas. A diferencia del portal del SAT donde descargas facturas una por una, el servicio masivo empaqueta miles de comprobantes en archivos ZIP que puedes procesar programáticamente.

El servicio vive en https://cfdidescargamasivaws.clouda.sat.gob.mx/ y opera mediante tres endpoints SOAP que debes llamar en secuencia. No hay atajos. No hay REST API alternativa. Es SOAP con WS-Security y firma XML.

El SAT limita las descargas a rangos de fechas de máximo un mes por solicitud. Si necesitas facturas de todo un año fiscal, debes hacer 12 solicitudes independientes. Cada solicitud puede tardar desde segundos hasta horas en procesarse dependiendo del volumen.

El proceso de descarga paso a paso

1

Autenticación con FIEL o CSD#

El primer endpoint es de autenticación. Envías un token firmado con tu FIEL (e.firma) o CSD y recibes un token de sesión válido por 5 minutos. Sí, 5 minutos. Si tu solicitud tarda más de 5 minutos en prepararse, necesitas re-autenticarte.

La firma usa el estándar XML Signature con el algoritmo RSA-SHA256. Tu certificado (.cer) y llave privada (.key) se usan para firmar el request SOAP.

2

Solicitar la descarga#

Con el token activo, envías una solicitud especificando: RFC emisor o receptor, rango de fechas, tipo de comprobante (emitidos o recibidos), y opcionalmente el tipo de CFDI (Ingreso, Egreso, Traslado, Pago, Nómina).

El SAT te devuelve un IdSolicitud, que es el identificador de tu petición en cola. La descarga no es instantánea. El SAT procesa tu solicitud en background.

3

Verificar el estado de la solicitud#

Usando el IdSolicitud, consultas periódicamente si tu solicitud ya fue procesada. Los estados posibles son: Aceptada (en cola), EnProceso, Terminada, Rechazada, o Vencida.

Cuando el estado es Terminada, la respuesta incluye uno o más IdPaquete que son los archivos ZIP listos para descargar.

4

Descargar los paquetes#

Para cada IdPaquete, haces un request al endpoint de descarga. Recibes un archivo ZIP codificado en Base64 que contiene los XML de los CFDI. Cada ZIP puede contener hasta 200,000 comprobantes.

5

Descomprimir y procesar#

Los archivos ZIP contienen los XML individuales de cada CFDI. Tú decides cómo procesarlos: almacenarlos en base de datos, extraer datos contables, validar contra tus registros, o lo que necesite tu sistema.

Flujo técnico del servicio

Portal SAT vs API: dos mundos distintos

Portal del SAT (manual)

Entras al portal de facturación, seleccionas fecha, descargas facturas una por una. Para 10 facturas funciona. Para 1,000 es inviable.

El portal tiene un límite de descarga por sesión y te desconecta frecuentemente. Si necesitas facturas de múltiples meses, prepárate para pasar horas haciendo click.

Útil para: verificar un CFDI específico, descargas puntuales.

Servicio web masivo (automático)

Autenticación programática, solicitudes por rango de fechas, descarga en lotes ZIP. Diseñado para volumen.

Requiere implementar firma XML, manejar estados asincrónicos, y lidiar con los timeouts del SAT. La barrera de entrada es alta pero una vez implementado, escalas sin límite práctico.

Útil para: conciliación contable, auditorías, migración de datos, sistemas que necesitan todos los CFDI.

Por qué el servicio del SAT es difícil

No voy a endulzarlo. El servicio de descarga masiva del SAT es técnicamente hostil por varias razones concretas:

SOAP en lugar de REST. En 2026, la mayoria de APIs modernas son REST con JSON. El SAT usa SOAP con XML, namespaces, envelopes y WS-Security. Cada request requiere construir un XML complejo con firma criptográfica.

Firma XML con RSA-SHA256. No basta enviar tu certificado como header. Tienes que firmar el body del SOAP envelope usando el estándar XML Signature. La implementación correcta involucra canonicalización C14N, digest SHA256, y firma RSA del certificado. Un error en cualquier paso y el SAT te rechaza sin un mensaje de error útil.

Asincronía sin webhooks. El SAT no te notifica cuando tu solicitud está lista. Tienes que hacer polling cada 30-60 segundos hasta que el estado cambie. A veces tarda 2 minutos. A veces tarda 6 horas. No hay forma de predecirlo.

Tokens de 5 minutos. El token de sesión expira en 5 minutos. Si tu solicitud tarda más en procesarse (que es lo normal), tienes que re-autenticarte para verificar el estado y descargar.

El servicio del SAT tiene periodos de mantenimiento no anunciados, especialmente durante los últimos días del mes y la temporada de declaración anual (marzo-abril). Si tu sistema depende de descargas en tiempo real, necesitas manejo de reintentos y cola de solicitudes.

Descarga masiva con Fiscalapi

Fiscalapi abstrae toda la complejidad del servicio SOAP del SAT. Tú envías una petición REST con JSON y Fiscalapi maneja la autenticación, firma XML, polling y descarga.

// Solicitar descarga de CFDIs recibidos del último mes
var request = new BulkDownloadRequest
{
    Rfc = "EMP010101AAA",
    DateFrom = new DateTime(2026, 3, 1),
    DateTo = new DateTime(2026, 3, 31),
    DownloadType = "received", // "issued" o "received"
    InvoiceType = "I" // I=Ingreso, E=Egreso, T=Traslado, P=Pago
};

var result = await fiscalapi.BulkDownloads.RequestAsync(request);
var requestId = result.Data.RequestId;

// Verificar estado (Fiscalapi hace polling automático)
var status = await fiscalapi.BulkDownloads.CheckStatusAsync(requestId);

// Cuando está listo, descargar los ZIPs
if (status.Data.State == "Completed")
{
    foreach (var packageId in status.Data.PackageIds)
    {
        var zipBytes = await fiscalapi.BulkDownloads
            .DownloadPackageAsync(packageId);
        // Procesar ZIP con XMLs
    }
}

Fiscalapi maneja el retry automático cuando el SAT no responde. Si el servicio masivo está caído o lento, las solicitudes se encolan y se reintentan sin que tu aplicación tenga que implementar esa lógica. Puedes ver el estado de las solicitudes en tiempo real desde el panel de Fiscalapi.

Errores comunes en descarga masiva

"No se encontraron resultados." Esto puede significar que no hay CFDIs en el rango, pero también puede ser un error silencioso si la autenticación falló parcialmente o el tipo de comprobante no coincide. Verifica que el RFC, las fechas y el tipo (emitidos/recibidos) sean correctos.

Solicitud rechazada por exceder límite. El SAT permite un número máximo de solicitudes activas por RFC. Si ya tienes solicitudes en cola que no has descargado, las nuevas se rechazan. Descarga los paquetes pendientes antes de hacer nuevas solicitudes.

ZIP corrupto o vacío. Ocasionalmente el SAT devuelve paquetes que no se pueden descomprimir. La solución es volver a solicitar la descarga para el mismo rango de fechas. El SAT regenera los paquetes.

Preguntas frecuentes sobre descarga masiva

La descarga masiva no es glamorosa, pero es esencial para cualquier sistema contable serio. Si procesas más de 50 facturas al mes, automatizar este flujo te ahorra horas de trabajo manual y elimina errores de conciliación. Consulta la documentación de Fiscalapi para los endpoints específicos y opciones de filtrado avanzado.