Skip to main content
Un lote permite emitir muchos DTE de una sola vez: en vez de llamar POST /dte documento por documento, se sube un archivo Excel con una fila por documento (y sus ítems), y un proceso asíncrono de Fegora emite cada documento por su cuenta.
Si prefiere no armar el archivo por API, la aplicación web de Fegora ofrece una pantalla de carga guiada — vea Carga masiva (guía de usuario).

Crear un lote: POST /lote

Respuesta

Al crear el lote, Fegora ya valida el archivo y calcula cantidadOperaciones contando las filas no vacías de la columna OPERACION (menos el encabezado). Si el archivo no puede leerse, no tiene hojas, no tiene filas o falta la columna OPERACION, la solicitud falla con 400 y uno de los códigos LOT-INVEXC-2..LOT-INVEXC-5.

Formato del archivo Excel

  • Extensión: .xlsx únicamente. La validación al crear el lote usa una librería que no lee el formato antiguo .xls — un archivo .xls es rechazado con LOT-INVEXC-2 antes de procesarse.
  • La primera fila debe contener los encabezados de columna (nombres exactos, sin distinguir mayúsculas/minúsculas).
  • Cada documento ocupa una fila de encabezado (con la columna OPERACION en CREAR) seguida de una o más filas de detalle (una por ítem, sin valor en OPERACION), hasta la siguiente fila CREAR o hasta 5 filas vacías consecutivas.
TIPO acepta factura, notaCredito, notaDebito y facturaEspecial (sin distinguir mayúsculas/minúsculas), y también los demás tipos de Guatemala que acepta POST /dte — por ejemplo recibo o reciboDonacion (vea Recibos en un lote). Los valores por defecto de la dirección del receptor (CIUDAD, GUATEMALA, código postal 01001, país GT) asumen un emisor guatemalteco.

Columnas de encabezado del documento

Columnas de detalle (una fila por ítem)

Recibos en un lote

La SAT exige que todo recibo (TIPO = recibo) incluya la frase de exención de IVA, y el motivo depende de quién emite — no hay un valor único que Fegora pueda asignar por usted. En un recibo la SAT sólo acepta estos tres: Cualquier otro motivo en un recibo lo rechaza el certificador (FEL_RCP328). Si la celda queda vacía, Fegora usa el motivo por defecto configurado en la cuenta (motivoExencionIva de la información fiscal, aunque la cuenta no esté marcada como exenta). Si la cuenta tampoco tiene uno, esa fila falla con FEG_DTE_CREA_RECI_001 y cuenta como error del lote. Use LINEA_TIPO = servicio (si se omite, el ítem se emite como bien) y deje vacías las columnas LINEA_IMPUESTO_1_*: un recibo no lleva IVA. Para reciboDonacion el motivo se asigna solo, pero el documento necesita el dato adicional TIPO_PERSONERIA (vea Tipos de documento).

Descargar el archivo del lote: GET /lote/{id}/archivo

El archivo subido contiene datos de sus receptores, así que no es público: la archivoUri que devuelve el lote es una referencia interna y no se puede abrir directamente. Para descargar el archivo original use:
Sólo pueden descargarlo los usuarios de la cuenta del lote (o el operador de su canal). Un lote de otra cuenta responde igual que un lote inexistente.

Seguir el estado: GET /lote/{id}

El valor de estado no sigue un catálogo cerrado ni una capitalización consistente en el API actual: al crear el lote se observa "Creado", y el proceso de emisión de Fegora luego lo actualiza a "enProceso" y finalmente "procesado" (minúscula). No existe un estado "Error" propio del lote — un lote puede terminar en "procesado" con cantidadOperacionesError mayor a cero, indicando que algunas filas fallaron aunque el lote en sí ya terminó de procesarse. Compare estado sin distinguir mayúsculas/minúsculas y guíese por los contadores (cantidadOperacionesEjecutadas, cantidadOperacionesError, cantidadOperacionesPendientesEjecucion) para el progreso real, no sólo por el texto de estado.
Mientras cantidadOperacionesPendientesEjecucion sea mayor a cero, siga consultando este endpoint periódicamente hasta que llegue a cero.

Actualizar un lote: PATCH /lote/{id}

Fegora usa esta misma ruta internamente para reportar el avance del procesamiento. Como integrador normalmente sólo necesita leer el lote (GET /lote/{id}), pero la ruta de actualización acepta los mismos campos:
Todos los campos son opcionales — sólo se actualizan los que se envían.

Obtener los resultados por fila

Cuando el lote termina de procesarse, resultadoArchivoUri (si está disponible) apunta a un archivo con el detalle de cada fila, incluidas las que fallaron.

Páginas relacionadas

Carga masiva (guía de usuario)

La misma funcionalidad desde la aplicación web, sin usar el API directamente.

Casos especiales

Plantillas reutilizables, resguardo de XML y otros flujos fuera de la emisión estándar.