Een aankoopfactuur doorsturen
Use case stap voor stap om een aankoopfactuur met haar pdf naar de importmodule van NovaFisko te sturen, te laten analyseren, te valideren en te boeken.
U beschikt over een leveranciersfactuur in PDF-, afbeeldings- of XML-formaat (UBL, Peppol BIS). Deze gids uploadt ze naar de importmodule, start de analyse en valideert ze daarna om het document en zijn boeking aan te maken. Het is exact het traject van het tabblad Documenten van de applicatie.
Vereisten: een token met de bevoegdheden read en write, en de public_token van het dossier.
De levenscyclus van een import volgt deze statussen:
| Status | Betekenis |
|---|---|
queued |
Bestand ontvangen, in afwachting van analyse |
analyzing |
Analyse bezig |
ready |
Analyse voltooid, betrouwbare gegevens |
needs_review |
Analyse voltooid, maar één punt vraagt een controle |
duplicate |
Het bestand of de factuur bestaat al in het dossier |
error |
De analyse is mislukt, opnieuw te starten |
validated |
Document aangemaakt, import voltooid |
expanded |
ZIP-archief uitgepakt in onderliggende imports |
Stap 1: het bestand uploaden
De upload gebruikt multipart/form-data. Het veld heet files[] en aanvaardt tot 20 bestanden van elk 25 MB.
curl -X POST https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/document-imports \
-H "Authorization: Bearer $NOVAFISKO_TOKEN" \
-H "Accept: application/json" \
-H "X-Client-Mutation-Id: 9a7d1a0c-2b1f-4d0e-bb0d-6d5a3d7f2c41" \
-F "files[]=@/chemin/vers/F-2026-0918.pdf" \
-F "batch_id=3f5c2b9e-8f0a-4f6a-9a0e-1b7b2a6f4c10"
| Veld | Verplicht | Beschrijving |
|---|---|---|
files[] |
ja | 1 tot 20 bestanden. Extensies: pdf, jpg, jpeg, png, heic, heif, webp, gif, xml, zip |
batch_id |
nee | UUID naar keuze om meerdere uploads te groeperen. Gegenereerd als het ontbreekt |
Antwoord 201:
{
"batch_id": "3f5c2b9e-8f0a-4f6a-9a0e-1b7b2a6f4c10",
"imports": [
{
"id": 5120,
"company_id": 318,
"batch_id": "3f5c2b9e-8f0a-4f6a-9a0e-1b7b2a6f4c10",
"original_name": "F-2026-0918.pdf",
"mime": "application/pdf",
"size": 84213,
"kind": "pdf",
"status": "queued",
"progress": 0,
"extracted": null,
"warnings": null,
"file_url": "https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/document-imports/5120/file?expires=1791190000&preview=1&signature=...",
"has_preview": false,
"version": 1
}
]
}
Een ZIP-archief levert een bovenliggende import op met de status expanded en één import per bestand in het archief, maximaal 50. Een bestand waarvan de extensie niet wordt aanvaard, doet de volledige upload mislukken met 422.
Stap 2: de analyse starten
De analyse is synchroon: de aanroep antwoordt wanneer ze voltooid is. Voorzie aan clientzijde een time-out van minstens 150 seconden.
curl -X POST https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/document-imports/5120/process \
-H "Authorization: Bearer $NOVAFISKO_TOKEN" \
-H "Accept: application/json" \
--max-time 180
{
"id": 5120,
"original_name": "F-2026-0918.pdf",
"kind": "pdf",
"status": "ready",
"progress": 100,
"step": "done",
"engine": "api",
"suggested_direction": "purchase",
"suggested_third_party_id": 41,
"suggested_third_party": {"id": 41, "code": "BRASSCOL", "name": "Brasserie des Collines SA", "type": "supplier", "vat_number": "BE0999900134"},
"extracted": {
"document_type": "invoice",
"direction": "purchase",
"counterparty": {
"name": "Brasserie des Collines SA",
"vat_number": "BE0999900134",
"iban": "BE71096123456769",
"bic": "GKCCBEBB"
},
"number": "F-2026-0918",
"date": "2026-10-02",
"due_date": "2026-11-01",
"structured_communication": "+++091/8202/60018+++",
"currency": "EUR",
"lines": [
{"description": "Fûts 20 L blonde", "quantity": 10, "unit_price": 125, "vat_rate": 21, "amount_net": 1250, "amount_vat": 262.5, "amount_gross": 1512.5}
],
"totals": {"net": 1250, "vat": 262.5, "gross": 1512.5, "vat_breakdown": [{"rate": 21, "base": 1250, "amount": 262.5}]},
"payment": {"iban": "BE71096123456769", "bic": "GKCCBEBB", "paid": false},
"nature": null,
"confidence": 0.94,
"language": "fr"
},
"warnings": [],
"error": null,
"duplicate_of_import_id": null,
"duplicate_of_document_id": null,
"imported_document_id": null,
"file_url": "https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/document-imports/5120/file?expires=...&signature=...",
"has_preview": false
}
In extracted zijn de bedragen JSON-getallen en geen strings: dit blok geeft weer wat op het stuk is gelezen, vóór de boeking. De boekingen die daarna worden aangemaakt, volgen de conventie van de decimale strings.
Als u process niet aanroept, analyseert een ingeplande verwerking elke minuut de imports in de wachtrij. U kunt dan gewoon de lijst bevragen:
curl "https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/document-imports?batch_id=3f5c2b9e-8f0a-4f6a-9a0e-1b7b2a6f4c10&status=ready,needs_review,error,duplicate" \
-H "Authorization: Bearer $NOVAFISKO_TOKEN"
Een UBL-XML-bestand wordt rechtstreeks gelezen, zonder analyse door artificiële intelligentie. Het resultaat is onmiddellijk en exact.
Stap 3 (optioneel): de gegevens corrigeren
Wanneer de status needs_review is, leest u warnings: elke waarschuwing draagt een code (counterparty_missing, date_missing, totals_missing, totals_mismatch...) en een message. Corrigeer de fiche zonder te valideren:
curl -X PATCH https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/document-imports/5120 \
-H "Authorization: Bearer $NOVAFISKO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"extracted": {"number": "F-2026-0918", "date": "2026-10-02", "due_date": "2026-11-01"}}'
Stuur de volledige fiche extracted zoals u ze wenst: NovaFisko normaliseert ze opnieuw en herberekent de totalen.
Stap 4: valideren en boeken
De validatie maakt het document aan, koppelt het aan een derde en boekt, met book: true, de boeking in het aankoopdagboek.
curl -X POST https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/document-imports/5120/validate \
-H "Authorization: Bearer $NOVAFISKO_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Client-Mutation-Id: 1c7f5e2a-90c4-4a55-8f0b-5f6e6a3d9b72" \
-d '{
"direction": "purchase",
"third_party_id": 41,
"lines": [{"account_id": 118, "vat_code_id": 12}],
"book": true,
"push_to_novadesko": false
}'
| Veld | Beschrijving |
|---|---|
third_party_id |
Bestaande derde van het dossier. Bij ontbreken wordt de voorgestelde derde overgenomen |
new_third_party |
Maakt de derde meteen aan: name verplicht, daarna type, vat_number, enterprise_number, address, postal_code, city, country, iban, bic, email, phone |
direction |
purchase of sale. Standaard de gedetecteerde richting |
lines |
Eén vermelding per lijn van het stuk, in dezelfde volgorde: account_id en vat_code_id. Bij ontbreken worden de suggesties van de analyse gebruikt |
extracted |
Gecorrigeerde fiche, als u stap 3 hebt overgeslagen |
book |
true om ook de boeking aan te maken. Standaard false: het document wacht in het tabblad Documenten |
push_to_novadesko |
Verzending van het vergrendelde document naar Novadesko. Standaard true, alleen voor een dossier dat uit Novadesko is geïmporteerd |
force |
true om te valideren ondanks de status duplicate |
Antwoord 201:
{
"import": {"id": 5120, "status": "validated", "imported_document_id": 7741, "progress": 100},
"document": {
"id": 7741,
"type": "purchases",
"direction": "purchase",
"number": "F-2026-0918",
"document_date": "2026-10-02T00:00:00.000000Z",
"status": "booked",
"third_party": {"id": 41, "name": "Brasserie des Collines SA", "type": "supplier", "code": "BRASSCOL"},
"lines": [
{
"id": 19022,
"description": "Fûts 20 L blonde",
"actual_account": {"id": 118, "number": "604000", "label": "Achats de marchandises"},
"vat_code": {"id": 12, "code": "A21", "rate": "21.00"}
}
]
},
"entry": {
"id": 1842,
"number": 212,
"entry_date": "2026-10-02T00:00:00.000000Z",
"reference": "F-2026-0918",
"status": "posted",
"journal": {"id": 3, "code": "ACH"},
"lines": [
{"id": 5521, "debit": "1250.00", "credit": "0.00", "account": {"id": 118, "number": "604000", "label": "Achats de marchandises"}},
{"id": 5522, "debit": "262.50", "credit": "0.00", "account": {"id": 77, "number": "411000", "label": "TVA à récupérer"}},
{"id": 5523, "debit": "0.00", "credit": "1512.50", "account": {"id": 90, "number": "440000", "label": "Fournisseurs"}}
]
},
"novadesko": {"status": "skipped", "document_id": null, "token": null, "locked": false, "error": null, "message": null}
}
Met book: false heeft entry de waarde null en blijft het document te boeken.
Variant: de boeking rechtstreeks invoeren
Als u de gestructureerde gegevens al hebt en de pdf niet hoeft te bewaren, boekt u met één enkele aanroep. NovaFisko berekent de btw en de lijn van de derde.
curl -X POST https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/entries/invoice \
-H "Authorization: Bearer $NOVAFISKO_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Client-Mutation-Id: 0b0f7a52-63f4-4f1f-8a43-0d4f6b0b8a10" \
-d '{
"journal_id": 3,
"third_party_id": 41,
"entry_date": "2026-10-02",
"due_date": "2026-11-01",
"reference": "F-2026-0918",
"lines": [
{"account": "604000", "amount": "1250.00", "vat_code": "A21", "label": "Fûts 20 L blonde"}
]
}'
Het bedrag van elke lijn is exclusief btw. Het type van het dagboek (purchase of sale) bepaalt de richting van de boeking.
Veelvoorkomende fouten
| Status | Oorzaak | Oplossing |
|---|---|---|
422 in stap 1 |
Extensie niet aanvaard of bestand groter dan 25 MB | Het bestand converteren of opsplitsen |
422 in stap 2 |
Import al gevalideerd | Niets te doen, imported_document_id lezen |
422, veld status in stap 4 |
Import nog niet geanalyseerd, of duplicaat zonder force |
process aanroepen, of na controle force: true versturen |
422, veld lines.0.account_id |
Rekening of btw-code ontbreekt of hoort niet bij het dossier | Een id van het dossier opgeven |
422, code period_locked |
De datum valt in een vergrendelde periode | Zie Periodes |
429 |
Meer dan 30 uploads per minuut | De bestanden groeperen, 20 per upload |
Abonneer een webhook op de gebeurtenissen document.imported en document.booked om op de hoogte te worden gebracht van het einde van een analyse en van de boeking, zonder de lijst te bevragen.