> ## Documentation Index
> Fetch the complete documentation index at: https://developers.ipsofactura.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Solicitar export masivo de XML

> Encola la generación de un ZIP con **todos los XML timbrados** de la cuenta en un rango de fechas, para cerrar el mes o entregar un periodo completo a contabilidad sin hacer una llamada por CFDI. Responde **202** de inmediato con el `id` del export: armar el archivo tarda minutos, no ocurre dentro de esta petición.

`desde` y `hasta` son **fechas, ambas inclusive**, en zona `America/Mexico_City`, y se aplican sobre la fecha de timbrado del SAT. El rango no puede abarcar más de 366 días. `rfc_emisor` es opcional y limita el export a una sola empresa.

El ZIP trae un XML por CFDI, nombrado por folio fiscal, más un `manifiesto.csv` que lo relaciona con serie, folio, receptor, total y estatus. Incluye los CFDIs cancelados —siguen siendo documentos fiscales del emisor— y excluye los que timbró otro proveedor, de los que no conservamos el documento.

Para saber cuándo está listo: suscribe el evento `export.listo` o consulta `GET /cfdi/exports/{id}`. El archivo se conserva 7 días desde que se genera; después hay que volver a pedirlo.



## OpenAPI

````yaml /openapi.json post /cfdi/exports
openapi: 3.1.0
info:
  description: API de timbrado CFDI 4.0 de Palenca.
  title: Ipsofactura API
  version: v1
servers:
  - description: Producción
    url: https://api.ipsofactura.com
  - description: Sandbox (pruebas, sin validez fiscal)
    url: https://sandbox.api.ipsofactura.com
security:
  - apiKeyAuth: []
tags:
  - description: Timbrado, nómina, complemento de pago, cancelación y descarga de CFDIs.
    name: CFDI
  - description: Alta y consulta de empresas emisoras.
    name: Empresas
  - description: Administración del Certificado de Sello Digital (CSD).
    name: Certificados
  - description: >-
      Suscripciones de webhooks: notificaciones de timbrado, cancelación y
      pagos.
    name: Webhooks
paths:
  /cfdi/exports:
    post:
      tags:
        - CFDI
      summary: Solicitar export masivo de XML
      description: >-
        Encola la generación de un ZIP con **todos los XML timbrados** de la
        cuenta en un rango de fechas, para cerrar el mes o entregar un periodo
        completo a contabilidad sin hacer una llamada por CFDI. Responde **202**
        de inmediato con el `id` del export: armar el archivo tarda minutos, no
        ocurre dentro de esta petición.


        `desde` y `hasta` son **fechas, ambas inclusive**, en zona
        `America/Mexico_City`, y se aplican sobre la fecha de timbrado del SAT.
        El rango no puede abarcar más de 366 días. `rfc_emisor` es opcional y
        limita el export a una sola empresa.


        El ZIP trae un XML por CFDI, nombrado por folio fiscal, más un
        `manifiesto.csv` que lo relaciona con serie, folio, receptor, total y
        estatus. Incluye los CFDIs cancelados —siguen siendo documentos fiscales
        del emisor— y excluye los que timbró otro proveedor, de los que no
        conservamos el documento.


        Para saber cuándo está listo: suscribe el evento `export.listo` o
        consulta `GET /cfdi/exports/{id}`. El archivo se conserva 7 días desde
        que se genera; después hay que volver a pedirlo.
      operationId: crearExport
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CrearExportRequest'
        required: true
      responses:
        '202':
          content:
            application/json:
              example:
                created_at: '2026-09-14T10:00:00-06:00'
                desde: '2026-08-01'
                estatus: pendiente
                hasta: '2026-08-31'
                id: 9a4f07ff-3abc-435f-b7a6-88c2bc65b4c1
              schema:
                $ref: '#/components/schemas/ExportResponse'
          description: Export encolado
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Rango vacío, invertido o de más de 366 días (VALIDATION_ERROR)
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: >-
            API key faltante o inválida (AUTHENTICATION_REQUIRED /
            INVALID_API_KEY)
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: >-
            La cuenta está suspendida (ACCOUNT_SUSPENDED). Un recurso de otra
            cuenta NO responde 403: responde 404, igual que uno que no existe.
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: >-
            El rfc_emisor no es una empresa registrada de tu cuenta
            (RFC_NOT_FOUND)
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: >-
            Límite de requests por minuto excedido (RATE_LIMIT_EXCEEDED). Ver
            headers X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset
            y Retry-After.
