Exportació i importació
Exporta factures a un full de càlcul Excel/CSV (SUMMARY o ITEMS, amb límit de 5000) i importa clients des d'un CSV amb previsualització dry-run, mapatge de columnes, plantilla descarregable i partial-success.
L'API pública mou dades dins i fora de Factuarea amb dues operacions basades en fitxer: exportar factures a un full de càlcul i importar clients des d'un CSV. Totes dues reutilitzen els mateixos motors que el tauler, i la importació segueix el contracte partial-success: una fila errònia mai enfonsa el fitxer sencer.
Exportar factures a un full de càlcul
POST /v1/invoices/export/excel (scope invoices:read) genera un full XLSX o
CSV de les teves factures i retorna el fitxer binari. És una operació de
lectura: no crea ni modifica res.
Dos eixos ortogonals controlen la sortida:
| Paràmetre | Valors | Significat |
|---|---|---|
format | SUMMARY (per defecte) · ITEMS | Disposició del contingut. SUMMARY és una fila per factura; ITEMS és una fila per línia de factura (les columnes de capçalera es repeteixen a cada línia). |
file_format | xlsx (per defecte) · csv | Format de fitxer. |
Tria les factures a exportar de dues maneres:
- Per id — passa
invoice_idsamb els ids UUID v7 de factures concretes. - Per filtre — omet
invoice_idsi acota el conjunt ambstatus,date_from,date_to,client_id,series_idisearch.date_fromidate_tofiltren per data d'emissió (totes dues incloses);client_idiseries_idprenen l'UUID v7 públic del client/sèrie.
curl -s -X POST https://api.factuarea.com/v1/invoices/export/excel \
-H "Authorization: Bearer $FACTUAREA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"format": "ITEMS",
"file_format": "xlsx",
"status": "paid",
"date_from": "2026-01-01",
"date_to": "2026-03-31"
}' \
-o factures-t1.xlsxEl límit de 5000 factures
El conjunt seleccionat té un límit de 5000 factures. Si els teus filtres
coincideixen amb més, l'API no trunca de manera silenciosa: retorna 422
amb el codi d'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 rang de dates, l'estat o el client, o divideix l'exportació en diverses crides, perquè cada petició quedi per sota del límit.
client_id, series_id i les entrades de invoice_ids es resolen dins de
la teva empresa. Un UUID inexistent o d'una altra empresa simplement es
descarta de la selecció: mai filtra dades entre empreses ni retorna un 404
global.
Importar clients des d'un CSV
POST /v1/clients/import (scope clients:write) llegeix un fitxer delimitat i
crea un client per cada fila vàlida. La petició és multipart/form-data
—porta un fitxer, no un cos JSON— amb tres camps:
| Camp | Tipus | Significat |
|---|---|---|
file | fitxer | El fitxer CSV/XLSX/XLS/ODS/TXT, fins a 10 MB. |
mapping | objecte | { "capçalera_csv": "camp_destí" }. Ha de mapejar com a mínim name i tax_id. |
dry_run | booleà | Si és true, valida i previsualitza sense crear res. Per defecte false. |
El mapping indica a l'importador quina columna del full alimenta cada camp del
client. El conjunt de destí ha d'incloure name i tax_id: sense ells no es
pot crear un client i la petició es rebutja amb 422 abans de processar cap
fila.
Descarregar la plantilla
GET /v1/clients/import/template retorna un CSV a punt per omplir (UTF-8 amb BOM
perquè Excel l'obri bé) la fila de capçalera del qual llista totes les columnes
que entén l'importador: Nombre, NIF/CIF, Razón social, Email,
Teléfono, camps d'adreça, IVA/retenció per defecte, IBAN i més. Dues files
d'exemple mostren el format esperat.
curl -s https://api.factuarea.com/v1/clients/import/template \
-H "Authorization: Bearer $FACTUAREA_API_KEY" \
-o plantilla-clients.csvPrimer dry run, després importar
Valida sempre amb dry_run=true abans de confirmar. La previsualització retorna
un informe per fila i no escriu res:
curl -s -X POST https://api.factuarea.com/v1/clients/import \
-H "Authorization: Bearer $FACTUAREA_API_KEY" \
-F "file=@clients.csv" \
-F 'mapping={"Nombre":"name","NIF/CIF":"tax_id","Email":"email"};type=application/json' \
-F "dry_run=true"{
"data": {
"object": "client_import_preview",
"total_rows": 3,
"rows": [
{ "row": 2, "status": "valid", "errors": [], "warnings": [] },
{
"row": 3,
"status": "error",
"errors": [{ "param": "tax_id", "code": "invalid_tax_id", "message": "El NIF no es válido." }],
"warnings": []
},
{ "row": 4, "status": "valid", "errors": [], "warnings": [] }
]
}
}row és el número de línia (en base 1) al fitxer (la capçalera és la fila 1,
així que la primera fila de dades és la 2). status és valid o error; cada
ítem de errors[] porta el param afectat, un code estable i un message en
castellà.
Quan la previsualització està neta, reenvia el mateix fitxer i mapatge amb
dry_run=false (o omet-lo). Només es creen les files vàlides; les rebutjades
tornen a failures[], i la resposta segueix la forma partial-success amb un
results[] per fila:
{
"data": {
"total": 3,
"successful": 2,
"failed": 1,
"failures": [
{
"index": 1,
"error_code": "invalid_tax_id",
"error_message": "El NIF no es válido.",
"errors": [{ "param": "tax_id", "code": "invalid_tax_id", "message": "El NIF no es válido." }],
"warnings": []
}
],
"results": [
{ "row": 3, "status": "error", "errors": [{ "param": "tax_id", "code": "invalid_tax_id", "message": "El NIF no es válido." }], "warnings": [] }
]
}
}Sempre es compleix total === successful + failed. Una fila duplicada (un
client ja existent, segons la regla de deduplicació) s'omet (skipped), no
falla: compta com a successful i no es torna a crear, així que reexecutar el
mateix fitxer és segur.
Ramifica per error_code / code, mai pel missatge: el missatge és text en
castellà, orientat a persones. Els codis per fila surten del catàleg d'errors
v1.
Límit de mida de fitxer
La importació v1 és síncrona per poder retornar el resultat per fila en la
mateixa resposta. Els fitxers tenen un límit de menys de 200 files; un
fitxer més gran es rebutja amb 422 i el codi client_import_too_large.
Divideix una llista gran en lots per sota del límit i importa'ls en seqüència.
Els rebutjos de file (10 MB) i dry_run, i els límits de 5000/200,
s'apliquen abans d'escriure cap fila. La previsualització dry-run és la manera
més barata de caçar files malformades: fes-la servir abans de cada importació
real.