Conventions
Formats de dates et de montants, identifiants public_token et id numériques, langue des messages et en-têtes reconnus par l'API NovaFisko.
Cette page rassemble les règles communes à toutes les routes. Les respecter évite la plupart des erreurs 422.
Requêtes
- Envoyez
Accept: application/jsonsur chaque appel. L'hôteapi.novafisko.comrépond toujours en JSON, mais cet en-tête garantit le même comportement derrière un proxy. - Les corps sont en JSON (
Content-Type: application/json), encodés en UTF-8. - Le dépôt de fichiers (
document-imports) utilisemultipart/form-data. - Les noms de champs sont en anglais et en
snake_case. Les segments d'URL sont enkebab-case(third-parties,vat-declarations).
Dates et heures
| Nature | Format | Exemple |
|---|---|---|
Date comptable (entry_date, due_date, starts_on, from, to) |
AAAA-MM-JJ |
2026-03-31 |
Horodatage (created_at, posted_at, server_time) |
ISO 8601 avec fuseau, en UTC | 2026-10-05T08:30:11+00:00 |
| Mois de facturation | AAAA-MM |
2026-10 |
Une date comptable n'a pas de fuseau : le 31 mars reste le 31 mars quel que soit l'endroit d'où vous appelez. Les horodatages sont stockés et renvoyés en UTC. Convertissez-les dans le fuseau de votre utilisateur au moment de l'affichage.
Dans les réponses, une date comptable d'un modèle peut apparaître sous la forme longue 2026-03-31T00:00:00.000000Z. Ne retenez que les dix premiers caractères. En entrée, envoyez toujours AAAA-MM-JJ.
Montants
Les montants sont exprimés en euros, sous forme de chaînes décimales avec un point et deux décimales : "1250.00", "0.21", "-48.40".
{
"debit": "1250.00",
"credit": "0.00",
"balance": "1250.00"
}
Ce choix évite les erreurs d'arrondi des nombres flottants. Dans votre code, utilisez un type décimal (BigDecimal, decimal, Decimal, bcmath) ou travaillez en centimes entiers.
En entrée, l'API accepte aussi bien "1250.00" que 1250 ou 1250.5. Elle convertit tout en centimes avant de calculer. Nous recommandons d'envoyer des chaînes.
Quelques réponses de gestion (licence, grille tarifaire, simulateur) renvoient des nombres JSON, par exemple "total": 149.0. Ce sont des montants commerciaux, pas des montants comptables. Tous les états comptables (balance, grand livre, écritures, TVA) utilisent des chaînes.
Une écriture doit être équilibrée au centime près : la somme des débits égale la somme des crédits, sinon la requête est refusée avec 422.
Identifiants
NovaFisko utilise deux familles d'identifiants.
| Ressource | Identifiant dans l'URL | Forme | Exemple |
|---|---|---|---|
Cabinet (firm) |
public_token |
12 caractères alphanumériques | Fd7hQ2mN8sXa |
Dossier (company) |
public_token |
12 caractères alphanumériques | k3Jd9fPq2LmX |
| Tout ce qui vit dans un dossier (écriture, tiers, compte, journal, document, exercice...) | id numérique |
entier | 1842 |
Le public_token est opaque, stable et non devinable. C'est lui que vous devez stocker pour désigner un cabinet ou un dossier. Les id numériques n'ont de sens qu'à l'intérieur de leur dossier : une route companies/{company}/entries/{id} répond 404 si l'écriture appartient à un autre dossier.
/v1/companies/k3Jd9fPq2LmX/entries/1842
└─ public_token └─ id
Certains champs acceptent une forme lisible à la place de l'id. Dans une écriture, par exemple, une ligne peut désigner son compte par account_id (entier) ou par account (numéro de compte, "604000"). De même, une ligne de facture accepte vat_code_id ou vat_code.
Données importées
Les enregistrements issus d'une autre source portent trois champs : source (par exemple novadesko), external_id (l'identifiant dans la source) et synced_at. Servez-vous de external_id pour retrouver un enregistrement que vous avez vous-même poussé.
Version d'un enregistrement
Les ressources suivies par l'historique exposent un entier version qui augmente à chaque modification. Renvoyez-le dans X-Base-Version pour activer le verrou optimiste décrit dans Idempotence.
Langue des messages
Les libellés et messages d'erreur existent en français, néerlandais, anglais et allemand. La langue est choisie ainsi :
- le paramètre de requête
locale(routes d'historique, de corbeille et de synchronisation) oulang(exports, licence) quand il est fourni ; - sinon la langue du profil de l'utilisateur propriétaire du jeton ;
- sinon l'en-tête
Accept-Language; - sinon la langue par défaut de la plateforme.
GET /v1/firms/Fd7hQ2mN8sXa/licence?lang=nl HTTP/1.1
Accept-Language: nl-BE,nl;q=0.9,fr;q=0.6
Ne faites jamais dépendre votre logique du texte de message, qui varie selon la langue. Appuyez-vous sur le statut HTTP et sur le champ code.
En-têtes de requête
| En-tête | Rôle |
|---|---|
Authorization |
Bearer <jeton> |
Accept |
application/json |
Accept-Language |
Langue souhaitée pour les messages |
X-Client-Mutation-Id |
Clé d'idempotence d'une écriture, 64 caractères max. Voir Idempotence |
X-Base-Version |
Version connue de l'enregistrement modifié (verrou optimiste) |
X-Operation-Id |
UUID qui regroupe tous les changements d'une même action. Généré par le serveur s'il est absent |
X-Device-Id |
Identifiant stable de l'installation ou du connecteur, 64 caractères max |
X-Device-Name |
Nom lisible de l'appareil, encodé en pourcentage, 120 caractères max |
X-Device-Platform |
Plateforme (web, macos, linux, integration...) |
X-Occurred-At |
Date ISO 8601 de l'action côté client, bornée à plus ou moins 24 heures autour de l'heure serveur |
X-Origin |
offline_sync quand la requête rejoue une action faite hors ligne |
Les en-têtes X-Device-* sont facultatifs mais utiles : ils apparaissent dans l'onglet Historique, ce qui permet à un comptable de voir qu'une modification vient de votre connecteur.
curl -X POST https://api.novafisko.com/v1/companies/k3Jd9fPq2LmX/third-parties \
-H "Authorization: Bearer $NOVAFISKO_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Device-Id: erp-atelier-prod" \
-H "X-Device-Name: ERP%20Atelier" \
-H "X-Client-Mutation-Id: 6f1c2f0e-7a53-4f0b-9c58-0b8a4a7c2d11" \
-d '{"type": "supplier", "name": "Brasserie des Collines SA", "vat_number": "BE0999900134"}'
En-têtes de réponse
| En-tête | Signification |
|---|---|
X-Operation-Id |
Identifiant de l'opération quand quelque chose a été historisé. Il sert au retour en arrière : POST history/operations/{operation}/revert |
X-Trashed: 1 |
Le DELETE a placé l'enregistrement dans la corbeille au lieu de le détruire. Il reste restaurable |
X-Idempotent-Replay: 1 |
La réponse est le résultat mémorisé d'une requête déjà exécutée |
X-Export-Fingerprint |
Empreinte SHA-256 du jeu de données exporté |
Content-Disposition |
Nom du fichier pour les exports |
Retry-After |
Délai en secondes avant de réessayer après un 429 |
Suppressions
Une suppression ne détruit presque jamais rien immédiatement :
- un tiers, un compte, un journal, une règle ou une immobilisation part à la corbeille (
X-Trashed: 1) et peut être restauré pendant la durée de rétention du dossier, 90 jours par défaut ; - une écriture validée ne se supprime pas : elle s'extourne avec
POST entries/{id}/reverse, ce qui préserve la numérotation continue.