components:
  schemas:
    CrearExportRequest:
      properties:
        desde:
          description: Primer día del rango, inclusive (zona horaria America/Mexico_City).
          example: '2026-08-01'
          format: date
          type: string
        hasta:
          description: >-
            Último día del rango, inclusive. El rango no puede abarcar más de
            366 días: para un periodo mayor hay que pedir varios exports.
          example: '2026-08-31'
          format: date
          type: string
        rfcEmisor:
          description: >-
            Opcional. Limita el export a un solo emisor. Si se omite, el export
            cubre todas las empresas registradas de la cuenta.
          example: EKU9003173C9
          maxLength: 13
          minLength: 0
          pattern: ^$|^[A-Za-z&Ññ]{3,4}[0-9]{6}[A-Za-z0-9]{3}$
          type: string
      required:
        - desde
        - hasta
      type: object
    ExportResponse:
      description: Estado de un export masivo de XML
      properties:
        completedAt:
          description: Cuándo terminó de generarse o de fallar.
          format: date-time
          type: string
        createdAt:
          description: Cuándo se pidió el export.
          format: date-time
          type: string
        desde:
          description: Primer día del rango, inclusive.
          example: '2026-08-01'
          format: date
          type: string
        errorCode:
          description: >-
            Por qué falló, cuando el estatus es `fallido`. Código estable; el
            texto de `error_message` es informativo y no debe parsearse.
          example: EXPORT_TOO_LARGE
          type: string
        errorMessage:
          description: Descripción del fallo, para quien lo lea.
          type: string
        estatus:
          description: >-
            `pendiente` (en cola), `en_proceso` (armando el archivo), `listo`
            (descargable) o `fallido`.
          example: pendiente
          type: string
        expirado:
          description: >-
            `true` cuando el export se generó correctamente pero su archivo ya
            se borró por la política de retención. No es un error: hay que
            volver a pedir el export.
          example: false
          type: boolean
        hasta:
          description: Último día del rango, inclusive.
          example: '2026-08-31'
          format: date
          type: string
        id:
          description: >-
            Id del export. Es lo que se debe almacenar: la URL de descarga se
            vuelve a pedir con él.
          example: 9a4f07ff-3abc-435f-b7a6-88c2bc65b4c1
          format: uuid
          type: string
        rfcEmisor:
          description: Emisor al que se limitó el export, si se pidió así.
          example: EKU9003173C9
          type: string
        tamanoBytes:
          description: Tamaño del ZIP en bytes. Sólo cuando el export está `listo`.
          example: 5242880
          format: int64
          type: integer
        totalCfdis:
          description: >-
            CFDIs incluidos en el archivo. Sólo cuando el export está `listo`.
            Puede ser 0: un rango sin CFDIs produce un ZIP válido y vacío.
          example: 1043
          format: int32
          type: integer
        url:
          description: >-
            URL firmada, de solo lectura, con vigencia de 15 minutos desde que
            se genera. No la almacenes: guarda el `id` y vuelve a llamar a `GET
            /cfdi/exports/{id}`. El ZIP contiene un XML por CFDI, nombrado por
            folio fiscal, más un `manifiesto.csv` que los relaciona con serie,
            folio, receptor, total y estatus.
          example: https://storage.ipsofactura.com/exports/9a4f07ff.zip?sig=...
          type: string
      type: object
    ErrorResponse:
      properties:
        code:
          description: >-
            Código de error de ipsofactura. Estable y cerrado (catálogo
            ErrorCode), pero deliberadamente grueso: TODO rechazo de validación
            del SAT llega como VALIDATION_ERROR. Úsalo para decidir el flujo
            general (reintentar, autenticar de nuevo, corregir el comprobante).
          example: VALIDATION_ERROR
          type: string
        id:
          type: string
        idempotencyKey:
          type: string
        message:
          description: >-
            Descripción legible del error, en texto libre. NO la parsees: cuando
            el rechazo viene del SAT, este texto lo redacta el PAC, cambia entre
            proveedores y puede cambiar sin previo aviso. Para ramificar por
            regla del SAT usa sat_code; para ramificar por tipo de error usa
            code. El mensaje es para mostrarlo o registrarlo.
          example: >-
            CFDI40147: El RFC del receptor no se encuentra en la lista de
            contribuyentes inscritos no cancelados del SAT
          type: string
        retryAfter:
          format: int32
          type: integer
        sat_code:
          description: >-
            Código del SAT del rechazo. Presente SÓLO cuando el rechazo viene
            del SAT a través de un PAC; null en errores propios de ipsofactura
            (validación local, autenticación, rate limit, servicio no
            disponible). Es específico donde `code` es genérico: `code` te dice
            que hubo un rechazo de validación, `sat_code` te dice exactamente
            qué rechazó el SAT. Dos formas según la operación: `CFDIxxxxx`
            cuando el SAT rechaza un timbrado, y el código de tres dígitos de
            cancelación (203 a 212) cuando rechaza una cancelación. También es
            null si el PAC no devolvió ningún código: nunca se inventa uno.
          example: CFDI40147
          type: string
  securitySchemes:
    apiKeyAuth:
      description: API key emitida por Ipsofactura, enviada en el header x-api.
      in: header
      name: x-api
      type: apiKey

````