Pousser une facture d'achat
Cas d'usage pas à pas pour envoyer une facture d'achat avec son PDF dans l'importateur NovaFisko, la faire analyser, la valider et la comptabiliser.
Vous disposez d'une facture fournisseur au format PDF, image ou XML (UBL, Peppol BIS). Ce guide la dépose dans l'importateur, déclenche l'analyse, puis la valide pour créer le document et son écriture. C'est exactement le parcours de l'onglet Documents de l'application.
Prérequis : un jeton avec les capacités read et write, et le public_token du dossier.
Le cycle de vie d'un import suit ces statuts :
| Statut | Signification |
|---|---|
queued |
Fichier reçu, en attente d'analyse |
analyzing |
Analyse en cours |
ready |
Analyse terminée, données fiables |
needs_review |
Analyse terminée, mais un point demande une vérification |
duplicate |
Le fichier ou la facture existe déjà dans le dossier |
error |
L'analyse a échoué, à relancer |
validated |
Document créé, import terminé |
expanded |
Archive ZIP décompressée en imports enfants |
Étape 1 : déposer le fichier
Le dépôt utilise multipart/form-data. Le champ s'appelle files[] et accepte jusqu'à 20 fichiers de 25 Mo chacun.
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"
| Champ | Obligatoire | Description |
|---|---|---|
files[] |
oui | 1 à 20 fichiers. Extensions : pdf, jpg, jpeg, png, heic, heif, webp, gif, xml, zip |
batch_id |
non | UUID de votre choix pour regrouper plusieurs dépôts. Généré si absent |
Réponse 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
}
]
}
Une archive ZIP produit un import parent au statut expanded et un import par fichier contenu, 50 au maximum. Un fichier dont l'extension n'est pas acceptée fait échouer tout le dépôt avec 422.
Étape 2 : lancer l'analyse
L'analyse est synchrone : l'appel répond quand elle est terminée. Prévoyez un délai d'attente d'au moins 150 secondes côté client.
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
}
Dans extracted, les montants sont des nombres JSON et non des chaînes : ce bloc reflète ce qui a été lu sur la pièce, avant comptabilisation. Les écritures créées ensuite respectent la convention des chaînes décimales.
Si vous n'appelez pas process, un traitement planifié analyse les imports en file chaque minute. Vous pouvez alors simplement interroger la liste :
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"
Un fichier XML UBL est lu directement, sans analyse par intelligence artificielle. Le résultat est immédiat et exact.
Étape 3 (facultative) : corriger les données
Quand le statut est needs_review, lisez warnings : chaque avertissement porte un code (counterparty_missing, date_missing, totals_missing, totals_mismatch...) et un message. Corrigez la fiche sans valider :
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"}}'
Envoyez la fiche extracted complète telle que vous la souhaitez : NovaFisko la renormalise et recalcule les totaux.
Étape 4 : valider et comptabiliser
La validation crée le document, le rattache à un tiers et, avec book: true, passe l'écriture dans le journal des achats.
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
}'
| Champ | Description |
|---|---|
third_party_id |
Tiers existant du dossier. À défaut, le tiers suggéré est repris |
new_third_party |
Crée le tiers à la volée : name obligatoire, puis type, vat_number, enterprise_number, address, postal_code, city, country, iban, bic, email, phone |
direction |
purchase ou sale. Par défaut, le sens détecté |
lines |
Une entrée par ligne de la pièce, dans le même ordre : account_id et vat_code_id. À défaut, les suggestions de l'analyse sont utilisées |
extracted |
Fiche corrigée, si vous n'êtes pas passé par l'étape 3 |
book |
true pour créer aussi l'écriture comptable. false par défaut : le document attend dans l'onglet Documents |
push_to_novadesko |
Envoi du document verrouillé vers Novadesko. Par défaut true uniquement pour un dossier importé de Novadesko |
force |
true pour valider malgré le statut duplicate |
Réponse 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}
}
Avec book: false, entry vaut null et le document reste à comptabiliser.
Variante : saisir directement l'écriture
Si vous possédez déjà les données structurées et n'avez pas besoin de conserver le PDF, passez l'écriture en un seul appel. NovaFisko calcule la TVA et la ligne du tiers.
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"}
]
}'
Le montant de chaque ligne est hors TVA. Le type du journal (purchase ou sale) détermine le sens de l'écriture.
Erreurs fréquentes
| Statut | Cause | Correction |
|---|---|---|
422 à l'étape 1 |
Extension non acceptée ou fichier de plus de 25 Mo | Convertir ou découper le fichier |
422 à l'étape 2 |
Import déjà validé | Rien à faire, lire imported_document_id |
422, champ status à l'étape 4 |
Import pas encore analysé, ou doublon sans force |
Appeler process, ou envoyer force: true après vérification |
422, champ lines.0.account_id |
Compte ou code TVA absent ou étranger au dossier | Fournir un id du dossier |
422, code period_locked |
La date tombe dans une période verrouillée | Voir Périodes |
429 |
Plus de 30 dépôts par minute | Regrouper les fichiers, 20 par dépôt |
Abonnez un webhook aux événements document.imported et document.booked pour être prévenu de la fin d'une analyse et de la comptabilisation, sans interroger la liste.