Exportación e importación
Exporta facturas a XLSX o CSV e importa contactos unificados con roles explícitos, mapeo de campos y previsualización.
Exporta facturas a una hoja de cálculo e importa contactos con roles acumulables de cliente, proveedor y lead. Cada operación de archivos usa su propio contrato de respuesta; revisa la previsualización antes de escribir.
Exportar facturas a una hoja de cálculo
POST /v1/invoices/export/excel (scope invoices:read) genera una hoja XLSX o
CSV de tus facturas y devuelve el fichero binario. Es una operación de
lectura en el dominio: no crea ni modifica nada. El POST exige
Idempotency-Key porque sí consume recursos de generación de ficheros.
Dos ejes ortogonales controlan la salida:
| Parámetro | Valores | Significado |
|---|---|---|
format | SUMMARY (por defecto) · ITEMS | Layout de contenido. SUMMARY es una fila por factura; ITEMS es una fila por línea de factura (las columnas de cabecera se repiten en cada línea). |
file_format | xlsx (por defecto) · csv | Formato de fichero. |
Elige las facturas a exportar de dos maneras:
- Por id — pasa
invoice_idscon los ids UUID v7 de facturas concretas. - Por filtro — omite
invoice_idsy acota el conjunto constatus,date_from,date_to,client_id,series_idysearch.date_fromydate_tofiltran por fecha de emisión (ambas incluidas);client_idyseries_idtoman el UUID v7 público del cliente/serie.
curl -s -X POST https://api.factuarea.com/v1/invoices/export/excel \
-H "Authorization: Bearer $FACTUAREA_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"format": "ITEMS",
"file_format": "xlsx",
"status": "paid",
"date_from": "2026-01-01",
"date_to": "2026-03-31"
}' \
-o facturas-t1.xlsxEl tope de 5000 facturas
El conjunto seleccionado tiene un tope de 5000 facturas. Si tus filtros
casan con más, la API no trunca de forma silenciosa: devuelve 422 con el
código de error export_limit_exceeded:
{
"error": {
"type": "invalid_request_error",
"code": "export_limit_exceeded",
"message": "La exportación supera el máximo de 5000 facturas."
}
}Acota el rango de fechas, el estado o el cliente, o divide la exportación en varias llamadas, para que cada petición quede por debajo del tope.
Topes y presupuesto de empaquetado
Una exportación también puede fallar antes de servir el fichero:
| Estado / code | Significado | Qué hacer |
|---|---|---|
413 export_document_cap_exceeded | El artefacto solicitado abarca demasiados documentos. | Divide por fechas, serie o lotes de ids. |
413 export_byte_cap_exceeded | El archivo estimado o real supera su tope de bytes. subcode vale before_writing o while_writing; nunca se sirve un fichero parcial. | Pide menos documentos por llamada. |
429 export_budget_exceeded | Se agotó el presupuesto horario de empaquetado de la empresa. subcode identifica el eje de documentos o artefactos. | Respeta Retry-After; cambiar de API key no esquiva un presupuesto de empresa. |
Un rechazo por tope, un periodo vacío y un empaquetado abortado no consumen presupuesto de exportación. Volver a descargar un artefacto ya materializado tampoco.
client_id, series_id y las entradas de invoice_ids se resuelven
dentro de tu empresa. Un UUID inexistente o de otra empresa simplemente
se descarta de la selección: nunca filtra datos entre empresas ni devuelve un
404 global.
Importar contactos desde un archivo
Usa POST /v1/contacts/import/preview antes de POST /v1/contacts/import. Ambos requieren contacts:write, Idempotency-Key y multipart/form-data. El importador admite archivos CSV, TXT, XLSX o XLS de hasta 10 MB.
Mapeo y roles
mapping asocia campo destino → cabecera de la columna de origen, por ejemplo mapping[name]=Name. Omítelo si las cabeceras ya usan los nombres canónicos. Los destinos desconocidos se rechazan; no se descartan en silencio. Incluye name, una identidad fiscal válida y al menos un rol, indicado en el archivo o mediante target_roles.
La vista previa también devuelve source_headers, los nombres originales de las columnas leídas del CSV, TXT, XLSX o XLS. Para descubrir las columnas antes de preparar el mapeo, envía el archivo al mismo endpoint de vista previa omitiendo mapping. Usa source_headers para asociar cada campo de destino con su columna y vuelve a previsualizar. Las filas pueden aparecer como invalid hasta mapear los campos obligatorios; descubrir columnas nunca escribe contactos.
curl -X POST https://api.factuarea.com/v1/contacts/import/preview \
-H "Authorization: Bearer $FACTUAREA_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-F "file=@contacts.csv" \
-F "mapping[name]=Name" \
-F "mapping[tax_id]=VAT number" \
-F "mapping[external_id]=Id" \
-F "target_roles[]=customer" \
-F "conflict_strategy=reject"Previsualiza y después importa
La previsualización clasifica cada fila como create, update, add_role, merge_candidate, conflict o invalid. Revisa errors, warnings y target_uuid; resuelve las identidades ambiguas antes de importar. La respuesta incluye total, recuentos por acción, dry_run y queued, en lugar del envoltorio del importador antiguo de clientes.
Envía el archivo revisado y el mismo mapeo a /v1/contacts/import, con una idempotency key nueva. dry_run=true también valida sin escribir. El valor predeterminado conflict_strategy=reject protege los datos existentes; elige update o merge deliberadamente tras revisar la previsualización. Las importaciones grandes pueden devolver 202 con queued=true: la aceptación no demuestra que todas las filas hayan terminado.
Datos de contacto admitidos
El importador canónico admite external_id, kind, roles, tags, dirección (address_line_1, country_code), identidad fiscal alternativa, billing_emails, bank_accounts, metadata, códigos DIR3 y valores por rol (customer_*, supplier_*). Mapea solo las columnas que quieras escribir. Conserva ambos roles si un contacto compra y vende; nunca dividas su identidad fiscal en registros duplicados.
Formatos de descarga y alcance público
Descarga la plantilla CSV canónica con GET /v1/contacts/import/template y mapea sus columnas de forma explícita al previsualizar e importar. Esta descarga binaria está disponible por REST y no tiene tool MCP. FacturaE devuelve XML; las descargas CSV/PDF/XLSX/ZIP devuelven bytes. Las respuestas 204 y 304 no tienen body. Usa solo las operaciones de la Referencia API vigente.